34
한한한한한 ( 한 ) 10 10 • 한한한한 한한한한한 한한 • 한한 한한 • 한한한한 한한한한 한한 • 한한한한 한한한한 한한 • 한한한한 한한한한 한한 • 한한 한한한한한 한한한한 한한한한 한한한한 한한한한 한한 한한한한 한한한한 한한

디바이스 드라이버 기초

  • Upload
    barbie

  • View
    93

  • Download
    4

Embed Size (px)

DESCRIPTION

디바이스 드라이버 기초. 디바이스 드라이버의 개요 파일 연산 디바이스 드라이버 등록 디바이스 드라이버 구성 디바이스 드라이버 구현 블록 디바이스와 네트워크 디바이스. 디바이스 : 컴퓨터시스템의 주변 하드웨어 디바이스 드라이버는 디바이스 구동 프로그램 디바이스의 종류 문자 디바이스 (character device) 블록 디바이스 (block device) 네트워크 디바이스 (network device) 주번호 (major number) 와 부번호 (minor number) 로 구분 - PowerPoint PPT Presentation

Citation preview

Page 1: 디바이스 드라이버 기초

한빛미디어 ( 주 )

1010 장장

• 디바이스 드라이버의 개요

• 파일 연산

• 디바이스 드라이버 등록

• 디바이스 드라이버 구성

• 디바이스 드라이버 구현

• 블록 디바이스와 네트워크 디바이스

• 디바이스 드라이버의 개요

• 파일 연산

• 디바이스 드라이버 등록

• 디바이스 드라이버 구성

• 디바이스 드라이버 구현

• 블록 디바이스와 네트워크 디바이스

디바이스 드라이버 기초디바이스 드라이버 기초

Page 2: 디바이스 드라이버 기초

Section 01Section 01Section 01Section 01 디바이스 드라이버의 개요디바이스 드라이버의 개요 IT CookBookIT CookBookIT CookBookIT CookBook

22

디바이스 : 컴퓨터시스템의 주변 하드웨어디바이스 드라이버는 디바이스 구동 프로그램디바이스의 종류

문자 디바이스 (character device)블록 디바이스 (block device)네트워크 디바이스 (network device)

주번호 (major number) 와 부번호 (minor number) 로 구분 동일한 디바이스는 동일한 주번호를 가지며 서로 구분하기 위해 부번호를 사용

Page 3: 디바이스 드라이버 기초

Section 01Section 01Section 01Section 01 디바이스 드라이버의 개요디바이스 드라이버의 개요 IT CookBookIT CookBookIT CookBookIT CookBook

33

문자 디바이스파일시스템에서 하나의 노드 형태로 존재자료의 순차성을 지닌 하드웨어버퍼 캐시를 사용하지 않음 .데이터를 문자 단위 또는 연속적 바이트 흐름으로 전달하고 읽음 . 터미널 , 콘솔 , 키보드 , 사운드카드 , 스캐너 , 프린터 , 직렬 / 병렬 포트 , 마우스 , 조이스틱 등

Page 4: 디바이스 드라이버 기초

Section 01Section 01Section 01Section 01 디바이스 드라이버의 개요디바이스 드라이버의 개요 IT CookBookIT CookBookIT CookBookIT CookBook

44

블록 디바이스파일시스템에서 하나의 노드 형태로 존재버퍼 캐시를 통해 임의 접근이 가능한 데이터를 블록 단위로 입출력 효율을 향상하기 위하여 버퍼를 이용블록의 크기를 관리하고 블록 데이터의 전달을 담당하는 기능이 있음하드디스크 , 플로피 디스크 , 램디스크 , 테이프 , CD-ROM, DVD 등

Page 5: 디바이스 드라이버 기초

Section 01Section 01Section 01Section 01 디바이스 드라이버의 개요디바이스 드라이버의 개요 IT CookBookIT CookBookIT CookBookIT CookBook

55

