0

我编写了一个内核驱动程序“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.
4

1 回答 1

-2

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

于 2012-04-18T07:08:43.710 回答