커널 장치 드라이버 (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:


댓글 달기