승코딩당당당

[리눅스] 디바이스 드라이버의 이해 본문

개발/임베디드

[리눅스] 디바이스 드라이버의 이해

승코딩당당당 2026. 2. 12. 17:32

 

이번 글에서는 디바이스 드라이버의 개념과 구조를 정리하였다.
입출력 장치와 버스 구조부터 시작해, 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)
      • 데이터를 병렬로 전송하는 라인 모임

 

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)을 사용한다
      • 별도로 입출력 주소를 할당하지 않고, 프로세서가 사용하는 전체 메모리의 일부를 입출력 장치 공간으로 할당하여 사용한다
  • 프로세서, 메모리 장치, 입출력 장치 간의 데이터 교환
    • 폴링, 인터럽트 또는 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를 사용하지 않는다