커널 포팅 (4. 드라이버 포팅 / 4.1 기본적인 디바이스 드라이버 개념)

2025. 3. 6. 19:43프로그래밍/시스템

4.1 기본적인 디바이스 드라이버 개념

🔹 디바이스 드라이버의 역할과 구조

디바이스 드라이버(Device Driver) 는 운영체제(OS)와 하드웨어를 연결하는 중요한 소프트웨어입니다.
커널과 하드웨어 간의 인터페이스를 제공하여, 응용 프로그램이 직접 하드웨어를 제어하지 않고 표준 API를 통해 접근할 수 있도록 지원합니다.

디바이스 드라이버의 역할

  1. 하드웨어 제어: CPU, 메모리, 네트워크, 저장 장치 등의 장치를 관리
  2. 커널과 하드웨어 간 인터페이스 제공: 응용 프로그램이 직접 하드웨어를 제어하는 것을 방지
  3. 시스템 자원 관리: 장치의 입출력(I/O) 및 메모리 사용 관리
  4. 인터럽트 처리: 하드웨어 이벤트(예: 키보드 입력, 네트워크 패킷 수신) 대응

디바이스 드라이버의 기본 구조 리눅스에서는 드라이버를 모듈화된 형태로 로드할 수 있으며, 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() 등)를 통해 디바이스 드라이버와 통신
  • 직접 하드웨어 접근 불가 (시스템 콜을 통해야 가능)
  • 보호된 공간에서 실행됨

💡 커널과 유저 공간 간 데이터 전송 방법

  1. 시스템 호출(System Call): open(), read(), write()
  2. IOCTL (Input/Output Control): ioctl()을 사용하여 추가적인 장치 제어
  3. 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

✅ 정리

  1. 디바이스 드라이버 개념
    • OS와 하드웨어를 연결하는 소프트웨어
    • 커널과 유저 공간 간 인터페이스 역할 수행
  2. 커널 공간 vs 유저 공간
    • 커널 공간: 드라이버 실행, 하드웨어 직접 접근 가능
    • 유저 공간: 시스템 콜을 통해 커널과 통신
  3. 드라이버 유형
    • 문자 드라이버: UART, 키보드, 마우스 (/dev/ttyS0)
    • 블록 드라이버: HDD, SSD, USB (/dev/sda)
    • 네트워크 드라이버: 이더넷, Wi-Fi (eth0, wlan0)