gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 16:34:17 26 4
gpt4 key购买 nike

模块名称:params.ko


<code>#include <linux/init.h></code>
<code>#include <linux/module.h></code>
<code>#include <linux/moduleparam.h></code>
<code>#include <linux/kernel.h></code>
<code>#include <linux/stat.h></code>
<code>MODULE_LICENSE("Dual BSD/GPL");</code>
<code>
</code>static char *mystring = "this is my char string";<code>
</code>module_param(mystring, charp, S_IRUGO | S_IWUSR); <code>
</code>MODULE_PARM_DESC(mystring, "A char string");<code>
</code>
<code>static int __init params_init(void)</code>
<code>{</code>
<code>printk("Driver is loaded\n");</code>
<code>printk(" My char string(mystring): %s\n", mystring);</code>
<code>return 0;</code>
<code>}</code><p></p>

<p><code>static void __exit params_exit(void)</code>
<code>{</code>
<code>printk("Driver is unloaded\n");</code>
<code>}</code></p>

<p><code>module_init(params_init);</code>
<code>module_exit(params_exit);</code>
</p>

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

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

示例 1:#insmod ./params.ko mystring="Hello World"

insmod: error inserting './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 box 来检查内核模块插入,但我想下面的命令可以工作:

# insmod ./params.ko mystring='"Hello World"'

此处 shell 将使用单引号,insmod 二进制文件的参数将是 mystring="Hello World" 因此这些引号将按原样传递给内核,这将使您可以按预期解析值。试试看,应该可以。

关于c - 将带有空格字符的字符串参数传递给内核模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25508747/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com