2025. 3. 6. 19:43ㆍ프로그래밍/시스템
4.1 기본적인 디바이스 드라이버 개념
🔹 디바이스 드라이버의 역할과 구조
디바이스 드라이버(Device Driver) 는 운영체제(OS)와 하드웨어를 연결하는 중요한 소프트웨어입니다.
커널과 하드웨어 간의 인터페이스를 제공하여, 응용 프로그램이 직접 하드웨어를 제어하지 않고 표준 API를 통해 접근할 수 있도록 지원합니다.
✅ 디바이스 드라이버의 역할
- 하드웨어 제어: CPU, 메모리, 네트워크, 저장 장치 등의 장치를 관리
- 커널과 하드웨어 간 인터페이스 제공: 응용 프로그램이 직접 하드웨어를 제어하는 것을 방지
- 시스템 자원 관리: 장치의 입출력(I/O) 및 메모리 사용 관리
- 인터럽트 처리: 하드웨어 이벤트(예: 키보드 입력, 네트워크 패킷 수신) 대응
✅ 디바이스 드라이버의 기본 구조 리눅스에서는 드라이버를 모듈화된 형태로 로드할 수 있으며, insmod와 rmmod 명령어로 동적 추가/제거가 가능합니다.
리눅스 디바이스 드라이버는 일반적으로 다음과 같은 구조를 가집니다:
struct file_operations my_driver_fops = {
.open = my_driver_open,
.release = my_driver_close,
.read = my_driver_read,
.write = my_driver_write,
};
- open() → 장치 파일 열기 (/dev/mydevice)
- release() → 장치 파일 닫기
- read() → 장치에서 데이터 읽기
- write() → 장치에 데이터 쓰기
🔹 커널 공간(Kernel Space)과 유저 공간(User Space)의 차이
리눅스는 메모리를 커널 공간(Kernel Space)과 유저 공간(User Space) 으로 나눕니다.
✅ 커널 공간 (Kernel Space)
- 운영체제 핵심 코드(커널)가 실행되는 공간
- 디바이스 드라이버가 실행됨
- 메모리에 직접 접근 가능
- 특권 모드에서 실행됨
✅ 유저 공간 (User Space)
- 일반 응용 프로그램이 실행되는 공간
- 커널 API(open(), read(), write() 등)를 통해 디바이스 드라이버와 통신
- 직접 하드웨어 접근 불가 (시스템 콜을 통해야 가능)
- 보호된 공간에서 실행됨
💡 커널과 유저 공간 간 데이터 전송 방법
- 시스템 호출(System Call): open(), read(), write()
- IOCTL (Input/Output Control): ioctl()을 사용하여 추가적인 장치 제어
- proc/sysfs 인터페이스: /proc 및 /sys 파일 시스템을 통한 데이터 교환
🔹 주요 디바이스 드라이버 유형
리눅스에서 디바이스 드라이버는 크게 문자(Character), 블록(Block), 네트워크(Network) 드라이버 세 가지 유형으로 나뉩니다.
드라이버 유형 | 특징 | 예시 |
문자 드라이버 | 한 바이트씩 데이터 처리 | 시리얼 포트(UART), 키보드, 마우스 |
블록 드라이버 | 일정 크기(블록) 단위로 데이터 처리 | HDD, SSD, SD 카드 |
네트워크 드라이버 | 패킷 단위 데이터 전송 | 이더넷 카드, Wi-Fi 모듈 |
📌 1️⃣ 문자(Character) 드라이버
문자(Character) 드라이버 는 한 바이트씩 데이터를 읽고 쓰는 장치를 위한 드라이버입니다.
대표적으로 키보드, 마우스, 시리얼 포트(UART) 등이 문자 드라이버에 해당합니다.
✅ 문자 드라이버 기본 구조
#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
#define DEVICE_NAME "my_char_device"
static int my_driver_open(struct inode *inode, struct file *file) {
printk(KERN_INFO "Device Opened\n");
return 0;
}
static int my_driver_release(struct inode *inode, struct file *file) {
printk(KERN_INFO "Device Closed\n");
return 0;
}
static ssize_t my_driver_read(struct file *file, char __user *buf, size_t len, loff_t *offset) {
printk(KERN_INFO "Reading from Device\n");
return 0;
}
static struct file_operations fops = {
.open = my_driver_open,
.release = my_driver_release,
.read = my_driver_read,
};
static int __init my_driver_init(void) {
register_chrdev(240, DEVICE_NAME, &fops);
printk(KERN_INFO "Character Device Registered\n");
return 0;
}
static void __exit my_driver_exit(void) {
unregister_chrdev(240, DEVICE_NAME);
printk(KERN_INFO "Character Device Unregistered\n");
}
module_init(my_driver_init);
module_exit(my_driver_exit);
MODULE_LICENSE("GPL");
✅ 사용 방법
sudo insmod my_char_device.ko
ls /dev/my_char_device
sudo rmmod my_char_device
📌 2️⃣ 블록(Block) 드라이버
블록(Block) 드라이버 는 데이터를 일정한 크기(블록) 단위로 읽고 쓰는 장치에 사용됩니다.
주로 HDD, SSD, USB 저장 장치 등의 저장 매체에서 사용됩니다.
✅ 블록 드라이버의 특징
- 데이터는 블록 단위(512B, 4KB 등) 로 처리됨
- 파일 시스템과 직접 연동됨 (ext4, FAT32 등)
- I/O 요청이 스케줄링되어 성능 최적화 가능 (elevator algorithm)
✅ 블록 드라이버 예시
- /dev/sda (HDD, SSD)
- /dev/mmcblk0 (SD 카드)
- /dev/loop0 (가상 디스크)
✅ 블록 드라이버 주요 함수
struct block_device_operations my_block_ops = {
.open = my_block_open,
.release = my_block_release,
.read = my_block_read,
.write = my_block_write,
};
📌 3️⃣ 네트워크(Network) 드라이버
네트워크 드라이버 는 이더넷, Wi-Fi, 블루투스 등의 네트워크 인터페이스에서 데이터를 패킷 단위로 송수신하는 역할을 합니다.
✅ 네트워크 드라이버의 특징
- 데이터는 패킷 단위로 처리됨
- 인터페이스는 ifconfig 또는 ip link 명령어로 확인 가능
- 하드웨어가 직접 처리하지 못하는 프로토콜(TCP/IP 등)은 커널 네트워크 스택이 지원
✅ 네트워크 장치 예시
ls /sys/class/net/
eth0 lo wlan0
✅ 네트워크 드라이버 주요 구조
struct net_device_ops my_netdev_ops = {
.ndo_open = my_net_open,
.ndo_stop = my_net_stop,
.ndo_start_xmit = my_net_xmit,
};
✅ 네트워크 설정 확인
ip link show eth0
ethtool eth0
✅ 정리
- 디바이스 드라이버 개념
- OS와 하드웨어를 연결하는 소프트웨어
- 커널과 유저 공간 간 인터페이스 역할 수행
- 커널 공간 vs 유저 공간
- 커널 공간: 드라이버 실행, 하드웨어 직접 접근 가능
- 유저 공간: 시스템 콜을 통해 커널과 통신
- 드라이버 유형
- 문자 드라이버: UART, 키보드, 마우스 (/dev/ttyS0)
- 블록 드라이버: HDD, SSD, USB (/dev/sda)
- 네트워크 드라이버: 이더넷, Wi-Fi (eth0, wlan0)
'프로그래밍 > 시스템' 카테고리의 다른 글
커널 포팅 (4. 드라이버 포팅 / 4.3 새로운 드라이버 추가하기) (0) | 2025.03.06 |
---|---|
커널 포팅 (4. 드라이버 포팅 / 4.2 기존 드라이버 포팅) (0) | 2025.03.06 |
커널 포팅 (3. 커널 포팅 기본 실습 / 3.3 부트 로그 분석 및 디버깅) (0) | 2025.03.06 |
커널 포팅 (3. 커널 포팅 기본 실습 / 3.2 새로운 SoC 지원을 위한 포팅) (0) | 2025.03.06 |
커널 포팅 (3. 커널 포팅 기본 실습 / 3.1 타겟 보드 선택 및 디바이스 트리 설정) (0) | 2025.03.06 |