カスタムノード /dev/hello にキャラクターデバイスとして登録するカーネルドライバー「hello_kernel」を作成しました。hello_kernel.c ファイルで、register_chrdev() を呼び出した後、netlink_kernel_create() ( netlink.h で定義) を使用して netlink ソケットを作成しようとしました。このソケットを介してユーザー空間メッセージを受信する関数が適切に定義されています。
コードは完全にコンパイルされ、mknod を使用してデバイスを /dev/hello にしました。しかし、このモジュール ( hello_kernel.ko ) を insmod しようとすると、エラーが発生します:
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.