리눅스 디바이스 드라이버

2024. 11. 23. 15:25디바이스 드라이버

디바이스 드라이버를 공부하면서 이 내용을 왜 공부하는지에 대해 궁금해서 작성하는 내용이다.

 

디바이스 드라이버란?

리눅스 디바이스 드라이버는 리눅스 커널의 중요한 구성 요소로, 운영 체제가 하드웨어와 상호 작용을 할 수 있도록 중간 역할을 한다. 디바이스 드라이버는 특정 하드웨어 장치를 제어하는 데 필요한 로직과 인터페이스(서로 다른 두 개의 시스템, 장치 사이에서 정보나 신호를 주고받는 경우의 접점이나 경계면)를 제공한다. 리눅스에서는 다양한 유형의 하드웨어를 지원하기 위해 많은 드라이버가 포함되어 있으며, 이를 통해 하드웨어와 소프트웨어가 원활히 통신할 수 있다.

 

운영 체제는 유저모드와 커널모드라는 두 가지 주요 실행 모드를 가지고 있다. 유저모드는 어플리케이션 (웹 브라우저, 텍스트 편집기 등)이 실행되는 모드이다. 유저모드에선 제한된 CPU 명령과 메모리 액세스 권한을 가진다. 그 이유는 유저모드에서 권한이 많을수록 보안이 취약해지기 때문이다. 그렇기 때문에 하드웨어에 직접 접근할 수 없으며, 운영체제 커널을 통해서만 간접적으로 접근이 가능하다. 일반적으로 시스템 콜을 사용해 커널에 기능을 요청한다.

 

커널모드는 운영체제의 핵심 부분이 실행되는 모드이다. 유저모드와는 다르게 하드웨어(메모리, 디스크, 네트워크 등)와 직접 상호작용이 가능하다. 커널모드를 통해 하드웨어와 상호작용을 해야하기 때문에 모든 CPU 명령 및 메모리에 대한 완전한 접근 권한을 보유한다.

 

디바이스 드라이버는 커널모드에서 동작하는 소프트웨어 컴포넌트이다. 드라이버는 하드웨어 장치를 제어하고 유저모드 어플리케이션과 하드웨어 사이에서 중간 역할을 수행한다.

 

디바이스 드라이버의 유형

리눅스에서는 드라이버가 지원하는 장치에 따라 크게 세 가지로 나뉜다.

 

1. 문자 디바이스 드라이버

- 장치를 파일처럼 접근하여 직접 read/write를 수행한다. 데이터 형태는 stream 방식으로 전송한다.

- 주로 키보드, 마우스, 시리얼 포트, 터미널 등에서 사용된다.

 

2. 블록 디바이스 드라이버

- 데이터를 고정된 크기의 블록 단위로 처리하는 장치를 위한 드라이버.

- 데이터 접근이 랜덤 접근 방식으로 이루어질 수 있다.

- 주로 하드 디스크, SSD, USB 스토리지 장치 등에서 사용된다.

 

3. 네트워크 디바이스 드라이버

- 데이터 패킷 전송을 처리하며, 네트워크 인터페이스 카드(NIC)를 제어하는 드라이버.

(네트워크 인터페이스 카드란? : 컴퓨터와 네트워크 사이의 중개자 역할을 하는 칩. 사용자가 웹페이지를 요청하면 컴퓨터는 요청을 네트워크 카드로 전달하고, 네트워크 카드는 이러한 신호를 받아 데이터로 변환)

- 패킷 기반 통신을 지원하며, 소켓 API와 함께 동작한다.

(패킷 기반 통신이란? : 작은 블록의 패킷으로 데이터를 전송하며 데이터를 전송하는 동안만 네트워크 자원을 사용하는 방법)

- 유선 네트워크 드라이버(이더넷), 무선 네트워크 드라이버(Wi-fi)등에서 사용된다.

 

리눅스 드라이버의 주요 구성

1. 커널 모듈

- 드라이버는 일반적으로 커널 모듈로 작성되며 필요할 때 insmod 명령어를 통해 동적으로 로드하고 rmmod 명령어를 통해 언로드한다.

2. 장치 파일

- /dev 디렉토리에 위치하며, 사용자 공간과 드라이버 간의 인터페이스를 제공한다.

- 주 번호(Major Number)로 드라이버를 식별한다.

- 부 번호(Minor Number)로 같은 드라이버에 연결된 특정 장치를 식별한다.

3. 커널 API

- 드라이버는 커널에서 제공하는 API(서로 통신하고 상호작용할 수 있도록 도와주는 규칙과 도구의 집합)를 사용해 장치와 상호작용하거나 리소스(서비스, 프로세스, 어플리케이션이 실행되기 위해 필요한 자원)를 관리한다.

 

디바이스 드라이버 개발 과정

1. 환경 설정 : 리눅스 커널 소스 코드 및 빌드 환경 구성

2. 코드 작성 : C언어를 사용해 드라이버 개발

3. 컴파일 : 드라이버 코드를 커널 모듈로 컴파일 (Makefile 필요)

4. 로드 : insmod 명령어로 커널에 로드

5. 테스트 : /dev 파일을 통해 드라이버와 상호작용하며 테스트

6. 디버깅 : dmesg, printk 등을 사용해 로그 확인.

'디바이스 드라이버' 카테고리의 다른 글

Makefile 실습  (1) 2024.11.26
QEMU에서 리눅스 실행하기  (0) 2024.11.23
리눅스 커널 빌드하기  (1) 2024.11.21
Rootfs 빌드 하기  (0) 2024.11.20
Makefile 문법 파악하기  (1) 2024.11.19