2012-04-16 25 views
0

사용자 정의 노드/dev/hello에 문자 장치로 등록하는 커널 드라이버 "hello_kernel"을 작성했습니다. hello_kernel.c 파일에서 register_chrdev()를 호출 한 후 netlink_kernel_create() (netlink.h에 정의 됨)를 사용하여이 소켓을 통해 사용자 공간 메시지를 수신하기 위해 올바르게 정의 된 함수를 사용하여 netlink 소켓을 만들려고했습니다.netlink 소켓을 사용하여 Linux 커널에서 사용자 공간 응용 프로그램과 문자 장치간에 통신하는 동안 오류가 발생했습니다.

코드가 완벽하게 컴파일되었고 mknod를 사용하여 장치를 끄덕이/dev/hello로 만들었습니다.

insmod 명령 : 오류가 'hello_kernel.ko'를 삽입 :이 모듈 (hello_kernel.ko)를 insmod를 할 때하지만, 오류가 없음 아이가

을 처리하지 -1 dmesg를 명령은이 것을 보여줍니다 소켓 생성 중 오류, 즉 netlink_kernel_create().

처음에는이 모듈을 사용하여 완벽하게 작동하는 netlink 소켓만을 사용하는 사용자 공간 응용 프로그램과 연결하려고했습니다. 문자 장치 기능을 추가하려는 동기는 다른 사용자 응용 프로그램이 일반 장치 파일처럼 열어 ioctl 호출을 할 수있게하는 것이 었습니다.

이 작업을 수행하려면 어떻게해야합니까? 또는 커널이 두 기능의 병합을 지원하지 않습니까?

코드는 다음과 같다 : 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

문제는 장치의 가입 후에 소켓 창조이었다

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; 
} 

모듈을 삽입 시도. 이제 장치 등록 (register_chrdev) 전에 소켓 (netlink_kernel_create)을 만들고 재부팅하면 작동합니다.