강좌 & 팁
안녕하세요~ 호서대학교 석사(과정) 이우영 입니다.
자 오늘은 추석입니다. 모두들 즐거운 하루를 보내고 있는지 모르겠내요.
(전 공부합니다 ㅠㅠ)
차운전 조심하시고 오늘도 열심히 알아보도록 하겠습니다.
오늘은 mem 디바이스 드라이버를 알아보도록 하겠습니다.
mem 디바이스 드라이버
mem 은 컴퓨터 메인메모리를 제어하는 문자 장치 파일입니다.
mem, kmem, port 등이 devices/char/mem.c 에 정의 되어있습니다.
mem의 디바이스 주번호는 1번이고 마이너 번호를 통해 나누어 집니다.
마이너 번호 |
디바이스 |
1 |
mem |
2 |
kmem |
3 |
null |
4 |
port |
5 |
zero |
7 |
full |
8 |
random |
9 |
urandom |
11 |
kmsg |
12 |
oldmem |
그럼 건단하게 디바이스 드라이버가 등록 되는 부분부터 보도록 하겠습니다.
978static int __init chr_dev_init(void)
979{
980 int i;
981 int err;
982
983 err = bdi_init(&zero_bdi);
984 if (err)
985 return err;
986
987 if (register_chrdev(MEM_MAJOR,"mem",&memory_fops))
988 printk("unable to get major %d for memory devs\n", MEM_MAJOR);
989
990 mem_class
= class_create(THIS_MODULE,
"mem");
991 for (i = 0; i
< ARRAY_SIZE(devlist);
i++)
992 device_create(mem_class,
NULL,
993 MKDEV(MEM_MAJOR,
devlist[i].minor), NULL,
994 devlist[i].name);
995
996 return 0;
997}
평소에 만들던 디바이스 드라이버와 뭔가 많이 다릅니다 ㅎㅎ.
(이 디바이스는 마이너 번호에 따라 동작하는 부분이 달라지기 때문에 추가된 부분이 많습니다 ㅎㅎ)
우선 dbi_init을 해주고 리턴값이 0이 아니라면 에러처리를 하고 빠져 나옵니다.
948static const struct file_operations
memory_fops
= {
949 .open
= memory_open,
/* just a selector for the real open */
950};
mem 이름을 갖고 주 번호 1번으로 디바이스를 등록한다.
일반적으로 디바이스를 등록하면 끝나지만 끝이 아니다.
(마이너 번호 부분을 처리 해줘야 겠죠?)
class_create 를 통해 class의 포인터를 아래 mem_class에 저장 한다,
976static struct class *mem_class;
이 class를 이용하여 마이너 번호에 따른 file_operations를 따로 등록을 할 수 있습니다.
device_create 함수를 통해 각 마이너 번호들의 정보를 등록하게 됩니다.
이로써 마이너 번호 별로 디바이스가 따로 동작하게 되었습니다.
오늘은 여기까지 살펴보겠습니다.
그럼 다음시간에 만나요~
http://ms-osek.org/ <- 쫌더 빨리 보고 싶으신분은 여기로 오세요~