네트워크 디바이스 패킷 단위로 접근네트워크 통신을 통해 네트워크 패킷을 송수신할 수 있는 디바이스 파일시스템의 노트 형태가 아닌 특별한 인터페이스를 사용 이더넷 , PPP, SLIP, ATM, 네트워크 인터페이스 카드

Page 6: 디바이스 드라이버 기초

Section 01Section 01Section 01Section 01 디바이스 드라이버의 개요디바이스 드라이버의 개요 IT CookBookIT CookBookIT CookBookIT CookBook

66

디바이스 파일 리눅스 시스템은 디바이스를 /dev 디렉토리에 있는 일종의 파일로 취급 . 즉 , 디바이스를 파일로 추상화디바이스 파일은 사용자에게 보이는 디바이스 드라이버의 인터페이스 부분응용 프로그램은 디바이스에 접근하기 위하여 열기 , 읽기 , 쓰기 등과 같은 파일 연산을 이용디바이스 파일은 파일시스템에서 고유한 번호와 이름을 할당받음디바이스 파일은 파일시스템의 데이터 영역을 차지하지 않고 단지 디바이스 드라이버를 접근할 수 있는 관문 역할을 수행

Page 7: 디바이스 드라이버 기초

7 7

IT CookBookIT CookBookIT CookBookIT CookBook

① 호스트 시스템의 디바이스 파일이 있는 /dev 디렉토리 내용관찰

실습 실습 10-1 10-1 호스트 시스템의 디바이스 파일 관찰

Page 8: 디바이스 드라이버 기초

Section 01Section 01Section 01Section 01 디바이스 드라이버의 개요디바이스 드라이버의 개요 IT CookBookIT CookBookIT CookBookIT CookBook

88

디바이스 파일의 생성

디바이스 파일은 /dev 에서 관리 디바이스 파일 형식 : 문자형 c , 블록형 b

리눅스에서 사용되는 디바이스 파일의 주번호

Page 9: 디바이스 드라이버 기초

9 9

IT CookBookIT CookBookIT CookBookIT CookBook

① 디바이스 파일을 생성하고 세부 내용 관찰

실습 실습 10-2 10-2 mknod 명령으로 디바이스 파일 생성

①②

Page 10: 디바이스 드라이버 기초

Section 01Section 01Section 01Section 01 디바이스 드라이버의 개요디바이스 드라이버의 개요 IT CookBookIT CookBookIT CookBookIT CookBook

1010

디바이스 드라이버 디바이스와 시스템 사이에 데이터를 주고받기 위한 인터페이스표준적으로 동일한 서비스 제공을 목적커널의 일부분으로 내장서브루틴과 데이터의 집합체디바이스의 고유한 특성을 내포

Page 11: 디바이스 드라이버 기초

1111

Section 02Section 02Section 02Section 02 파일 연산파일 연산 IT CookBookIT CookBookIT CookBookIT CookBook

파일 입출력 함수

저수준 파일 입출력함수

스트림 파일 입출력함수

접근 형태 직접 접근 형식화된 형태로 접근 , 사용하기쉬움

버퍼 사용 유무 사용 않음 버퍼를 사용 디바이스 파일 다루기 가능 곤란 디바이스 드라이버 구현 사용 사용 불가

종류 open(), read(), write(), close(), fsync(),ioctl(), poll(), mmap() 등

fopen(), fread(), fwrite(), fclose() 등

Page 12: 디바이스 드라이버 기초

1212

Section 02Section 02Section 02Section 02 파일 연산파일 연산 IT CookBookIT CookBookIT CookBookIT CookBook

저수준 파일 입출력 함수

Page 13: 디바이스 드라이버 기초

1313

Section 02Section 02Section 02Section 02 파일 연산파일 연산 IT CookBookIT CookBookIT CookBookIT CookBook

저수준 파일 입출력 함수 ( 계속 )

Page 14: 디바이스 드라이버 기초

1414

