06. 디바이스의 등록과 해제 김진홍 jhkim3624@etri.re.kr 2015.10.11.
목차 1. 디바이스 드라이버 제어 방식 2. struct file_operations 3. 문자 디바이스 드라이버의 등록과 해제 및 구성 4. 문자 디바이스 드라이버 작성 예제 목차
개요 개요 1. 디바이스 드라이버 제어 방식 2. struct file_operations 3. 문자 디바이스 드라이버의 등록과 해제 및 구성 4. 문자 디바이스 드라이버 작성 예제 개요 응용프로그램에서 하드웨어를 제어할 때는 디바이스 파일을 이용 응용프로그램 사용자 공간에서 프로세스 형식으로 동작 하드웨어에 직접 접근할 수 없어 디바이스 파일을 이용 디바이스 파일 커널 내의 파일 시스템 구조에 의해 디바이스 드라이버 함수와 연결 됨 응용이 디바이스 파일에 입출력 함수로 데이터를 쓰면 디바이스 드라이버 함수가 호출 됨 디바이스 드라이버 하드웨어 제어를 위해 커널 내에 디바이스를 제어하는 함수집합인 디바이스 드라이버가 있어야 함 모듈 형태로 커널에 적재될 수도 있고, 처음부터 커널 내부에 구현되어 있을 수 있음 문자 디바이스 드라이버는 응용프로그램에서 디바이스 파일을 통해 호출 블록 & 네트워크 디바이스 드라이버는 커널에서 직접 호출 AP DF DD HW 응용 장치파일 디바이스 드라이버 저수준 파일 입출력 함수 파일 처리 시스템 콜 하드웨어 제어 함수 사용자 공간 커널 공간
문자 디바이스 드라이버 동작 개념 블록 디바이스 드라이버의 상대적인 개념 저장할 용량이 정해진 하드디스크 1. 디바이스 드라이버 제어 방식 2. struct file_operations 3. 문자 디바이스 드라이버의 등록과 해제 및 구성 4. 문자 디바이스 드라이버 작성 예제 개념 블록 디바이스 드라이버의 상대적인 개념 저장할 용량이 정해진 하드디스크 반면 키보드나 시리얼 입출력은 파일의 끝이란 개념이 없음
문자 디바이스 드라이버 동작 사용 응용 프로그램에서 저수준 파일 함수를 이용 디바이스 파일에 데이터를 읽고 씀 1. 디바이스 드라이버 제어 방식 2. struct file_operations 3. 문자 디바이스 드라이버의 등록과 해제 및 구성 4. 문자 디바이스 드라이버 작성 예제 사용 응용 프로그램에서 저수준 파일 함수를 이용 디바이스 파일에 데이터를 읽고 씀 대응되는 디바이스 드라이버 내의 함수가 호출 됨 응용 프로그램 장치 파일 문자 디바이스 드라이버 하드웨어 read dev_read 결과
struct file_operations 문자 디바이스 드라이버 동작 1. 디바이스 드라이버 제어 방식 2. struct file_operations 3. 문자 디바이스 드라이버의 등록과 해제 및 구성 4. 문자 디바이스 드라이버 작성 예제 디바이스 파일과 드라이버 함수를 연결하는 방법 insmod rmmod open(…) read(…) write(…) ioctl(…) close(…) 응용 프로그램 디바이스 드라이버 { : } xxx_init(…) xxx_interrupt(…) xxx_open(…) xxx_read(…) xxx_write(…) xxx_ioctl(…) xxx_release(…) xxx_exit(…) xxx_fop = open : xxx_open, read : xxx_read, write : xxx_write, ioctl : xxx_ioctl, release : xxx_release }; struct file_operations HW 인터럽트
struct file_operations 1. 디바이스 드라이버 제어 방식 2. struct file_operations 3. 문자 디바이스 드라이버의 등록과 해제 및 구성 4. 문자 디바이스 드라이버 작성 예제 개요 문자 디바이스 드라이버와 응용 프로그램을 연결하는 고리 응용프로그램 저수준 파일 입출력 함수 사용 디바이스 파일에 접근 등록된 드라이버의 파일 오퍼레이션 구조체 정보 참고 디바이스 파일에 접근한 함수에 대응하는 함수 호출 문자 디바이스 드라이버를 등록한다? 이 파일 오퍼레이션 구조체 변수를 커널에 등록한다.
struct file_operations 1. 디바이스 드라이버 제어 방식 2. struct file_operations 3. 문자 디바이스 드라이버의 등록과 해제 및 구성 4. 문자 디바이스 드라이버 작성 예제 구조체 필드 *owner 오퍼레이션의 소유자 *llseek 파일 포인터 위치를 강제로 이동 *read 드라이버 읽기 *aio_read 비동기 읽기 *write 드라이버 쓰기 *aio_write 비동기 쓰기 *poll 다중 입출력 처리 *ioctl Read write 이외의 입출력 처리 *mmap 하드웨어의 메모리를 프로세스에 매핑 *open 열기 *release 닫기
저수준 입출력 함수와 file_operations 필드 1. 디바이스 드라이버 제어 방식 2. struct file_operations 3. 문자 디바이스 드라이버의 등록과 해제 및 구성 4. 문자 디바이스 드라이버 작성 예제 open():xxx_open() fd = open(const char *pathname, int flags); int xxx_open(struct inode *inode, struct file *filp) { return ret; }
저수준 입출력 함수와 file_operations 필드 1. 디바이스 드라이버 제어 방식 2. struct file_operations 3. 문자 디바이스 드라이버의 등록과 해제 및 구성 4. 문자 디바이스 드라이버 작성 예제 close():xxx_release() fd = close(int fd); int xxx_release(struct inode *inode, struct file *filp) { return ret; }
저수준 입출력 함수와 file_operations 필드 1. 디바이스 드라이버 제어 방식 2. struct file_operations 3. 문자 디바이스 드라이버의 등록과 해제 및 구성 4. 문자 디바이스 드라이버 작성 예제 read():xxx_read() ret = read(int fd, void *buf, size_t count); ssize_t xxx_read(struct file *filp, char *buf, size_t count, loff_t *f_pos) { return ret; }
저수준 입출력 함수와 file_operations 필드 1. 디바이스 드라이버 제어 방식 2. struct file_operations 3. 문자 디바이스 드라이버의 등록과 해제 및 구성 4. 문자 디바이스 드라이버 작성 예제 write():xxx_write() ret = write(int fd, void *buf, size_t count); ssize_t xxx_write(struct file *filp, char *buf, size_t count, loff_t *f_pos) { return ret; }
저수준 입출력 함수와 file_operations 필드 1. 디바이스 드라이버 제어 방식 2. struct file_operations 3. 문자 디바이스 드라이버의 등록과 해제 및 구성 4. 문자 디바이스 드라이버 작성 예제 lseek():xxx_llseek() ret = write(int fd, off_t offset, int whence); ssize_t xxx_llseek(struct file *filp, loff_t off, int whence) { return ret; }
개요 등록과 제거 등록 제거 1. 디바이스 드라이버 제어 방식 2. struct file_operations 3. 문자 디바이스 드라이버의 등록과 해제 및 구성 4. 문자 디바이스 드라이버 작성 예제 등록과 제거 등록 register_chrdev (unsigned int major, const char *name, struct file_operations *fops) 제거 unregister_chrdev(unsigned int major, const char *name)
struct file_operations 변수 1. 디바이스 드라이버 제어 방식 2. struct file_operations 3. 문자 디바이스 드라이버의 등록과 해제 및 구성 4. 문자 디바이스 드라이버 작성 예제 Struct file_operations xxx_fops = { .owner = THIS_MODULE, .llseek = xxx_llseek, .read = xxx_read, .write = xxx_write, .ioctl = xxx_ioctl, .open = xxx_open, .release = xxx_release, };
문자 디바이스 드라이버의 등록과 해제 문자 드라이버의 동작 순서 1. 디바이스 드라이버 제어 방식 2. struct file_operations 3. 문자 디바이스 드라이버의 등록과 해제 및 구성 4. 문자 디바이스 드라이버 작성 예제 문자 드라이버의 동작 순서 사용자 공간 struct file_operations *fops; chrdevs[MAX_PROBE_HASH] /dev/calldev insmod rmmod open(…) read(…) write(…) ioctl(…) close(…) 응용 프로그램 디바이스 드라이버 xxx_init(…) { register_chdrv( ) } module_init(xxx_init) xxx_exit(…) unregister_chdrv(…) module_exit(xxx_exit); xxx_fop = open : xxx_open, read : xxx_read, write : xxx_write, ioctl : xxx_ioctl, release : xxx_release }; struct file_operations 장치파일 (1) (2) (3) (4) (5) (6) (7) 커널 공간
Qna