편집자 주: 임베디드 리눅스는 임베디드 시스템 설계에서 가장 인기 있는 운영체제 중 하나로 꾸준히 자리잡고 있습니다. 사물인터넷의 폭발적 성장과 함께 IoT 애플리케이션 모든 계층에서의 다재다능함은 필수적입니다. 임베디드 리눅스 마스터링은 엔지니어가 정교하고 신뢰할 수 있는 시스템을 신속히 개발하게 합니다. Mastering Embedded Linux Programming – Second Edition에서 크리스 시몬즈(Chris Simmonds)는 명확하고 실용적인 예제로 이 강력한 OS를 독자들에게 안내합니다.
9장에서 발췌한 이 글에서 저자는 커널 디바이스 드라이버가 하드웨어와 어떻게 인터페이스하는지, 개발자가 어떻게 이 드라이버를 작성하고 활용할 수 있는지, 그리고 이 지식이 임베디드 엔지니어에게 왜 중요한지 설명합니다. 다음 섹션들이 핵심 개념을 분해합니다:
역할 이해
런타임 드라이버 상태 읽기
사용자 공간 디바이스 드라이버
커널 디바이스 드라이버 작성
하드웨어 구성 발견
Mastering Embedded Linux Programming – Second Edition, 크리스 시몬즈(Chris Simmonds) 저에서 발췌.
제9장. 디바이스 드라이버와의 인터페이싱
커널 디바이스 드라이버는 하부 하드웨어를 시스템 나머지 부분에 노출합니다. 임베디드 시스템 개발자로서 이 드라이버가 전체 아키텍처에 어떻게 들어맞는지, 사용자 공간 애플리케이션에서 어떻게 접근하는지 이해해야 합니다. 대부분의 시스템은 공통 주변장치 드라이버를 포함하므로 GPIO 핀, LED, SPI, I²C 같은 하드웨어를 커널 코드 작성 없이 조작할 수 있습니다. 그러나 커스텀 하드웨어를 만나면 드라이버를 작성하거나 수정해야 합니다.
이 장은 다룹니다:
디바이스 드라이버의 역할
문자 디바이스
블록 디바이스
네트워크 디바이스
런타임 드라이버 정보 파악
적합한 디바이스 드라이버 찾기
사용자 공간 디바이스 드라이버
커널 디바이스 드라이버 작성
하드웨어 구성 발견
디바이스 드라이버의 역할
4장에서 설명한 대로 커널은 시스템의 수많은 하드웨어 인터페이스를 캡슐화해 사용자 공간에 일관된 방식으로 제시합니다. 디바이스 드라이버는 이 커널 계층과 하부 물리적 하드웨어 사이를 중재합니다. 실제 디바이스(UART, MMC 등)나 가상 디바이스(/dev/null, 램디스크 등)를 제어할 수 있습니다. 단일 드라이버가 동일 유형 디바이스 여러 인스턴스 관리 가능.
커널 드라이버는 전체 권한으로 실행되어 프로세서 레지스터 접근, 인터럽트 처리, DMA 수행. 커널의 견고한 동기화 및 메모리 관리 인프라 활용. 하지만 이 힘은 위험 동반: 버그 있는 드라이버는 전체 시스템 크래시 유발. 따라서 드라이버는 단순하게 유지해 데이터와 연산 제공하고 정책 결정은 사용자 공간에 맡겨야. 예를 들어 플러그인 이벤트 대응 모듈 로딩은 커널이 아닌 사용자 공간 데몬 udev가 처리.
리눅스는 드라이버를 세 가지 주요 유형으로 분류:
문자(Character) – 버퍼링 없는 I/O, 얇은 인터페이스; 커스텀 드라이버 기본 선택.
블록(Block) – 대용량 스토리지 블록 I/O용, 광범위한 버퍼링; 타 용도 부적합.
네트워크(Network) – 블록 디바이스 유사하나 패킷 송수신 처리.
네 번째 범주는 가상 파일시스템으로, 드라이버 기능을 파일 그룹으로 노출(예: GPIO를 /sys/class/gpio로 접근). 이 장은 처음 세 유형을 깊이 탐구로 시작.
문자 디바이스
문자 디바이스는 사용자 공간에서 디바이스 노드라 불리는 특수 파일로 나타납니다. 각 노드는 메이저 번호로 드라이버에 매핑되고 마이너 번호로 특정 인터페이스 식별. 예를 들어 ARM Versatile PB에서 첫 시리얼 포트는 /dev/ttyAMA0로 메이저 204, 마이너 64; 두 번째 포트 동일 메이저에 마이너 65. 네 포트 전체 목록:
# ls -l /dev/ttyAMA* crw-rw---- 1 root root 204, 64 Jan 1 1970 /dev/ttyAMA0 crw-rw---- 1 root root 204, 65 Jan 1 1970 /dev/ttyAMA1 crw-rw---- 1 root root 204, 66 Jan 1 1970 /dev/ttyAMA2 crw-rw---- 1 root root 204, 67 Jan 1 1970 /dev/ttyAMA3
표준 메이저/마이너 번호는 Documentation/devices.txt에 나열되지만, 커스텀 디바이스는 커널 소스 정의 값 사용 가능. 예를 들어 PL011 UART 드라이버 선언: