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

by makersweb posted Apr 19, 2014
?

단축키

Prev이전 문서

Next다음 문서

ESC닫기

크게 작게 위로 아래로 댓글로 가기 인쇄

디바이스 파일(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함수를 사용해 쓸 수 있다.

 

file_operations 의 구조체 원형