Section 02Section 02Section 02Section 02 파일 연산파일 연산 IT CookBookIT CookBookIT CookBookIT CookBook

저수준 파일 입출력 함수 ( 계속 )

Page 15: 디바이스 드라이버 기초

1515

Section 02Section 02Section 02Section 02 파일 연산파일 연산 IT CookBookIT CookBookIT CookBookIT CookBook

file 구조체파일 연산을 위한 인자 전달 방법으로 사용디바이스에 필요한 자료 구조를 정의 01 struct file {02 struct dentry f_dentry; 03 struct vfsmount *f_vfsmnt; 04 struct file_operations f_op; 05 atomic_t f_count; 06 unsigned int f_flags;07 mode_t f_mode; 08 loff_t f_pos; 09 unsigned long f_reada, f_ramax, f_raend, f_ralen, f_rawin

;10 struct fown_struct f_owner;11 unsigned int f_uid, f_gid; 12 int f_error;13 unsigned long f_version;14 void *private_data; 15 };

Page 16: 디바이스 드라이버 기초

1616

Section 02Section 02Section 02Section 02 파일 연산파일 연산 IT CookBookIT CookBookIT CookBookIT CookBook

파일 연산 구조체커널은 등록된 디바이스 드라이버의 파일 연산 구조체를 참고해 응용프로그램의 요청에 대응하는 함수 호출

01 struct file_operations {02 struct module *owner; 03 loff_t (*lseek) (struct file *, loff_t, int); 04 ssize_t (*read) (struct file *, char *, size_t, loff_t *); 05 ssize_t (*write) (struct file *, const char *, size_t, loff_t *); 06 int (*readdir) (struct file *, void *, filldir_t); 07 unsigned int (*poll) (struct file *, struct poll_table_struct *); 08 int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long); 09 int (*mmap) (struct file *, struct vm_area_struct *); 10 int (*open) (struct inode *, struct file *); 11 int (*release) (struct inode *, struct file *); 12 int (*fsync) (struct file *, struct dentry *); 13 int (*fasync) (int, struct file *, int); 14 int (*check_media_change) (kdev_t dev); 15 int (*revalidate) (kdev_t dev);16 int (*lock) (struct file *, int, struct file_lock *); 17 };

Page 17: 디바이스 드라이버 기초

1717

Section 02Section 02Section 02Section 02 파일 연산파일 연산 IT CookBookIT CookBookIT CookBookIT CookBook

문자 디바이스 드라이버의 파일 연산 구조체 사용전형적인 파일 연산 구조체의 선언내용 (xxx 는 일반적으로 디바이스의 이름 )

struct file_operations xxx_fops = {.owner = THIS_MODULE,.open = xxx_open,.release = xxx_release,.read = xxx_read,.write = xxx_write,.ioctl = xxx_ioctl,

};

Page 18: 디바이스 드라이버 기초

IT CookBookIT CookBookIT CookBookIT CookBookSection 03Section 03Section 03Section 03

1818

디바이스 드라이버 등록과 해제 디바이스 드라이버 등록과 해제 문자 디바이스의 등록과 해제

major : 주번호로 , 0 이면 사용하지 않는 주번호 중에서 동적으로 할당name : 디바이스의 이름으로 /proc/devices 에 나타나 있음반환값 : 오류 코드 . 반환값이 0 이거나 양수이면 성공적인 수행 . 음수이면 오류 발생 .

int register_chrdev(unsigned int major, const char *name, struct file_operations *fops)

int unregister_chrdev(unsigned int major, const char *name)

Page 19: 디바이스 드라이버 기초

IT CookBookIT CookBookIT CookBookIT CookBookSection 03Section 03Section 03Section 03

1919

디바이스 드라이버 등록과 해제 디바이스 드라이버 등록과 해제 블록 디바이스의 등록과 해제

