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

Posted

技术标签:

【中文标题】在 Linux 内核中使用 netlink 套接字在用户空间应用程序和字符设备之间进行通信时出错【英文标题】:Error while using netlink sockets to communicate between user space application and character device in Linux kernel 【发布时间】:2012-04-16 08:39:12 【问题描述】:

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

代码编译完美,我使用 mknod 使设备点头 /dev/hello;但是当我尝试安装这个模块( 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.

【问题讨论】:

您使用的是什么内核版本?我实际上在任何地方都找不到 NETLINK_USER 的定义,即使在旧内核版本中也是如此。 【参考方案1】:

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

【讨论】:

以上是关于在 Linux 内核中使用 netlink 套接字在用户空间应用程序和字符设备之间进行通信时出错的主要内容,如果未能解决你的问题,请参考以下文章

linux下netlink的使用简介

netlink 套接字问题:内核冻结

linux 内核与用户空间通信之netlink使用方法

linux netlink套接字学习资料

Windows IPC 模拟 Linux Unix 域和 Netlink 套接字

Linux内核通信之netlink机制