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