커널 장치 드라이버 (device driver) 만들 때
글쓴이: mandugukbap / 작성시간: 월, 2013/01/21 - 8:03오후
Linux 커널 (3.2.x)에 디바이스 드라이버를 만들고 있습니다.
해당 디바이스 드라이버의 용도는 사용자 영역 (User-space)에서 대략 100 바이트 내외의 데이터를 커널 영역 (Kernel-space)으로 내려 보내서 커널 영역 전역 변수에 짧은 시간 저장해 두려는 목적입니다.
많은 분들의 도움으로 장치 드라이버를 작성할 수 있었습니다. 코드를 다 옮기려니 너무 길어서 대충 중요한 부분만 옮겨 보자면 저 아래 보이는 코드와 같습니다.
아무튼 해당 드라이버는 제가 원하는대로 작동을 하고 있습니다. 다만 이 모듈(드라이버)을 사용하기 위해서는 항상 mknod를 이용해 /dev/test_device 라는 노드를 생성해야 하더군요.
질문은, /dev/test_device같은 노드를 생성하는 과정 없이 아래의 코드를 User-space <-> Kernel-space 사이 자료 전달이 가능한 드라이버로 만들 방법은 없을까요? 예를 들어 제가 참고로 하고 있는 어떤 프로젝트에는 아래 제가 작성한 코드의 file_operations 대신 tcp_congestion_ops라는 struct를 사용하더군요. 하지만 해당 구조체는 TCP의 혼잡제어용으로 특화된 내용이라서 제가 원하는 간단한 자료 전달용으로 쓸 수는 없었습니다.
static struct file_operations vd_fops = { .read = test_device_read, .write = test_device_write, .open = test_device_open, .release = test_device_release }; int __init test_device_init(void) { if (register_chrdev(250, "test_device", &vd_fops) < 0 ) printk(KERN_ALERT "TEST driver init failed\n"); else printk(KERN_ALERT "TEST driver init successful\n"); buffer = (char*) kmalloc(1024, GFP_KERNEL); if (buffer != NULL) memset(buffer, 0, 1024); return 0; } void __exit test_device_exit(void) { unregister_chrdev(250, "test_device"); printk(KERN_ALERT "TEST driver cleanup succcessful\n"); kfree(buffer); }
Forums:
댓글 달기