Notice
Recent Posts
Recent Comments
Link
승코딩당당당
[리눅스] 디바이스 드라이버의 이해 본문
이번 글에서는 디바이스 드라이버의 개념과 구조를 정리하였다.
입출력 장치와 버스 구조부터 시작해, I/O 자원 관리 방식(Polling, Interrupt, DMA),
Memory-mapped I/O 구조, 그리고 리눅스에서의 디바이스 파일 개념까지 단계적으로 설명하였다.
특히 리눅스 환경에서 디바이스가 파일처럼 관리되는 구조와 Character/Block/Network 디바이스의 차이를 이해하는 것을 목표로 한다.
운영체제와 하드웨어 사이의 연결 고리를 이해하는 데 중요한 기초 개념이다.
입출력 장치(I/O 디바이스)
- CPU와 정보를 교환하는 장치
- Digital 신호 또는 non-digital 신호를 포함한다
- CPU와는 digital 신호를 통해 연결된다
버스 (Bus)
- 버스란?
- CPU(들), RAM 그리고 개인용 컴퓨터에 연결할 수 있는 여러 입출력 장치 사이에 정보가 흘러갈 수 있는 경로
- 버스의 구성
- 주소 버스 (address bus)
- 주소를 병렬로 전송하는 라인 모임
- 메모리 장치 또는 입출력 장치의 위치 정보를 나타낸다
- 제어 버스 (control bus)
- 연결된 회로에 제어 정보를 전송하는 라인 모임
- 읽기 또는 쓰기를 제어하는 용도로 사용된다
- 데이터 버스 (data bus)
- 데이터를 병렬로 전송하는 라인 모임
- 주소 버스 (address bus)
I/O 장치의 어드레스 할당
- 각각의 I/O 장치를 제어하기 위해서는 번지 할당이 필요하다
- 표준 I/O-mapped I/O
- 전용 I/O 번지를 할당하여 사용
- 인텔 x86 CPU 계열이 대표적이다
- 메모리 맵 (Memory mapped) I/O
- 메모리 번지의 일부를 활용하여 사용
- 대부분의 임베디드 프로세서에서 사용한다
디바이스 제어 프로그램
- 입출력 장치 또는 I/O 디바이스
- 네트워크 어댑터, LCD 디스플레이, Audio, 터미널, 키보드, 하드디스크, 플로피디스크, 프린터 등과 같은 주변 장치를 말한다
- 디바이스 제어 프로그램
- 디바이스 구동에 필요한 프로그램
- 초기화, 입력 및 출력 제어 프로그램으로 구성된다
- 디바이스를 사용하기 위해 필수적으로 요구된다
I/O 자원 관리
- Polling 방식
- 한 프로그램이나 장치에서 다른 프로그램이나 장치들이 어떤 상태에 있는지를 지속적으로 검사하는 전송 제어 방식
- I/O 장치의 접속 여부 및 데이터 전송 요청과 종료를 검사한다
- 인터럽트
- 프로세서는 일련의 처리를 수행하다가, 주변 장치에서 입출력 처리 동작이 필요한 경우 진행 중이던 명령을 멈추고 새로운 동작을 수행할 수 있도록 한다
- 인터럽트를 이용하면 멀티태스킹을 지원할 수 있어, 사용자는 모든 작업이 동시에 수행되는 것처럼 보이게 된다
- DMA 사용
- DMA(Direct Memory Access) 방식은 CPU의 개입 없이 I/O 장치와 기억 장치 사이에 데이터를 전송하는 방식이다
디바이스 드라이버
- 하드웨어를 제어하는 프로그램과 애플리케이션에서 디바이스를 제어하기 위한 자료 구조
- 입출력 장치 제어 프로그램의 주요 기능
- 하드웨어 초기화
- 데이터 전송
- 데이터 수신
- 응용 프로그램이 H/W를 제어할 수 있도록 인터페이스를 제공한다
디바이스 파일
- 리눅스의 디바이스 드라이버
- 가상 파일 시스템(VFS)에 의해 일반 파일 시스템과 공통적인 인터페이스를 제공한다
- 디바이스 관리를 파일 관리 방법과 동일한 방법으로 수행한다
- 응용 프로그램에서는 일반 파일을 처리하는 경우와 동일한 시스템 콜을 호출하여 디바이스를 제어한다
- 디바이스 파일 또는 디바이스 노드(node)
- 루트 파일 시스템의 dev 폴더(/dev)에 있다
- 디바이스를 표준 파일 시스템으로 관리할 수 있는 인터페이스를 제공한다
- 디바이스 정보
- 디바이스 이름
- 문자 디바이스 또는 블록 디바이스 구분 정보
- 드라이버를 선택하기 위한 주번호와 부번호
- 접근 권한 정보
디바이스 자원 활용
- 입출력 장치 제어 프로그램
- 입력된 데이터를 어드레스, 데이터 버스 및 제어 신호를 이용하여 읽어서 메모리에 저장하거나 처리한다
- 데이터를 보내고자 하는 경우에는 메모리에 이미 만들어진 데이터 또는 새로 생성된 데이터를 입출력 장치에 기록한다
- 입출력 장치의 자원을 사용하기 위한 주소 공간
- 메모리 맵 방식(Memory mapped peripheral)을 사용한다
- 별도로 입출력 주소를 할당하지 않고, 프로세서가 사용하는 전체 메모리의 일부를 입출력 장치 공간으로 할당하여 사용한다
- 메모리 맵 방식(Memory mapped peripheral)을 사용한다
- 프로세서, 메모리 장치, 입출력 장치 간의 데이터 교환
- 폴링, 인터럽트 또는 DMA 방식을 사용한다
디바이스 드라이버의 종류
- Character devices
- Character 디바이스는 File과 같이 사용되며, 디바이스 드라이버를 만드는 것은 디바이스를 파일처럼 사용할 수 있도록 하는 것이다
- Character 디바이스는 “/dev/ttyS0”와 같이 file system node로 접근한다
- 콘솔, parallel 포트 등이 Character 디바이스의 예가 될 수 있다
- Block devices
- Block 디바이스는 Character 디바이스와 유사하지만, 접근되는 데이터의 단위가 수 kB의 블록 단위로 이루어진다
- Block 디바이스도 file system node로 접근된다
- DISK가 Block 디바이스의 예가 될 수 있다
- Network interface
- 네트워크로 연결된 다른 호스트와 데이터를 교환한다
- 애플리케이션에서 커널 영역의 드라이버에 접근하는 방법은 Character 디바이스나 Block 디바이스와 달리 file system node를 사용하지 않는다
'개발 > 임베디드' 카테고리의 다른 글
| [TC275] GPIO 입력으로 LED 제어 + OMR 레지스터 (2) | 2026.02.19 |
|---|---|
| [리눅스] 라즈베리파이 커널 모듈로 LED 제어하기 (0) | 2026.02.13 |
| [리눅스] 리눅스 커널: 예외처리와 인터럽트 (0) | 2026.02.12 |
| [리눅스] 리눅스 커널: 메모리 (0) | 2026.02.12 |
| [리눅스] 리눅스 기초 정리 (파일, 디렉터리, 셸) (0) | 2026.02.11 |