major : 주번호로 , 0 이면 사용하지 않는 주번호 중에서 동적으로 할당 name : 블록 디바이스 장치 이름반환값 : 오류 코드 . 0 이나 양수이면 성공적인 수행 . 음수이면 오류 발생

네트워크 디바이스의 등록과 해제

dev : net_device 구조체 이름반환값 : 등록에 성공하면 0. 실패하면 0 이 아닌 값을 반환

int register_blkdev(unsigned int major, const char *name)int unregister_blkdev(unsigned int major, const char *name)

int register_netdev(struct net_device *dev)void unregister_netdev(struct net_device *dev)

Page 20: 디바이스 드라이버 기초

IT CookBookIT CookBookIT CookBookIT CookBookSection 03Section 03Section 03Section 03

2020

디바이스 드라이버 등록과 해제 디바이스 드라이버 등록과 해제 문자 디바이스 드라이버의 등록 과정

Page 21: 디바이스 드라이버 기초

디바이스 드라이버 구성 디바이스 드라이버 구성Section 04Section 04Section 04Section 04 IT CookBookIT CookBookIT CookBookIT CookBook

2121

전형적인 문자 디바이스 드라이버01 #include <linux/module.h>02 #include <linux/kernel.h>03 #include <linux/fs.h>04 #include <linux/init.h>05 06 #define TEST_DEV_NAME "test_dev"

// 디바이스 파일 이름07 #define TEST_DEV_MAJOR 240 /

/ 디바이스 파일의 주번호08 09 int test_open(struct inode *inode, struct file *f

ilp)10 {11 ………(open 처리 )……12 return 0;13 }14 15 int test_release(struct inode *inode, struct file

*filp) 16 {17 ………(close 처리 )……18 return 0;19 }20

21 struct file_operations test_fops =22 {23 .owner = THIS_MODULE,24 .open = test_open,25 .release = test_release,26 };27 28 int test_init(void) /

/ 디바이스를 커널에 모듈로 적재시 수행되는 함수29 {30 register_chrdev(TEST_DEV_MAJOR, TEST_DEV_NAME,

&test_fops);31 ………(초기화 처리 )……32 return 0;33 }34 35 void test_exit(void)

// 커널에서 디바이스를 제거할 때 수행되는 함수36 {37 ………(마무리 처리 )……38 unregister_chrdev(TEST_DEV_MAJOR, TEST_DEV_NAME

);39 }40 41 MODULE_LICENSE("GPL");42 module_init(test_init);43 module_exit(test_exit);

Page 22: 디바이스 드라이버 기초

디바이스 드라이버 구현디바이스 드라이버 구현Section 05Section 05Section 05Section 05 IT CookBookIT CookBookIT CookBookIT CookBook

2222

Page 23: 디바이스 드라이버 기초

23 23

IT CookBookIT CookBookIT CookBookIT CookBook

① 가상 문자 디바이스 드라이버 프로그램 작성 (10/chr_dev.c)

실습 실습 10-3 10-3 가상 디바이스 드라이버 구현

01 #include <linux/module.h>02 #include <linux/kernel.h>03 #include <linux/fs.h>04 #include <linux/init.h>0506 #define CHR_DEV_NAME "chr_dev" // 디바이스 파일 이름07 #define CHR_DEV_MAJOR 240 // 디바이스 파일의 주번호0809 int chr_open(struct inode *inode, struct file *filp)10 {11 int number = MINOR(inode->i_rdev); // 부번호를 number 에 저장12 printk("Virtual Character Device Open: Minor Number is %d\n", number);13 return 0;14 }1516 ssize_t chr_write(struct file *filp, const char *buf, size_tcount, loff_t *f_pos)17 {18 printk("write data: %s\n", buf); // 응용프로그램 write()19 // 함수의 buf 값을 커널메시지에 출력20 return count;21 }22

Page 24: 디바이스 드라이버 기초

24 24

