加载内核模块时,我传递一个字符串作为参数。 当字符串是> 1024个字符,modprobe的导致一个错误:内核模块参数的字符串长度限制
FATAL: Error inserting mymodule (/lib/modules..): No space left on device
dmesg的输出:
mystr: string parameter too long
是否模块参数限于1024个字节字符串?
加载内核模块时,我传递一个字符串作为参数。 当字符串是> 1024个字符,modprobe的导致一个错误:内核模块参数的字符串长度限制
FATAL: Error inserting mymodule (/lib/modules..): No space left on device
dmesg的输出:
mystr: string parameter too long
是否模块参数限于1024个字节字符串?
我想不光模块,而且所有的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个字符更大。
一个更好的问题可能是“有没有不是通过一个1024字节的字符串作为参数更好的解决方案”,或然后再也许不会。你能解释为什么这是必要的吗?可能会有更好的方法。 – terdon
该字符串表示一个二进制代码,我将其用于模块中的计算。字符串似乎是关于输入便利性和后期计算的最佳解决方案。 – goose999
为什么不把它分成两部分,将每个部分作为单独的参数传递并加入到代码中? – terdon