我怎样才能从Linux内核模块中获取内核命令行?
可以通过读取/proc/cmdline
来实现,但似乎有一种比打开和读取文件更容易访问命令行的内核模块方法。
我怎样才能从Linux内核模块中获取内核命令行?
可以通过读取/proc/cmdline
来实现,但似乎有一种比打开和读取文件更容易访问命令行的内核模块方法。
您实际上需要访问整个内核命令行,还是只需要一些参数?
您可以用您的模块名称为每个重要参数添加前缀。
my_module.my_variable=value
insmod module.ko cmdline=$(cat /proc/cmdline)
。 - Billysaved_command_line
没有被导出。 - Billy这是一种有点hack的方法,因此不适用于生产质量的代码,但是发现可以调用kallsyms_lookup_name
来按符号名称查找内核变量或函数,而这些变量或函数并没有被导出。
get_mem_areas_from_memmap_params是一个例子,其中修改了一个模块,该模块分配物理连续内存并在内核命令行上使用memmap
选项来保留一些物理内存。当模块加载时,它想要解析命令行以查找memmap
条目,然后使用已保留但未被内核使用的物理内存。
例如,以下代码被用来获取访问未被导出的saved_command_line
:
const char **lookup_saved_command_line;
/* Can't find an exported way of obtaining the Kernel command line, so lookup the saved_command_line variable */
lookup_saved_command_line = (const char **) kallsyms_lookup_name ("saved_command_line");
if ((lookup_saved_command_line == NULL) || ((*lookup_saved_command_line) == NULL))
{
pr_info(CMEM_DRVNAME " Failed to lookup saved_command_line\n");
return -EINVAL;
}
还可以查找未导出的函数并调用它们。例如,从上面的模块中,以下代码查找并调用parse_args
来解析命令行参数,避免编写解析代码:
/* Lookup the function to parse arguments, to re-use the parsing code which handles escaping of parameters */
parse_args_lookup = (void *) kallsyms_lookup_name ("parse_args");
if ((parse_args_lookup == NULL) || ((*parse_args_lookup) == NULL))
{
pr_info(CMEM_DRVNAME " Failed to lookup parse_args\n");
return -EINVAL;
}
cmdline = kstrdup (*lookup_saved_command_line, GFP_KERNEL);
parse_args_lookup("cmem params", cmdline, NULL, 0, 0, 0, NULL, &cmem_boot_param_cb);
kfree (cmdline);