포스트

6. Driver

용어 정리

1
2
3
4
5
6
7
8
9
10
11
[하드웨어] (ex. 키보드)
   ↓
[드라이버 → 커널]
   ↓
[터미널] (입출력 장치 역할)
   ↓
[쉘] (명령어 해석기)
   ↓
[시스템 콜 → 커널] (실제 작업 수행)
   ↓
[커널 작업 → 결과 리턴] (커널 작업 결과가 거꾸로 올라와 화면에 표시)
  • 터미널
    입출력 인터페이스, 하나의 pc
  • Shell
    사용자의 명령을 해석하고 커널에 전달
    (bash: fork()로 자식 프로세스(bash) 만든 후 실행, source: 현재 세션에서 바로 실행)
  • Kernel
    운영체제의 핵심 부분으로 하드웨어와 소프트웨어 사이에서 물리적/추상화 자원을 관리하는 소프트웨어

※ 콘솔이란? 운영체제의 가장 기본적인 터미널 (시스템 부팅시 나오는 검정바탕 화면)

Driver란?

1
2
3
4
5
6
7
8
9
10
11
12
+------------------------+
|      사용자 공간        |  → 어플리케이션, 쉘, 유틸리티 등
+------------------------+
|      커널 공간          |
| +--------------------+ |
| | 시스템 콜 인터페이스 | |  ← 사용자 요청 수신
| +--------------------+ |
| |   커널 서브시스템   | |  ← 스케줄러, 메모리 관리자 등
| +--------------------+ |
| | 하드웨어 추상화 계층 | | ← 디바이스 드라이버, 인터럽트 처리
| +--------------------+ |
+------------------------+

커널의 한 부분으로, 운영체제가 하드웨어를 제어하기 위한 '중간자' 역할

  • 필요 이유: 세상에 수많은 디바이스를 운영체제와 연결하기 위해서는 운영체제가 정해놓은 규칙에 의해 통신을 하기만 하면 된다. 즉, 특정 디바이스와 커널간의 통신을 도와줄 프로그램을 만들 수 있다면, 내 디바이스는 모든 운영체제에서 사용가능하다.

리눅스에서는 모든 디바이스가 파일이라고 가정한다. 즉, 드라이버는 하나의 파일을 컨트롤 하기 위한 프로그램이다.

  • Device의 종류
    • Character device driver
      • 데이터를 바이트 단위로 처리해야 함(→ 버퍼나 캐시가 존재하지 않음)
      • ex. 터미널(tty), 마우스, 키보드
      • read(), write()와 같은 시스템 콜로 터미널에 접근 가능(인터페이스)
    • Block device driver
      • 디스크의 블록 단위로 데이터를 받아와야 함(→ 버퍼가 필요)
      • ex. USB, HDD, SSD
    • Network device driver
      • 파일 처럼 접근하지 않음.
      • ex. 이더넷, 와이파이 모듈

1. Driver의 기본 구조

  • init 함수: 모듈이 로딩될 때 실행
  • exit 함수: 모듈이 언로드될 때 실행

예시 코드:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <linux/module.h>
#include <linux/init.h>

static int __init my_driver_init(void) {
    printk(KERN_INFO "드라이버 로딩됨\n");
    return 0;
}

static void __exit my_driver_exit(void) {
    printk(KERN_INFO "드라이버 언로드됨\n");
}

module_init(my_driver_init);
module_exit(my_driver_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("UiJin");
MODULE_DESCRIPTION("간단한 드라이버 예제");
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.