디바이스 드라이버 기초 디바이스 드라이버의 개요 파일 연산 디바이스 드라이버 등록 디바이스 드라이버 구성

Slides:



Advertisements
Similar presentations
YES C 제 1 장 C 언어의 개요 1/34 제 1 장 C 언어의 개요 문봉근. YES C 제 1 장 C 언어의 개요 2/34 제 1 장 C 언어의 개요 1.1 프로그램과 C 언어의 특징 1.2 C 언어의 프로그램 구성 1.3 비주얼 C++ 통합 환경 들어가기.
Advertisements

제10장 디바이스 드라이버.
제 3 장 변수와 자료형.
FND 디바이스 드라이버 Lecture #13.
5장. Enhanced Char Driver Operations 과제
TextLCD 디바이스.
Understanding of Socket and File I/O
리눅스 커널의 이해 중에서 17장. Ext2 파일시스템 회로 및 시스템 박사과정 1학기 이창희○ 국중옥.
6 레이스 컨디션.
-Part3- 제3장 콘솔 입출력과 파일 입출력.
Chapter 10– 표준 함수(1) Outline 10.1 스트림과 파일 10.2 입출력 표준 함수
Linux System Programming
Department of Computer Engineering
디바이스 드라이버 이해 Hanbat National University Prof. Lee Jaeheung.
Block Device Driver in Linux
08. 디바이스 드라이버의 읽기와 쓰기 김진홍
디바이스 드라이버 (Device Driver)
디바이스 드라이버 응용 디바이스와 주소 디바이스 드라이버 구현 일반 LED 디바이스 드라이버 FND 디바이스 드라이버
디바이스 드라이버.
이식성과 데이터형 서로 다른 프로세서 상에서의 이식성을 위해 가급적 리눅스 커널이 제공하는 데이터형을 사용하는 것이 좋다.
디바이스 드라이버 개요 가상 디바이스드라이버 실습
Department of Computer Engineering
Network Lab. Seoung Hyeon, Lee
Linux System Programming
쉽게 풀어쓴 C언어 Express 제16장 파일 입출력 C Express Slide 1 (of 23)
Unix Project-Final <test character device 생성>
6장 비연결형 지향 프로토콜 Database Lab 강 우 석.
제 12장 I/O멀티플렉싱(Multiplexing)
FND (Flexible Numeric Display)
Using Standard I/O on Sockets
Department of Computer Engineering
Department of Computer Engineering
Step Motor Device Driver
멀티쓰레드 기반의 서버구현 School of Electronics and Information.
레이스 컨디션 컴퓨터공학과 4학년 이교욱.
9장 파일 입출력.
링크 파일 생성[1] 링크 하드링크 생성 : link(2) 이미 있는 파일이나 디렉토리에 접근할 수 있는 새로운 이름
Linux/UNIX Programming APUE (Files & Directories)
Term Project Team Member
파일 기술자 복사 파일 기술자 복사 : dup(2) 파일 기술자 복사 : dup2(3)
12장 파일처리와 매크로 파일 입출력 함수 문자 입출력 함수 라인 입출력 함수 불록 입출력 함수 매크로.
(ioctl, mmap, fsync&flush)
4장 파일.
6장 파일 및 레코드 잠금.
커널 모듈 프로그래밍 (Kernel Module Programming)
C언어 프로그래밍의 이해 Ch14. 파일 입출력.
Department of Computer Engineering
HBE-SMIII-SV210 리눅스 커널과 디바이스 드라이버
파일 접근권한 제어 stat 구조체의 st_mode 항목에 파일의 종류와 접근권한 정보저장 st_mode 값의 구조.
FILE I/O 번째주 Dept. of Computer Science & Engineering
10장 C 표준 파일 입출력 子曰 學而時習(실습?)之 不亦悅乎.
5 프로세스 정보.
17강 파일처리함수(1) 강 의 내 용 파일 입출력의 개념 파일포인터를 이용한 입출력 파일 입출력 과정
문자 디바이스 드라이버 임베디드 시스템.
Linux Programming Spring 2008
컴퓨터의 기초 제 2강 - 변수와 자료형 , 연산자 2006년 3월 27일.
장애인과 함께하는 시민도서관 “신체적, 사회적 여건에 관계없이 공평하게 이용해야 할 것” 큰글자도서, 촉각도서, 오디오북, DVD, CD-ROM 등의 특수자료와 62만 여권의 도서를 장애인정보누리터와 각 자료실에.
네트워크 프로그래밍의 이해 School of Electronics and Information.
리눅스 디바이스 드라이버 (Linux Device Driver)
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
Stepper Motor 디바이스 드라이버
Department of Computer Engineering
8. 리눅스의 내부 군자삼락 [君子三樂] 청출어람이청어람 [ 靑出於藍而靑於藍 ] Why Linux ?
Kernel Programming Kernel
1학기 정리 지난 학기에 배운 내용을 복습해 본다..
컴퓨터 프로그래밍 기초 - 11th : 파일 입출력 및 구조체 -
argc, argv 의 사용방법 #include <stdio.h>
06. 디바이스의 등록과 해제 김진홍
C 13장. 입출력 라이브러리 #include <stdio.h> int main(void) { int num;
3장 파일 다루기 한빛미디어(주).
Presentation transcript:

디바이스 드라이버 기초 디바이스 드라이버의 개요 파일 연산 디바이스 드라이버 등록 디바이스 드라이버 구성 디바이스 드라이버 구현 블록 디바이스와 네트워크 디바이스 한빛미디어(주)

