한국어
Linux Programming
 

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

makersweb 2014.04.19 13:28 조회 수 : 4122

디바이스 파일(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 의 구조체 원형

번호 제목 글쓴이 날짜 조회 수
24 Wayland에 대한 간단한 소개 file makersweb 2017.12.29 3384
23 NFS를 통해 파일시스템 공유 makersweb 2018.03.05 1135
22 Ubuntu Linux에서 dbus-c++바인딩 D-Bus 테스트 file makersweb 2018.03.07 7075
21 tslib 크로스 컴파일과 터치스크린 보정 makersweb 2018.08.02 2183
20 libblkid - USB Storage의 정보 가져오기 makersweb 2018.10.18 676
19 리눅스 컴파일러 최신으로 업데이트 linux 2018.12.26 1900
18 PATH에 새로운 경로 추가 makersweb 2019.09.19 401
17 플랫폼 디바이스 드라이버 개발 시 많이 사용되는 커널 API 및 매크로 makersweb 2020.01.28 4753
16 initramfs (initial ram file system: 초기 램 파일 시스템) makersweb 2020.02.25 2109
15 64비트 리눅스에서 32비트 응용프로그램을 실행하려면 makersweb 2020.02.29 1820
14 Weston 의 설명 및 관련 컴포넌트 makersweb 2020.06.03 2540
13 Wayland 의 주요 객체들 makersweb 2020.06.04 940
12 Wayland 의 Client Application 프로그래밍 기본 루틴 makersweb 2020.06.04 1704
11 wayland-scanner 를 통해 Wayland 프로토콜 코드생성 makersweb 2020.06.08 968
10 리눅스 오디오 스택과 아키텍처 file makersweb 2020.09.02 2929
9 dbus-broker를 기본 DBus 구현으로 설정 makersweb 2021.01.20 1243
8 SocketCAN 유틸 사용방법 file makersweb 2022.02.05 7257
7 ifconfig 는 대부분 ip 명령으로 대체 makersweb 2022.02.12 1649
6 D-Bus ObjectManager file makersweb 2022.02.12 669
5 리눅스에서 네트워크 구성 makersweb 2022.06.11 2929