当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《将带空格字符的字符串参数传递给内核模块》经验,为你挑选了1个好方法。

模块名称: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",则显示字符串没有问题.

我也尝试使用\或''看看我是否可以逃离那个空间而忽略了空间但是徒劳无功.

想咨询任何知道如何将包含空格的字符串传递给内核模块的人吗?

谢谢你,感谢你的帮助.



1> afenster..:

当你运行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将使用单引号,而insmodbinary 的参数将是mystring="Hello World"这样的,这些引号将按原样传递给内核,这样就可以按预期解析值.试试,应该工作.

推荐阅读
k78283381
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有