0

カスタムノード /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.
4

1 に答える 1

-2

問題は、デバイスを登録した後のソケットの作成にありました。今、私はデバイス登録(register_chrdev)の前にソケット(netlink_kernel_create)を作成し、再起動後に動作します:)

于 2012-04-18T07:08:43.710 に答える