IT CookBookIT CookBookIT CookBookIT CookBook실습 실습 10-3 10-3 가상 디바이스 드라이버 구현 23 ssize_t chr_read(struct file *filp, const char *buf, size_t count, loff_t *f_pos)24 {25 printk("read data: %s\n", buf); // 응용프로그램 read()26 // 함수의 buf 값을 커널메시지에 출력27 return count;28 }2930 int chr_ioctl(struct inode *inode, struct file *filp,unsigned int cmd, unsigned long arg)31 {32 switch(cmd) { // ioctl 함수로 전달된 cmd 값을 출력33 case 0: printk("cmd value is %d\n", cmd); break;…………37 case 4: printk("cmd value is %d\n", cmd); break;38 }39 return 0;40 }4142 int chr_release(struct inode *inode, struct file *filp)43 {44 printk("Virtual Character Device Release\n");45 return 0;46 }4748 struct file_operations chr_fops =49 {50 .owner = THIS_MODULE,51 .ioctl = chr_ioctl,52 .write = chr_write,53 .read = chr_read,54 .open = chr_open,55 .release = chr_release,56 };57

Page 25: 디바이스 드라이버 기초

25 25

IT CookBookIT CookBookIT CookBookIT CookBook실습 실습 10-3 10-3 가상 디바이스 드라이버 구현

58 int sample_init(void)// 디바이스를 커널에 모듈로 적재시 수행되는 함수59 {60 int registration; // registration 에 주번호나 반환값을 저장61 printk("Registration Character Device to Kernel\n");62 registration = register_chrdev(CHR_DEV_MAJOR,CHR_DEV_NAME,&chr_fops);63 if(registration < 0)64 return registration;65 printk("Major Number:%d\n", registration);66 return 0;67 }6869 void sample_cleanup(void) // 커널에서 디바이스를 제거할 때 수행되는 함수70 {71 printk("Unregistration Character Device to Kernel\n");72 unregister_chrdev(CHR_DEV_MAJOR, CHR_DEV_NAME);73 }7475 MODULE_LICENSE("GPL");76 module_init(sample_init);77 module_exit(sample_cleanup);

Page 26: 디바이스 드라이버 기초

26 26

IT CookBookIT CookBookIT CookBookIT CookBook

② Make 유틸리티를 실행해 모듈 생성

실습 실습 10-3 10-3 가상 디바이스 드라이버 구현

Page 27: 디바이스 드라이버 기초

27 27

IT CookBookIT CookBookIT CookBookIT CookBook

③ 가상 문자 디바이스를 사용하는 응용프로그램 작성 (10/chr_appl.c)

실습 실습 10-3 10-3 가상 디바이스 드라이버 구현

01 #include <stdio.h>02 #include <sys/types.h>03 #include <sys/stat.h>04 #include <fcntl.h>05 #include <sys/ioctl.h>06 #include <unistd.h>0708 #define DEVICE_FILE_NAME "/dev/chr_dev" // 디바이스 파일0910 int main(int argc, char *argv[]) // argv 값을 받아 디바이스11 { // 파일의 IOCTL cmd 값으로 사용12 int device;13 char wbuf[128] = "Write buffer data";14 char rbuf[128] = "Read buffer data";15 int n = atoi(argv[1]);1617 device = open(DEVICE_FILE_NAME, O_RDWR|O_NDELAY);18 if( device >= 0 ) {19 printf("Device file Open\n");20 ioctl(device, n); // argv 값을 디바이스 파일에 cmd 값으로 전달21 write(device, wbuf, 10); // wbuf 값을 디바이스 파일에 전달22 printf("Write value is %s\n", wbuf);23 read(device, rbuf, 10);24 printf("read value is %s\n", rbuf);25 }26 else27 perror("Device file open fail");2829 return 0;30 }

Page 28: 디바이스 드라이버 기초

28 28

IT CookBookIT CookBookIT CookBookIT CookBook

④ 응용프로그램을 타겟 시스템용으로 교차 컴파일

⑤ 디바이스 드라이버 모듈 chr_dev.ko 파일과 컴파일한 응용 프로그램 chr_appl 을 타겟 시스템으로 전송

⑥ 디바이스 드라이버 모듈을 적재하고 적재 여부 확인

실습 실습 10-3 10-3 가상 디바이스 드라이버 구현

Page 29: 디바이스 드라이버 기초

29 29

IT CookBookIT CookBookIT CookBookIT CookBook

⑦ 디바이스 파일을 만들고 확인

⑧ 명령행 인자를 사용해 응용 프로그램을 실행→디바이스 드라이버 모듈 제거

실습 실습 10-3 10-3 가상 디바이스 드라이버 구현

Page 30: 디바이스 드라이버 기초

Section 06Section 06Section 06Section 06 IT CookBookIT CookBookIT CookBookIT CookBook

3030

블록 디바이스와 네트워크 디바이스블록 디바이스와 네트워크 디바이스블록 디바이스 드라이버 작성

① 블록 디바이스 특성 , 주번호와 부번호 및 디바이스 이름 정의② register_blkdev() 함수를 사용한 블록 디바이스 드라이버의 등록 ③ 블록 디바이스 연산 구조체 처리④ 요구 큐에 관련된 처리 및 함수를 선언⑤ 블록 디바이스 추가를 위한 gendisk 구조체 생성 및 등록⑥ 블록 디바이스의 크기 설정 및 기타 속성을 처리

Page 31: 디바이스 드라이버 기초

Section 06Section 06Section 06Section 06 IT CookBookIT CookBookIT CookBookIT CookBook

3131

블록 디바이스와 네트워크 디바이스블록 디바이스와 네트워크 디바이스

네트워크 디바이스 드라이버 작성① 모듈 적재 혹은 커널 부팅에 의한 초기화 처리② 모듈 제거를 위한 마무리 처리③ 네트워크 디바이스 검출④ 네트워크 디바이스 초기화 및 등록⑤ 네트워크 디바이스 열기 및 닫기⑥ 네트워크 데이터 전송 및 수신⑦ 인터럽트 처리⑧ 네트워크 디바이스 제어를 위한 ioctl() 함수 구현⑨ 멀티 캐스트 처리⑩ 설정 정보의 재설정 처리

Page 32: 디바이스 드라이버 기초

32 32

IT CookBookIT CookBookIT CookBookIT CookBook

① Proc 파일시스템에서 커널에 등록된 디바이스 드라이버 정보 확인

실습 실습 10-4 10-4 등록된 네트워크 디바이스 드라이버 정보 보기

②③

Page 33: 디바이스 드라이버 기초

IT CookBookIT CookBookIT CookBookIT CookBook

3333

요 약요 약리눅스에는 문자 디바이스 , 블록 디바이스 , 네트워크 디바이스가 있다 .각 디바이스는 동일한 종류의 경우 같은 주번호를 가지며 서로 구분하기 위한 부번호를 가진다 .모듈 프로그래밍 방식으로 디바이스 드라이버 프로그램을 작성한다 .작성한 디바이스 드라이버를 커널에 등록하고 삭제하는 과정은 모듈과 같다 .디바이스 드라이버를 사용하는 응용프로그램에서는 저수준 파일 연산을 이용해 디바이스를 다룬다 .register_chrdev(), unregister_chrdev() 함수로 문자 디바이스 드라이버를 적재하고 제거한다 .mknod 로 필요한 디바이스 파일을 /dev 디렉토리에 생성한다 .파일 / 블록 연산 구조체로 디바이스 드라이버에서 처리할 연산을 설정한다 .블록 디바이스는 요구 큐를 사용하여 연산을 수행한다 .네트워크 디바이스는 파일시스템의 노드 형태가 아닌 특별한 인터페이스를 사용한다 .

Page 34: 디바이스 드라이버 기초

요 약요 약 IT CookBookIT CookBookIT CookBookIT CookBook

3434

Thank you