안녕하세요~ 호서대학교 석사(과정) 이우영 입니다.

 

자 오늘은 추석입니다. 모두들 즐거운 하루를 보내고 있는지 모르겠내요.

(전 공부합니다 ㅠㅠ)

 

차운전 조심하시고 오늘도 열심히 알아보도록 하겠습니다.

 

오늘은 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/ <- 쫌더 빨리 보고 싶으신분은 여기로 오세요~