ric*_*hau 15 c linux-device-driver
模块名称:params.ko
#include <linux/init.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/kernel.h>
#include <linux/stat.h>
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",则显示字符串没有问题.
我也尝试使用\或''看看我是否可以逃离那个空间而忽略了空间但是徒劳无功.
想咨询任何知道如何将包含空格的字符串传递给内核模块的人吗?
谢谢你,感谢你的帮助.
afe*_*ter 11
当你运行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. */
Run Code Online (Sandbox Code Playgroud)
以及以下条件声明:
static char *next_arg(char *args, char **param, char **val)
{
...
for (i = 0; args[i]; i++) {
if (isspace(args[i]) && !in_quote)
break;
...
}
Run Code Online (Sandbox Code Playgroud)
所以我的想法是你需要将引号传递给内核,而不是shell.没有一个linux框来检查内核模块插入,但我想以下命令将起作用:
# insmod ./params.ko mystring='"Hello World"'
Run Code Online (Sandbox Code Playgroud)
这里shell将使用单引号,而insmodbinary 的参数将是mystring="Hello World"这样的,这些引号将按原样传递给内核,这样就可以按预期解析值.试试,应该工作.