设置内核可调参数

Setting kernel tunable parameter

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

这样我想通过引入新的内核模块来检查parameter.Can任何人都可以帮助我吗?执行此操作需要遵循哪些步骤?

使用自定义内核参数的一种方法是将其添加到内核命令行并从 /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权限。有关 class 的更多信息,请访问 /linux/moduleparam.h

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

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

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