模块名称:params.ko
#include
#include
#include
#include
#include
MODULE_LICENSE("Dual BSD/GPL");
static char *mystring = "this is my char string";
module_param(mystring, charp, S_IRUGO | S_IWUSR);
MODULE_PARM_DESC(mystring, "A char string");
static int __init params_init(void)
{
printk("Driver is loaded\n");
printk(" My char string(mystring): %s\n", mystring);
return 0;
}
static void __exit params_exit(void)
{
printk("Driver is unloaded\n");
}
module_init(params_init);
module_exit(params_exit);
当我使用默认设置时,我可以在加载驱动程序时看到"这是我的字符串".
但是,如果我使用命令行来传递带空格的字符串,它将显示以下错误:
EX1:
# insmod ./params.ko mystring="Hello World"
insmod: error inserting './params.ko': -1 Unknown symbol in module
dmesg显示以下信息:
params: Unknown parameter 'World'
EX2:
# insmod ./params.ko mystring="HelloWorld"
如果我使用没有空格的"HelloWorld",则显示字符串没有问题.
我也尝试使用\或''看看我是否可以逃离那个空间而忽略了空间但是徒劳无功.
想咨询任何知道如何将包含空格的字符串传递给内核模块的人吗?
谢谢你,感谢你的帮助.
当你运行insmod ./params.ko mystring="Hello World"
引号被shell吃掉时,insmod二进制文件将字符串mystring=Hello World
作为参数.它按原样将它传递给内核,然后全部转到内核parse_args
函数(in kernel/params.c
),然后调用next_arg
将下一个参数拆分为name和value.
它肯定可以处理空格,因为我们在代码中看到以下注释:
/* You can use " around spaces, but can't escape ". */ /* Hyphens and underscores equivalent in parameter names. */
以及以下条件声明:
static char *next_arg(char *args, char **param, char **val) { ... for (i = 0; args[i]; i++) { if (isspace(args[i]) && !in_quote) break; ... }
所以我的想法是你需要将引号传递给内核,而不是shell.没有一个linux框来检查内核模块插入,但我想以下命令将起作用:
# insmod ./params.ko mystring='"Hello World"'
这里shell将使用单引号,而insmod
binary 的参数将是mystring="Hello World"
这样的,这些引号将按原样传递给内核,这样就可以按预期解析值.试试,应该工作.