본문 바로가기

Computer Science/OperatingSystem

디바이스 드라이버 (Device Driver) 개념

오늘은 디바이스 드라이버에 대한 내용을 정리해보도록 하겠습니다. 

디바이스 드라이버 (Device Driver)?

디바이스들을 동작시키기 위해서는 구동용 소프트웨어가 필요한데, 이러한 소프트웨어를 디바이스 드라이버라고 합니다.

특히, 응용 프로그램에서 하드웨어 장치를 이용해서 데이터를 직접 읽고 쓰거나 제어해야 하는 경우 또는 소프트웨어적인 디바이스를 만든 경우 디바이스 드라이버 사용합니다. 

 

디바이스 드라이버 특징

 -   디바이스와 시스템 사이에 데이터를 주고받기 위한 인터페이스를 제공하는 커널 내부 기능 중 하나

 -   커널의 일부분으로 내장되어 커널 모드에서 실행되며, 메모리에 상주하며 스왑 되지 않음

 -   디바이스 드라이버는 디바이스를 하나의 파일로 추상화 시켜줘서, 디바이스를 디바이스 파일 (/dev/…)을 통해 파일 처럼 액세스 가능하여 사용자는 파일에 대한 연산 해주면 됨.

 -   디바이스마다 고유의 번호 (Major number, 12bit), (Minor number, 20bit)를 가지고 있고, 이 번호로 디바이스를 구분

 

디바이스 종류

디바이스 종류는 크게 3가지로 분류될 수 있습니다. 문자 디바이스, 블록 디바이스, 네트워크 디바이스 이렇게 구성되어있습니다. 

 

1. 문자 디바이스 (Character device)

자료의 순차성을 지닌 장치로 버퍼를 사용하지 않고 바로 읽고 쓸 수 있는 장치

(직렬 포트, 병렬 포트, 마우스, PC 스피커, 터미널 등)

 

2. 블록 디바이스 (Block device)

버퍼 캐시(Cache)를 통해 블록 단위로 입출력되며, 랜덤 액세스가 가능하고, 파일 시스템을 구축할 수 있음

(플로피 디스크, 하드 디스크, CD-ROM, RAM 디스크 등)

 

3. 네트워크 디바이스 (Network device)

네트워크 통신을 통해 네트워크 패킷을 주고받을 수 있는 디바이스  

(Ethernet, PPP, ATM, ISDN, NIC(Network Interface Card)

 

커널 모듈 프로그래밍을 위한 리눅스 명령어 

-        insmod : 커널에 모듈을 올림

-        rmmod : 커널에서 모듈을 삭제함

-        lsmod : 커널에 적재된 모듈 목록 보여줌

-        mknod : 장치 특수 파일을 만듦

-        depmod : 커널 모듈 간의 의존성을 검사

-        modinfo : 모듈들을 검사하여 관련된 정보 보여줌

-        modprobe : depmod 명령으로 생성된 종속성 정보를 이용하여 지정된 디렉터리의 모듈들과 연관된 모듈들을 자동으로 로딩

-        ksyms : Export 되어 있는 커널의 심볼 목록 (/proc/ksyms)을 보여줌

-        nm : 오브젝트 파일에 있는 심볼들의 목록을 보여줌

 

(부가 설명)

커널 심볼 테이블이란 시스템 콜 테이블과 비슷하게 적재된 커널들을 등록하여 놓는 배열이다. 이러한 커널 심볼 테이블에 들어있는 모듈들의 이름은 /proc/ksyms 디렉터리 혹은 /proc/module/ 아래에 파일처럼 나열되어 있는 것을 발견할 수 있다.

 

Device driver functions 

디바이스 드라이버를 작성할 때, 주로 사용되는 함수들입니다. 

 

-        open()

해당 디바이스에 연산을 가하기 위해 해당 디바이스 파일을 열기 위한 함수, 사용 수 증가

-        read()

해당 디바이스로부터 얻은 데이터를 커널 영역에서 사용자 영역으로 복사하기 위한 함수

-        write()

사용자 영역의 데이터를 커널 영역으로 복사하기 위한 함수

-        release()

해당 드라이버가 응용프로그램에 의해 닫힐 때 호출하는 함수

-        unlocked_ioctl()

읽기/쓰기 이외의 부가적인 연산을 위한 인터페이스, 디바이스 설정 및 하드웨어 제어

 

-        ioremap() : 해당 메모리의 물리 주소를 커널의 가상 주소에 매핑

커널에서 I/O 장치의 physical address에 직접 접근하고자 할 때 사용

커널 수준 (Device driver )에서 직접 커널 수준 (디바이스 접근)으로 접근

Device driver 내에서 작성시 드라이버 코드 내에 mmap 대신 ioremap 사용

 

-        mmap() : 응용 프로그램의 가상 주소에 해당 메모리의 물리 주소 매핑

응용 프로그램에서 I/O 장치의 physical address에 직접 접근하고자 할 때 사용

즉 사용자 레벨에서 커널 레벨(디바이스 접근)로 직접 접근

 

코드를 작성할 때 ioremap을 사용해서 하는 것이 safesafe 한 프로그램을 만드는 관점에서는 정석

mmap의 장점은 응용 프로그램에서 직접 I/O 장치로 접근함으로 속도가 빠름.

 

아래 그림은 ioremap()과 mmap()이 어떻게 사용되는지 보여주기 위한 그림입니다. 

간단하게 디바이스 드라이버를 작성하는데 필요한 내용들을 다뤄보았습니다.