【问题标题】:Read Config File Line By Line in Kernel在内核中逐行读取配置文件
【发布时间】:2016-07-12 03:27:18
【问题描述】:

我正在尝试为我正在工作的模块读取配置文件(位于/生成在内核中的特定位置)。

我可以通过使用带有 O_RDONLY 标志(只读)的 filp_open 来读取整个文件,但我想不出一种逐行读取它的方法。

当前代码

f = filp_open("/etc/my_module",O_RDONLY, 0);

if ( f==NULL) {
    printk("Error in loading config for birdge.\n");
    return 1;
} else {
    fs = get_fs();
    set_fs(get_ds());

    /* read line config here */
    f->f_op->read(f, buf, 128, &f->f_pos);

    set_fs(fs);
    printk("buf:%s\n",buf);
}

Linux 内核版本:3.8.0-29-generic

我想要实现的是将每一(nth)行放入缓冲区数组(char *buf[128][128]),稍后我将使用纯 c 将参数和值分块。

通过这种方式,配置文件中的变量可以在模块的运行时使用,当然我会做一些条件检查配置是否正常。

谢谢

【问题讨论】:

  • 不,这完全是错误的做法。
  • 您应该阅读如何提问。这是一个可怕的问题。
  • 要获得配置复杂事物的灵感,请查看内核如何配置网络、路由和防火墙。
  • 你没有说它是哪个内核,我想@ZanLynx 假设它是 linux 的内核。您没有解释为什么它失败以及为什么不能使用fgetc() 或任何标准函数。
  • 是的,这是我的假问题。实际上 fgetc() 并没有失败 iharob。我只是不能在内核空间中使用它,因为它来自 c 的 stdlib。我要问的是内核中的那个函数的等价物。是的,这是 Linux 内核,更具体地说是 3.18.xx。我正在检查 linux 如何根据 Zan 的建议配置网络。感谢伙伴的积极评价。

标签: c kernel


【解决方案1】:

在内核中解析配置文件既麻烦又危险。不要那样做。

如果您的内核模块需要配置,这通常通过在模块加载时传递参数来完成,例如insmod example.ko foo=123。您可以使用 module_param 宏在模块中声明这些参数。 the Linux Kernel Module Programming Guide 中提供了有关如何执行此操作的信息。

如果您的模块需要比使用模块参数更复杂的配置,则您的模块可能适合在 sysfs 中为此配置创建端点。请注意,这都意味着您的模块很可能需要用户空间帮助脚本来配置它。 这是正常的,没问题。在用户空间中编写此脚本将比在内核中运行更简单、更安全。

【讨论】:

    【解决方案2】:

    [TL;DR:避免直接从内核空间读取文件系统文件。]

    你已经差不多完成了。

    您当前唯一需要的是使用kcalloc() 分配一个字符串数组(类似于libc calloc(),带有一个额外的参数,您可以将[为了示例]设置为GFP_KERNEL),然后使用f->f_op->read(f, &chr, 1, &f->f_pos); 循环文件(逐字符读取,类似于libc read(f, &chr, 1)...您可以稍后通过以块读取文件并处理块来优化它以避免内核空间中的大量读取)。

    这将为您提供与内核态下的fgetc() 类似的方法,以及为您的char *buf[] 数组提供与calloc() 类似的接口。

    您也可以实现自己的(优化不佳的)kfgetc(),例如:

    int kfgetc(struct file *f) {
       char chr = 0;
    
       f->f_op->read(f, &chr, 1, &f->f_pos);
    
       return chr;
    }
    

    通过这个示例,您可以轻松创建kfgets()(只需循环使用kfgetc(),直到找到“\n”或没有其他内容可读取)。

    请注意,总的来说,您正在做的事情似乎不是一个好习惯(老实说,这是一个非常糟糕的主意),但把它放在一边(因为我不知道你为什么重新做),以上是让它工作的一个好的开始。当它开始工作时,看看你可以在哪里优化它(还可以看看其他内核组件如何检索配置,如@ZanLynx 所述)。

    其他一些对您的情况有用的内存分配器(因为如果您不知道文件中有多少行,kcalloc() 可能无法解决您的问题):kmalloc()krealloc()(类似于 libc @987654335 @ 和 realloc())。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-25
      • 2019-05-01
      • 1970-01-01
      • 2011-06-15
      • 2010-12-24
      • 2016-02-04
      • 2019-04-16
      • 2012-02-04
      相关资源
      最近更新 更多