【问题标题】:Setting kernel tunable parameter设置内核可调参数
【发布时间】:2016-09-30 07:26:38
【问题描述】:

因为我想引入新的内核模块参数说 new_param=1 /0 ,然后必须在内核代码中检查该参数为 如果(新参数==1) 做一些工作..... 别的 做其他...

这样我想通过引入新的内核模块参数来检查。有人可以帮我吗?我需要遵循哪些步骤来执行此操作?

【问题讨论】:

  • 你的问题我不清楚。您只是想将另一个变量添加到可以在该特定文件中访问的某个内核文件,还是希望能够从多个文件中访问它?如果是前者,您可以像往常一样简单地添加变量——在标题中或在源本身的适当范围内。修改内核代码后,只需通过make、任何必要的模块(make modules_install)以及最后make install 编译内核。启动到您修改后的内核并享受乐趣。
  • 我必须为应用程序引入一个内核可调参数,例如,一旦安装了该应用程序,手动设置一个内核可调参数 ex_param=1。设置后,我想在一个内核源代码中检查该参数如,如果该参数说 if( ex_param==1) 做一些动作,否则做一些动作......如何实现这一点?
  • 哦,我相信我误会了。您想添加要从内核命令行使用的参数,对吗?
  • 是的,我想在一个内核源代码中使用该参数来检查它是否设置正确?我该怎么做?

标签: linux-kernel kernel


【解决方案1】:

使用自定义内核参数的一种方法是将其添加到内核命令行并从 /proc/cmdline 中解析出来,即:

将参数添加到内核命令行 BOOT_IMAGE=<image> root=<root> ro quiet splash vt.handoff=7 your_parameter=<value>

开机时,通过解析/proc/cmdline的内容就可以访问这个参数了:

$ cat /proc/cmdline
BOOT_IMAGE=<image> root=<root> ro quiet splash vt.handoff=7 your_parameter=<value>

我相信更适合您需求的解决方案包括使用__setup()/Documentation/kernel-parameters.txt 中提到(但没有很好地解释)。

内核源码中有很多例子。其中之一是 /drivers/block/brd.c:

#ifndef MODULE
/* Legacy boot options - nonmodular */
static int __init ramdisk_size(char *str)
{
        rd_size = simple_strtol(str, NULL, 0);
        return 1;
}
__setup("ramdisk_size=", ramdisk_size);
#endif

按照此示例,您可以在相关源文件中添加您的 __init 和 __setup()。要从 __init 函数中的选项字符串解析整数,请参阅 /lib/cmdline.c 中的 get_option()

更新

对于模块,您应该使用module_param(),它接受三个参数:变量名、变量类型、sysfs 权限。有关该课程的更多信息,请访问/linux/moduleparam.h

在您希望能够向其传递参数的模块中,首先将参数声明为全局变量。示例用法将在模块源中包含以下内容:

int foo = 200;
module_param(foo, int, 0);

重新编译模块,你会看到可以通过modprobe &lt;module-name&gt; foo=40加载它。

【讨论】:

  • 感谢您的回复。这样做之后,当我通过 modprobe module parameter= 设置我的参数时,这会直接加载我们在 __init 中定义的源代码中的值吗?
  • 我更新了我的答案以包含有关模块参数的信息。如果模块参数是您最初想要询问的内容,您应该更新您的问题。
  • 好的,这可以在运行时更改吗?如何在 proc/sys/kernel/ 中添加新的内核参数?
  • 如果您编写的模块能够在运行时更改,那么它将能够在运行时更改。通过sysctl 向/proc/sys 添加任何内容。此处重要功能的示例用法 register_sysctl_table() 可以在 here 找到。您所要做的就是用.procname = "kernel".child="&lt;your child ctl_table&gt;" 创建一个父表。我认为仅此主题就可以代表关于 SO 的一个新问题。
  • 实际上我想在 audit.c 源代码中引入新的内核参数,该参数应首先在 /proc/sys/kernel/ 中更新,然后才能在运行时更改参数。你能帮忙吗我该如何实现?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-29
相关资源
最近更新 更多