使用netlink套接字在Linux内核中的用户空间应用程序和字符设备之间进行通信时出错

时间:2012-04-16 08:39:12

标签: linux kernel device-driver netlink

我编写了一个内核驱动程序“hello_kernel”,它在自定义节点/ dev / hello上注册为字符设备。在hello_kernel.c文件中,在调用register_chrdev()之后,我尝试使用netlink_kernel_create()(在netlink.h中定义)创建一个netlink套接字,并使用正确定义的函数通过此套接字接收用户空间消息。

代码编译完美,我使用mknod设备nod / dev / hello;但是当我尝试insmod这个模块(hello_kernel.ko)时,有一个错误:

insmod:插入'hello_kernel.ko'时出错:-1没有子进程

dmesg命令显示在创建套接字时出现错误,即使用netlink_kernel_create()。

最初,我试图使用这个模块来连接一个用户空间应用程序,它只是起诉一个完美运行的netlink套接字。我添加字符设备功能的动机是让另一个用户应用程序像常规设备文件一样打开它并发出ioctl调用。

我可以做些什么来完成这项工作?或者内核不支持合并这两种功能?

以下代码:

result = register_chrdev(major_num, "hello", &hello_fops);
if( result < 0 )
{
 printk( KERN_INFO "Could not init hello_kernel" );
 return result;
} 
result=netlink_kernel_create(&init_net, NETLINK_USER, 0, hello_nl_recv_msg,NULL,
THIS_MODULE);
if(!result)
{
 unregister_chrdev(major_num, "memory");
 printk(KERN_ALERT "Error creating socket.\n");
 return -10;
}

尝试插入模块:

$sudo insmod hello_kernel.ko
insmod: error inserting 'hello_kernel.ko': -1 No child processes

dmesg的输出:

[ 1537.809491] Error creating socket.

1 个答案:

答案 0 :(得分:-2)

问题出在注册设备后创建套接字。现在,我在设备注册(register_chrdev)之前创建套接字(netlink_kernel_create),重启后,它可以工作:)