C 将带有空格字符的字符串参数传递给内核模块

C 将带有空格字符的字符串参数传递给内核模块,c,linux-device-driver,C,Linux Device Driver,模块名称:params.ko 当我使用默认设置时,我可以在加载驱动程序时看到“这是我的字符字符串” 但是,如果使用命令行传递带空格的字符串,则会显示以下错误: 例1: #insmod./params.ko mystring=“Hello World” insmod:在模块中插入'/params.ko'时出错:-1个未知符号 dmesg显示以下信息: params:未知参数“World” 例2: #insmod./params.ko mystring=“HelloWorld” 如果我使用没有空格

模块名称:params.ko

当我使用默认设置时,我可以在加载驱动程序时看到“这是我的字符字符串”

但是,如果使用命令行传递带空格的字符串,则会显示以下错误:

例1:
#insmod./params.ko mystring=“Hello World”

insmod:在模块中插入'/params.ko'时出错:-1个未知符号

dmesg显示以下信息:

params:未知参数“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”
,因此这些引号将按原样传递给内核,这将使您能够按预期解析值。试试看,应该有用。

有趣。我假设“world”被解析为一个参数,因此出现了错误。就生铁而言,你能试试mystring=Hello\World吗?也就是说,省去双引号,跳出空格实际上,我认为这可能是一个普遍的问题。。请查看@Greycon,谢谢您提供更多信息。似乎这是一个目前还没有解决方案的普遍问题。@Greycon我试着按照您的建议使用mystring=Hello\World
#insmod:在模块中插入“/params.ko”时出错:-1未知符号
dmesg输出:
params:Unknown parameter'World'
OK,我认为这是一个一般性问题。我猜您必须传递一个连字符的字符串,然后在内核驱动程序代码中解析这些字符串。
# insmod ./params.ko mystring='"Hello World"'