2012-04-16 9 views
0

カスタムノード/ dev/helloに文字デバイスとして登録するカーネルドライバ "hello_kernel"を作成しました。 hello_kernel.cファイルでは、register_chrdev()を呼び出した後、netlink_kernel_create()(netlink.hで定義)を使用してnetlinkソケットを作成しようとしました。netlinkソケットを使用してLinuxカーネルのユーザー空間アプリケーションと文字デバイス間で通信するときのエラー

コードが完全にコンパイルされ、mknodを使用してデバイスのノード/ dev/helloを作成しました。しかし、私はこのモジュール(hello_kernel.koを)にinsmodしようとすると、エラーがある:

insmodの:エラー挿入する「hello_kernel.ko」:-1ませ子どもが

を処理していないのdmesgコマンドがあったことを示していますソケットの作成中、つまりnetlink_kernel_create()でエラーが発生しました。

最初は、このモジュールを使用して、完全に機能するネットリンクソケットだけを使用しているユーザースペースアプリケーションに接続しようとしていました。キャラクタデバイス機能を追加する私の動機は、別のユーザアプリケーションが通常のデバイスファイルのようにそれを開き、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; 
} 

ます。dmesgの

$sudo insmod hello_kernel.ko 
insmod: error inserting 'hello_kernel.ko': -1 No child processes 

出力:

[ 1537.809491] Error creating socket. 
+0

どのカーネルバージョンを使用していますか?私は実際には、古いカーネルバージョンであっても、どこにでもNETLINK_USERの定義を見つけることができません。 –

答えて

-2

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

関連する問題