디바이스 드라이버란?
디바이스 드라이버(device driver)란, 하드웨어를 제어하기 위해 하드웨어 특성이나 레지스터 설정 등 디바이스 제어를 위한 기능을 담고 있는 layer로, 리눅스에선 커널의 일부분으로 구성된다. 디바이스 드라이버는 디바이스 관리에 필요한 정형화된 인터페이스를 구현하기 위해 필요한 함수와 자료구조의 집합체로, 리눅스 커널에서 동일 디바이스끼리 비슷한 서비스를 제공하기 위해 커널 내에서 관련 기능을 제공한다.
사용자 영역의 디바이스들은 커널 영역에서의 실제 디바이스들과 매핑되어야 한다. 디바이스 드라이버는 추상화 개념을 제공해야 하는데, 애플리케이션 관점에서 해당 디바이스에 대한 자세한 구현은 알 필요가 없이 파일 시스템으로 접근할 수 있어야 한다.
디바이스 드라이버는 디바이스를 추상화하여 애플리케이션에서 시스템 호출 인터페이스를 통해 디바이스에 접근할 수 있도록 해주는데, 리눅스는 이를 위해 가상 파일 시스템(virtual file system) 레이어를 제공한다.
open(), read(), write(), close(), fcntl()/ioctl() 함수와 같은 기본적인 유닉스의 파일 I/O 시스템 콜을 사용하여 데이터 입출력을 제어할 수 있다.

디바이스 드라이버는 크게 세 가지의 유형으로 구분된다. 키보드처럼 입출력 단위가 문자인 문자 디바이스(character device)와 하드디스크처럼 입출력 단위가 블록인 블록 디바이스(block device) 그리고 네트워크 디바이스(network device)로 나누어볼 수 있다. 유닉스에서 문자나 블록 디바이스들은 /dev 디렉터리에 위치하는 하나의 파일로 인식된다.
리눅스는 디바이스를 특수한 파일로 취급하며, 커널에서 디바이스에 접근할 때 주 번호와 부 번호를 사용한다. 커널은 네트워크 카드, 사운드 카드, 비디오 카드 등 각각의 디바이스를 구분하고 연결하기 위해 주 번호(major number)을 부여하고, 같은 종류의 여러 개 또는 하나의 디바이스에 있는 여러 채널(파티션)을 구분하기 위해 부 번호(minor number)를 사용한다.
예를 들어 /dev/tty0, /dev/ttyUSB0, /dev/tty2 등의 파일에서 tty는 터미널을 의미하는 장치로 4번이 주 번호고, tty 뒤에 따라오는 0,1,2 등의 숫자가 여러 터미널을 의미하는 부 번호이다.
주 번호는 1바이트로 0~255 사이의 정숫값으로 표현되며, 기본적으로 0~100까지는 표준 디바이스에 고정적으로 사용되고 있다. 하드디스크는 3번, tty는 4번, SCSI 디바이스들은 21번의 주 번호를 갖는데, 같은 디바이스는 같은 주 번호를 가진다. 또한, 부 번호는 각 디바이스의 부가적인 정보를 표시하는데, 2바이드로 구성되며, 상위 8비트는 디바이스의 타입을 의미하고 하위 8비트는 각각의 다른 디바이스 번호를 의미한다.
디바이스 드라이버의 3가지 유형
1. 문자 디바이스
문자 디바이스는 문자 데이터가 순차적으로 들어오는 디바이스로, 일반적으로 키보드나 터미널, serial/parallel 포트를 사용하여 통신하는 모뎀, 스캐너, 프린터나 사운드 카드 등의 디바이스들이 있다. 문자 디바이스는 buffer cache를 사용하지 않고 디바이스의 raw data를 애플리케이션에 전달한다.
ls 명령어에서 살펴본 것 처럼, 문자 디바이스는 c로 시작한다.

2. 블록 디바이스
블록 디바이스는 하드디스크나 CD-ROM, 메모리 등의 디바이스들이 속하며, 블록 단위로 입출력이 가능하고 random access(임의 접근)이 가능하다. 블록이란 임의의 크기의 데이터 단위로, 데이터 입출력을 위해 버퍼 캐시를 사용하고, 데이터 동기화를 위한 sync 과정이 필요하다. 블록 디바이스는 주로 파일 시스템에 의해 mount되며 ls 명령어에서 b로 시작한다.
3. 네트워크 디바이스
이더넷, PPP, ATM, ISDN 등의 디바이스 드라이버로 네트워크 통신을 통해 인터넷상의 패킷을 주고받을 수 있는 다바이스다. soket() 시스템 콜에 의해 열리며 다른 디바이스와는 달리 일반적인 디바이스 파일이 없지만, ifconfig와 같은 명령어를 통해 현재의 네트워크 디바이스에 대한 사항들을 살펴볼 수 있다.
참고
책 "사물인터넷을 위한 리눅스 프로그래밍 with 라즈베리파이", 782-789
'Embedded Systems > 리눅스' 카테고리의 다른 글
| [Linux] U-boot 가 리눅스 커널을 로드하는 구체적인 과정 정리(1) (0) | 2025.10.30 |
|---|---|
| [Linux] 임베디드 리눅스 부팅 순서 + 비글본 블랙(BBB) 부팅 순서 (0) | 2025.10.28 |
| [Linux] 리눅스의 프로그래밍 도구 (GCC, make, gdb 유틸리티) (0) | 2025.10.27 |
| [linux] gcc를 이용한 소스 코드 빌드 과정 (0) | 2025.10.21 |
| 부트로더(bootloader)란 무엇인가? (0) | 2025.10.21 |
