2014-03-20 36 views
2

加载内核模块时,我传递一个字符串作为参数。 当字符串是> 1024个字符,modprobe的导致一个错误:内核模块参数的字符串长度限制

FATAL: Error inserting mymodule (/lib/modules..): No space left on device 

dmesg的输出:

mystr: string parameter too long 

是否模块参数限于1024个字节字符串?

+1

一个更好的问题可能是“有没有不是通过一个1024字节的字符串作为参数更好的解决方案”,或然后再也许不会。你能解释为什么这是必要的吗?可能会有更好的方法。 – terdon

+0

该字符串表示一个二进制代码,我将其用于模块中的计算。字符串似乎是关于输入便利性和后期计算的最佳解决方案。 – goose999

+1

为什么不把它分成两部分,将每个部分作为单独的参数传递并加入到代码中? – terdon

回答

2

我想不光模块,而且所有的Linux命令内核参数将被限制在1024字节。从linux source code,文件kernel/params.c

int param_set_charp(const char *val, const struct kernel_param *kp) 
{ 
    if (strlen(val) > 1024) { 
     pr_err("%s: string parameter too long\n", kp->name); 
     return -ENOSPC; 
    } 

    maybe_kfree_parameter(*(char **)kp->arg); 

    /* This is a hack. We can't kmalloc in early boot, and we 
    * don't need to; this mangled commandline is preserved. */ 
    if (slab_is_available()) { 
     *(char **)kp->arg = kmalloc_parameter(strlen(val)+1); 
     if (!*(char **)kp->arg) 
      return -ENOMEM; 
     strcpy(*(char **)kp->arg, val); 
    } else 
     *(const char **)kp->arg = val; 

    return 0; 
} 

所以答案,你不能传递参数,超过1024个字符更大。

+0

在非正常命令参数中,您肯定可以拥有超过1024个字节。考虑以下 - '/斌/回声$(TR -dc [:alnum:] Graeme

+0

叶氏,我mistypo。我的意思是内核参数。 – cuonglm