我寫了一個內核驅動程序「hello_kernel」,它在自定義節點/ dev/hello上註冊爲字符設備。在hello_kernel.c文件中,在調用register_chrdev()之後,我嘗試使用netlink_kernel_create()(在netlink.h中定義)創建一個netlink套接字,並使用正確定義的函數通過此套接字接收用戶空間消息。使用netlink套接字在Linux內核中的用戶空間應用程序和字符設備之間進行通信時出錯
代碼編譯完美,我使用mknod使設備點頭/ 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.
您使用的是什麼內核版本?我實際上無法在任何地方找到NETLINK_USER的定義,即使在較舊的內核版本中也是如此。 – 2012-04-16 20:33:05