배우고픈 공돌이

디바이스 드라이버 - APP Open & Read 본문

디바이스 드라이버

디바이스 드라이버 - APP Open & Read

내 마음 아홉수 2017. 9. 19. 12:16




application에서 장치를 open하는데까지의 순서


1. D/D 제작


2. 컴파일 위한 Makefile 제작


3. #make -> xxxx.ko


4. D/D 커널에 등록

   #insmod xxxx.ko


5. 장치 파일 생성

   #mknod /dev/xxxx c 245 1

   c   : character 장치 (장치 타입)

   245 : major 번호 - 커널이 관리

   1   : minor 번호 - D/D가 관리


6. APP에서 장치 파일을 OPEN할 수 있다. 


-체크 사항

#lsmod | grep xxxx 모듈 적재 확인

#dmesg printk 확인

#cat /proc/devices 커널 등록 확인

#cat /proc/kallsyms 커널의 심볼(모듈의 심볼) 확인

#cat /proc/modules 모듈의 정보를 확인

#ls -a /dev/xxxx          장치의 node를 확인


-제거 방법

#rmmod xxxx 커널에서 모듈 제거

#rm -f /dev/xxxx 장치 파일 제거


데모 파일 트리


예제 3은 모듈을 인스톨하고(insmod),  

노드를 만들어 장치를 등록한다.(mknod)


여기에 Makefile은 재대로 system call을 하여 open이 정상적으로 되었는지, 파일 디스크립트(fd)를 출력한다.


예제 4는 예제 3을 하고 난 후, task_struct 안의 pid, task_struct 안의 files_struct 안의 next_fd, 열린 파일의 i_inod를 출력한다.


* 파일 디스크립트 : 프로세스의 열린 파일의 목록을 관리하는 테이블의 인덱스



하드웨어 없이 커널 안의 정의된 값을 가져오는 것으로


디바이스 드라이버는 커널과 하드웨어 두 곳에서의 value를 접근할 수 있다.(커널 내부에 메모리 할당되어 있다.)


-skeleton_ex4/skeleton.c 의 read 등록 부분.


typedef struct {

pid_t pid;

unsigned int next_fd;

unsigned long i_ino;

}my_read;

 

static ssize_t sk_read(struct file *filp, char* buffer, size_t count, loff_t *f_pos)

{

my_read reads;


reads.next_fd = current->files->next_fd;

reads.pid = current->pid;

reads.i_ino = filp->f_inode->i_ino;

printk("pid number is %d\n",reads.pid);

printk("next_fd : %d\n",reads.pid);

printk("i_ino : %f\n",reads.i_ino);


copy_to_user(buffer,&reads,count);

return count; 

}


//c99 standard

struct file_operations sk_fops =

{

.owner = THIS_MODULE,

.open = sk_open,

.release         = sk_release,

.read         = sk_read,

};


skeleton example.7z

*본 환경은 우분투 16.0.4 lts 64bit이다.



Comments