模块名称: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);
当使用默认设置时,加载驱动程序时,我可以看到“这是我的字符字符串”。
但是,如果我使用命令行来传递带有空格的字符串,它将显示以下错误:
示例1: # insmod ./params.ko mystring="Hello World"
insmod: error inserting './params.ko': -1 Unknown symbol in module
dmesg显示以下信息:
params: Unknown parameter 'World'
示例2: # insmod ./params.ko mystring="HelloWorld"
如果使用不带空格的“ HelloWorld”,则显示字符串没有问题。
我还尝试使用\或''来查看是否可以转义该空间以忽略该空间,但徒劳无功。
想咨询任何知道如何将包含空格的字符串传递给内核模块的人吗?
谢谢,感谢您的帮助。
当您运行insmod ./params.ko mystring="Hello World"
引号时,shell会使用引号,并且insmod二进制文件将字符串mystring=Hello World
作为参数。它按原样将其传递给内核,然后全部传递给内核parse_args
函数(在中kernel/params.c
),该函数依次调用next_arg
将下一个参数拆分为名称和值。
正如我们在代码中看到以下注释一样,它绝对可以处理空格:
/* 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"
这样,因此这些引号将按原样传递给内核,这将使解析值成为可能。试试看,应该可以。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句