我正在尝试在linux内核中运行linux内核模块。 但是发生了什么,有时会成功并运行,有时模块的插入失败并出现错误:
insmod: ERROR: could not insert module netlinkKernel.ko: No child processes
和内核日志显示它在打印失败
Error creating socket nl_sk
我认为这是一个常见错误,我不认为它必须对模块做任何事情。
我只是在模块中创建两个netlink套接字。当我评论第二个套接字创建行时,使用一个netlink套接字,模块工作正常,但是下面的代码粘贴了两个,它给出了这个错误,然后再次,当我尝试使用一个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;
}
任何人都可以对此有所了解吗?
答案 0 :(得分:2)
注意:我(还)不是内核编码大师。
如果我正确理解了您的查询,只要第3 netlink_kernel_create
行被注释掉,此模块就会正确插入。如果是这种情况,可能是因为一旦为特定单元(NETLINK_USER
)创建了一个Netlink套接字,就需要使用netlink_kernel_release
释放它,然后再用另一个{{1}重新创建它。 }}。这也是在模块加载失败后无法加载模块的原因。你永远不会释放分配的netlink套接字。此外,3.7之后对内核的第netlink_kernel_create
次调用不正确。
我的建议是将代码重构为:
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;
}
功能
netlink_kernel_release
来电
答案 1 :(得分:0)
好的,我将#define NETLINK_USER1 32的值从32更改为30并且运行正常。两个套接字都创建了。需要看fn原型
netlink_kernel_create(&init_net, NETLINK_USER1, &cfg1);
检查它期望作为中间参数的可能值。