我正在尝试在 Linux 内核中运行 Linux 内核模块。 但是发生了什么,有时它成功并运行,有时模块插入失败并出现错误:
insmod: ERROR: could not insert module netlinkKernel.ko: No child processes
内核日志显示打印失败
Error creating socket nl_sk
我认为这是一个常见错误,我认为它与模块无关。
我只是在模块中创建两个 netlink 套接字。当我评论第二个套接字创建行时,使用一个 netlink 套接字,模块工作正常,但是有两个粘贴在下面的代码中,它 alywas 给出了这个错误,然后再一次,当我尝试使用一个 netlink 套接字的模块时,它也失败了,我必须重新启动系统。
static int __init hello_init(void) {
printk("Entering: %s\n",__FUNCTION__);
// This is for 3.6 kernels and above.
struct netlink_kernel_cfg cfg = {
.input = hello_nl_recv_msg,
};
struct netlink_kernel_cfg cfg1 = {
.input = hello_nl_recv_msg1,
};
nl_sk = netlink_kernel_create(&init_net, NETLINK_USER, &cfg);
nl_sk1 = netlink_kernel_create(&init_net, NETLINK_USER1, &cfg1);
//nl_sk = netlink_kernel_create(&init_net, NETLINK_USER, 0, hello_nl_recv_msg,NULL,THIS_MODULE);
if(!nl_sk)
{
printk(KERN_ALERT "Error creating socket nl_sk.\n");
return -10;
}
if(!nl_sk1)
{
printk(KERN_ALERT "Error creating socket nl_sk1.\n");
return -10;
}
return 0;
}
任何人都可以阐明这一点吗?
最佳答案
注意:我(还)不是内核编码大师。
如果我正确理解您的查询,只要第 3 行 netlink_kernel_create
被注释掉,该模块就会正确插入。如果是这种情况,可能是因为一旦为特定单元 (NETLINK_USER
) 创建了 Netlink 套接字,就需要使用 netlink_kernel_release
释放它,然后才能重新创建它再次使用另一个 netlink_kernel_create
。这也是为什么你不能加载已经加载失败的模块的原因;您永远不会释放分配的网络链接套接字。此外,对于 3.7 之后的内核,第三次调用 netlink_kernel_create
是不正确的。
我的建议是将您的代码重组为如下所示:
nl_sk = netlink_kernel_create(&init_net, NETLINK_USER, &cfg);
if(!nl_sk)
{
printk(KERN_ALERT "Error creating socket nl_sk.\n");
return -10;
}
nl_sk1 = netlink_kernel_create(&init_net, NETLINK_USER1, &cfg1);
if(!nl_sk1)
{
printk(KERN_ALERT "Error creating socket nl_sk1.\n");
netlink_kernel_release(nl_sk);
return -10;
}
此外,您应该在 module_exit
函数中包含匹配的 netlink_kernel_release
调用
关于linux - insmod : ERROR: could not insert module : No child processes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35948879/