주번호(major number)와 부번호(minor number)로 구분 디바이스: 컴퓨터시스템의 주변 하드웨어 디바이스 드라이버는 디바이스 구동 프로그램 디바이스의 종류 문자 디바이스(character device) 블록 디바이스(block device) 네트워크 디바이스(network device) 주번호(major number)와 부번호(minor number)로 구분 동일한 디바이스는 동일한 주번호를 가지며 서로 구분하기 위해 부번호를 사용

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

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

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

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

호스트 시스템의 디바이스 파일이 있는 /dev 디렉토리 내용관찰 실습 10-1 호스트 시스템의 디바이스 파일 관찰 호스트 시스템의 디바이스 파일이 있는 /dev 디렉토리 내용관찰 ① ②

디바이스 파일의 생성 리눅스에서 사용되는 디바이스 파일의 주번호 디바이스 파일은 /dev 에서 관리 디바이스 파일 형식: 문자형 c , 블록형 b 리눅스에서 사용되는 디바이스 파일의 주번호

실습 10-2 mknod 명령으로 디바이스 파일 생성 디바이스 파일을 생성하고 세부 내용 관찰 ① ②

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

파일 입출력 함수 저수준 파일 입출력 함수 스트림 파일 입출력함수 접근 형태 직접 접근 형식화된 형태로 접근, 사용하기 쉬움 버퍼 사용 유무 사용 않음 버퍼를 사용 디바이스 파일 다루기 가능 곤란 디바이스 드라이버 구현 사용 사용 불가 종류 open(), read(), write(), close(), fsync(),ioctl(), poll(), mmap() 등 fopen(), fread(), fwrite(), fclose() 등

저수준 파일 입출력 함수

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

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

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 };

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

문자 디바이스 드라이버의 파일 연산 구조체 사용 전형적인 파일 연산 구조체의 선언내용 (xxx는 일반적으로 디바이스의 이름) struct file_operations xxx_fops = { .owner = THIS_MODULE, .open = xxx_open, .release = xxx_release, .read = xxx_read, .write = xxx_write, .ioctl = xxx_ioctl, };

문자 디바이스의 등록과 해제 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)

블록 디바이스의 등록과 해제 네트워크 디바이스의 등록과 해제 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)

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

전형적인 문자 디바이스 드라이버 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 *filp) 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);

가상 문자 디바이스 드라이버 프로그램 작성(10/chr_dev.c) 실습 10-3 가상 디바이스 드라이버 구현 가상 문자 디바이스 드라이버 프로그램 작성(10/chr_dev.c) 01 #include <linux/module.h> 02 #include <linux/kernel.h> 03 #include <linux/fs.h> 04 #include <linux/init.h> 05 06 #define CHR_DEV_NAME "chr_dev" // 디바이스 파일 이름 07 #define CHR_DEV_MAJOR 240 // 디바이스 파일의 주번호 08 09 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 } 15 16 ssize_t chr_write(struct file *filp, const char *buf, size_t count, loff_t *f_pos) 17 { 18 printk("write data: %s\n", buf); // 응용프로그램 write() 19 // 함수의 buf 값을 커널 메시지에 출력 20 return count; 21 } 22

실습 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 } 29 30 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 } 41 42 int chr_release(struct inode *inode, struct file *filp) 43 { 44 printk("Virtual Character Device Release\n"); 45 return 0; 46 } 47 48 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

실습 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 } 68 69 void sample_cleanup(void) // 커널에서 디바이스를 제거할 때 수행되는 함수 70 { 71 printk("Unregistration Character Device to Kernel\n"); 72 unregister_chrdev(CHR_DEV_MAJOR, CHR_DEV_NAME); 73 } 74 75 MODULE_LICENSE("GPL"); 76 module_init(sample_init); 77 module_exit(sample_cleanup);

실습 10-3 가상 디바이스 드라이버 구현 Make 유틸리티를 실행해 모듈 생성

가상 문자 디바이스를 사용하는 응용프로그램 작성(10/chr_appl.c) 실습 10-3 가상 디바이스 드라이버 구현 가상 문자 디바이스를 사용하는 응용프로그램 작성(10/chr_appl.c) 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> 07 08 #define DEVICE_FILE_NAME "/dev/chr_dev" // 디바이스 파일 09 10 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]); 16 17 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 else 27 perror("Device file open fail"); 28 29 return 0; 30 }

응용프로그램을 타겟 시스템용으로 교차 컴파일 실습 10-3 가상 디바이스 드라이버 구현 응용프로그램을 타겟 시스템용으로 교차 컴파일 디바이스 드라이버 모듈 chr_dev.ko 파일과 컴파일한 응용 프로그램 chr_appl을 타겟 시스템으로 전송 디바이스 드라이버 모듈을 적재하고 적재 여부 확인 ① ②

명령행 인자를 사용해 응용 프로그램을 실행→디바이스 드라이버 모듈 제거 실습 10-3 가상 디바이스 드라이버 구현 디바이스 파일을 만들고 확인 명령행 인자를 사용해 응용 프로그램을 실행→디바이스 드라이버 모듈 제거 ① ②

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

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

Proc 파일시스템에서 커널에 등록된 디바이스 드라이버 정보 확인 실습 10-4 등록된 네트워크 디바이스 드라이버 정보 보기 Proc 파일시스템에서 커널에 등록된 디바이스 드라이버 정보 확인 ① ② ③ ④

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

Thank you