디바이스 파일(device file)은 장치 하드웨어 공간의 디바이스 드라이버에 대응하는 파일이다. 장치 파일의 inode는 장치 유형 (type), 주번호(major number), 부번호(minor number)로 구성된다.
디바이스 파일 생성은 mknod 명령어를 이용하여 수행한다.
mknod /dev/file_name [c|b] major_number minor_number
주번호는 커널이 디바이스와 연관된 드라이버를 구분하는 데 사용되고 부번호는 드라이버가 각 디바이스를 구분하는데 이용된다.
다음은 간단한 문자 디바이스 드라이버를 만들고, 이것을 커널에 설치하는 방법을 설명한다.
기본적인 문자 디바이스 드라이버의 형태
문자 디바이스 드라이버의 골격은 기본적으로 아래와 같은 단계로 구성된다.
▣Header Files : 첫 번째 단계로 디바이스 드라이버에서 사용할 헤더를 정의한다.
▣Funtion Prototypes : 두 번째 단계로 디바이스 드라이버에서 사용될 함수들을 작성한다. 기본적으로 사용자 공간의 응용 프로그램에서 다비아스 드라이버들을 open하고 close할 때 사용되는 open과 release함수 등을 작성하고 디바이스 특징에 따라 file_opertations의 구조체에 포함한 함수들을 작성한다.
▣File Operation : 세 번째 단계로 위에서 작성된 함수들을 각각의 특성에 맞게 file_operations 구조체에 등록한다.
▣모듈설치: 네 번째 단계에서 init_module 함수를 이용하여 디바이스 드라이버를 커널에 적재한다.
▣모듈제거: 다섯 번째에서 cleanup_module 함수를 이용하여 디바이스 드라이버를 커널에 제거한다.
따라서 일반적인 문자/블록 디바이스 드라이버를 구성할 때 기본 골격은 Header Files, Funtion Prototype, File Operation으로 구분되며 다음과 같다.
①Header Files
#include<linux/kernel.h> #include<linux/module.h> #include<linux/init.h> |
②Funtion Prototype
int device_open(...) {...} //디바이스 드라이버를 open하는 함수 int device_release(...) {...} //디바이스 드라이버를 close하는 함수 ssize_t device_write(...) {...} //디바이스 드라이버에 write하는 함수 ssize_t device_read(...) {...} //디바이스 드라이버에 read하는 함수 |
③File Operation
static struct file_operations device_fops = ... ssize_t (*read) (...); ssize_t (*write) (...); ... int (*open) (...); int(*release) (...); ... }; |
④모듈 설치시 초기화 수행
int init_module(void) {...} |
init_module()함수는 디바이스 드라이버를 등록할 때에 사용되는 함수로서 메모리 할당이나 초기화 할 때에 사용된다.
⑤모듈 제거 시 커널로 반환 작업수행
void cleanup_module(void) {...} |
cleanup_module() 함수는 디바이스 드라이버를 제거할 때에 사용되는 함수로서 init_module()함수에 의해 탑재되었던 디바이스 드라이버를 할당된 I/O메모리 영역에 반환한다.
file_operations 구조체
사용자가 디바이스 드라이버를 만들 때 file_operations의 구조체를 사용하는 이유는 표준화된 인터페이스를 제공하기 위해서이다.
리눅스에서의 모든 자이 디바이스는 하나의 파일처럼 동작하도록 되어있으며, 이때에 사용되는 함수들이 file_operations 구조체에 등록되어있다. 예를 들어 디바이스 드라이버에서 데이터를 전송하기 위하여 쓰기 동작을 할 때에 file_operations에 있는 write함수를 사용해 쓸 수 있다.
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
25 | libblkid - USB Storage의 정보 가져오기 | makersweb | 2018.10.18 | 1219 |
24 | tslib 크로스 컴파일과 터치스크린 보정 | makersweb | 2018.08.02 | 2682 |
23 | Ubuntu Linux에서 dbus-c++바인딩 D-Bus 테스트 | makersweb | 2018.03.07 | 7709 |
22 | NFS를 통해 파일시스템 공유 | makersweb | 2018.03.05 | 1639 |
21 | Wayland에 대한 간단한 소개 | makersweb | 2017.12.29 | 4027 |
20 | Ubuntu16.04에서 weston구동 | makersweb | 2017.12.28 | 1519 |
19 | UVC 장치를 사용할때 v4l2: select timeout 에러 발생 | makersweb | 2017.12.27 | 2933 |
18 | [IPC]D-Bus 소개 | makersweb | 2015.02.28 | 30426 |
17 | 리눅스 데스크탑 환경 종류 | pjk | 2015.02.11 | 5117 |
» | 디바이스 드라이버에 대해서 | makersweb | 2014.04.19 | 4623 |
15 | 리눅스 커널 소스코드 구성도 | makersweb | 2014.03.04 | 5969 |
14 | read() 함수, write() 함수 | makersweb | 2014.03.04 | 11856 |
13 | 리눅스 디렉터리 구조 | makersweb | 2014.02.28 | 3698 |
12 | 1. make | pjk | 2014.02.05 | 2534 |
11 | 2. 간단한 Makefile | pjk | 2014.02.05 | 2987 |
10 | 3. 매크로(Macro) 와 확장자(Suffix) 규칙 | pjk | 2014.02.05 | 3016 |
9 | 4. Makefile를 작성할 때 알면 좋은 것들 | pjk | 2014.02.05 | 3522 |
8 | 5. make 중요 옵션 정리 | pjk | 2014.02.05 | 2905 |
7 | 6. Makefile 작성의 가이드라인 | pjk | 2014.02.05 | 2857 |
6 | mmap() 함수, munmap() 함수 | pjk | 2014.02.05 | 16617 |