한국어
Linux Programming

디바이스 드라이버에 대해서

makersweb 2014.04.19 13:28 조회 수 : 3355

디바이스 파일(device file)은 장치 하드웨어 공간의 디바이스 드라이버에 대응하는 파일이다.

장치 파일의 inode는 장치 유형 (type), 주번호(major number), 부번호(minor number)로 구성된다.


디바이스 파일 생성은 mknod 명령어를 이용하여 수행한다.

mknod /dev/file_name [c|b] major_number minor_number

주번호는 커널이 디바이스와 연관된 드라이버를 구분하는 데 사용된다.

부번호는 드라이버가 각 디바이스를 구분하는데 이용된다.


디바이스 드라이버 프로그램


다음은 간단한 문자 디바이스 드라이버를 만들고, 이것을 커널에 설치하는 방법을 설명한다.


기본적인 문자 디바이스 드라이버의 동작과정


문자디바이스 드라이버의 동작과정은 [그림 6.8]과 같은 과정을 거치며 실행된다.



기본적인 문자 디바이스 드라이버의 형태

(1) 기본적인 문자 드라이버의 골격

문자 디바이스 드라이버의 골격은 기본적으로 아래와 같은 단계로 구성된다.


▣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메모리 영역에 반환한다.


(2)file_operations의 구조체

사용자가 디바이스 드라이버를 만들 때 file_operations의 구조체를 사용하는 이유는 표준화된 인터페이스를 제공하기 위해서이다.

리눅스에서의 모든 자이 디바이스는 하나의 파일처럼 동작하도록 되어있으며, 이때에 사용되는 함수들이 file_operations 구조체에 등록되어있다. 예를 들어 디바이스 드라이버에서 데이터를 전송하기 위하여 쓰기 동작을 할 때에 file_operations에 있는 write함수를 사용해 쓸 수 있다.


file_operations 의 구조체 원형