2. Linux Device Driver – Contents
1. Linux Kernel
1) 구조
2) 기능
2. Device Driver 개요
1) Character Device Driver
2) Block Device Driver
3) Network Device Driver
3. Linux Device Model
1) udev
2) sysfs, kobject, device class
3) Hotplug
4. CAANOO Character Device Driver Example
1) Vibration Motor
2) Analog Joystick
GPH
6. Linux Device Driver – 1. Linux Kernel
2) 기능
• 프로세스 관리
- 프로세스 생성 및 소멸
- 프로세스간 통신
- etc.
• 메모리 관리
- 가상 메모리 관리기법 제공
- 시스템에 장착된 메모리(Hardware) 관리
• 파일 시스템 관리
- 가상 파일 시스템(VFS)에 의한 다양한 종류의 파일 시스템(ext3, ext4, FAT 등) 지원
- 파일(정규 파일, 장치 파일, 파이프), 디렉토리 관리
• 디바이스 관리
- 입출력 요청 처리 및 작업 스케쥴링
- 인터럽트 처리
- 주변 장치와 메모리의 데이터 전송
• 네트워크 관리
- 네트워크 라우팅 및 주소
GPH
8. Linux Device Driver – 2. Device Driver 개요
▶ Linux Device Driver란?
- 시스템이 지원하는 하드웨어를 응용프로그램에서 사용할 수 있도록 Kernel에서 제공하는 라이브러리(or
Interface).
- 일반적으로 문자, 블록, 네트워크 디바이스 드라이버로 분류 하며 ―/dev‖에 나타난다.
example:
주 번호 부 번호
문자 드라이버
블록 드라이버
GPH
9. Linux Device Driver – 2. Device Driver 개요
- 각 행의 첫 글자가 디바이스의 유형(c는 문자 드라이버, b는 블록드라이버)을 나타낸다.
- 다섯 번째 열의 숫자는 주 번호, 여섯 번째 숫자는 부 번호를 의미.
(※ 문자와 블록 드라이버는 서로 다른 영역을 차지하므로 동일한 주 번호를 블록 드라이버
뿐만 아니라 문자 드라이버에도 할당 할 수 있다.)
- 주 번호는 전반적인 드라이버 특징을 지정, 부 드라이버가 서비스하는 정확한 디바이스 특
징을 지정(mtdblock0, mtdblock1 참고).
GPH
10. Linux Device Driver – 2. Device Driver 개요
1) Character Device Driver
▶ Char Device Driver의 정의 및 특징
- 문자 디바이스는 하나의 파일처럼 사용할 수 있는 것(버튼, G-Sensor, Analog Joystic, RTC 등)을 말하고 문자
디바이스 드라이버는 이러한 파일 접근에 필요한 open, close, read, write등의 시스템 호출을 구현.
- 디바이스에서 자료에 순차적(sequentially)으로 접근 가능한 커널 코드
- 임의의 길이를 갖는 문자열을 다루는 디바이스 드라이버로 응용 프로그램에서 직접적으로 호출되는 버퍼 없
는 디바이스 드라이버.
- 응용프로그램은 open(), close(), read(), write()와 같은 파일 처리용 함수를 이용하여 디바이스 파일을 일반 파
일처럼 다뤄서 하드웨어를 제어할 수 있다.
- 구조가 매우 간단하다.
GPH
11. Linux Device Driver – 2. Device Driver 개요
▶ Character Device Driver 기능.
- 디바이스를 초기화하며 등록함수를 사용해 커널 영역에 드라이버를 빈틈없이 엮는(등록하는) 기능을 책임진
초기화(init()) 루틴.
- 관련 /dev 노드를 사용해 사용자 어플리케이션이 호출하는 입출력 시스템 호출과 직접 대응하는 open(),
close(), read(), write() 같은 진입점 집합.
- interrupt handling, bottom half, timer handling 등의 처리.
GPH
12. Linux Device Driver – 2. Device Driver 개요
▶ Character Device Driver 주요 자료구조.
- 디바이스별 구조체: 드라이버 동작을 위한 정보 저장소로 활용
- struct cdev: 문자 드라이버용 커널 추상화 단위, 일반적으로 디바이스별 구조체에 포함.
- struct file_operations: 사용자 어플리케이션과 작동하는 open, close, read, write의 구현.
- struct file: 해당 /dev 노드에 대한 정보.
- struct platform_device, struct platform_driver: platform_bus라는 가상의 플랫폼 버스 상에 새로운 디바이스를
등록.
GPH
13. Linux Device Driver – 2. Device Driver 개요
▶ Character Device Driver example.
- 직렬 드라이버: 컴퓨터의 직렬 포트를 관리하는 문자 드라이버. (drivers/serial)
- 입력 드라이버: 키보드, 마우스, 조이스틱 같은 디바이스를 다루는 책임. (drivers/input)
- 프레임 버퍼: 비디오 메모리에 대한 접근 제공. (drivers/video)
- 이외 많은 유형의 Character Device Driver들이 존재. (―grep –r register_chrdev drivers/‖로 확인)
GPH
14. Linux Device Driver – 2. Device Driver 개요
2) Block Device Driver
- 블록 디바이스는 임의 접근 능력을 갖춘 저장소 매체.
- 문자 디바이스와 달리 블록디바이스는 파일 시스템 자료를 담을 수 있다(하드디스크와 같은 저장 매체를 다
룬다).
- 대부분의 저장 디바이스가 블록(512, 1024, … 4096 Byte)단위의 입출력을 기반으로 하고 있음.
- 입출력 스케쥴러가 동작.
GPH
17. Linux Device Driver – 2. Device Driver 개요
▶ 입출력 스케쥴러
입출력 스케쥴러 설명 Kernel Source
Deadline - 표준 elevator 알고리즘으로 요청의 첫 섹터 번호를 기준으로 block/deadline-iosched.c
정렬 도는 병합 수행.
- 입출력 요청에 대해서 굶주림(starvation)을 방지하기 위해
(2.6 kernel)
deadline을 설정.
Anticipatory - 기본 알고리즘은 Deadline과 같지만, 읽기 요청을 수행한 후 미 Block/as-iosched.c
리 정해놓은 시간만큼 추가 요청을 예상하며 대기.
(2.6 kernel)
Complete Fair - 요청한 프로세스마다 요청큐를 하나씩 유지함으로써 프로세스 Block/cfq-iosched.c
마다 입출력에대한 공평한 기회를 얻게 됨.
Queuing (CFQ) - 특정 프로세스때문에 다른 프로세스가 굶어 죽는 상황 방지.
(2.6 kernel)
Noop - 최적화된 삽입 지점을 찾기 위해 요청큐를 탐색하는 데 시간을 Block/noop-iosched.c
소비하지 않음.
- 탐색 지연 시간이 존재하지 않는 SSD같은 매체에 이상적.
(2.6 kernel)
GPH
18. Linux Device Driver – 2. Device Driver 개요
▶ 보조 기억 장치와 디바이스 파일
- 블록 디바이스 드라이버의 주 번호는 블록 디바이스를 구별하고, 부 번호는 물리적인 보조 기억
장치를 구별하거나 분할 파티션을 구별함.
- 리눅스의 블록 디바이스 장치
brw-rw---- 1 root disk 8, 0 2010-11-03 18:23 sda
brw-rw---- 1 root disk 8, 1 2010-11-03 18:23 sda1
파티션이 2개(FAT-sdb1, Ext3-
brw-rw---- 1 root disk 8, 2 2010-11-03 18:23 sda2
brw-rw---- 1 root disk 8, 5 2010-11-03 18:23 sda5 sdb2)인 이동식 디스크(sdb)의
brw-rw---- 1 root disk 8, 16 2010-11-15 13:56 sdb 블록디바이스 파일
brw-rw---- 1 root disk 8, 17 2010-11-15 13:56 sdb1
brw-rw---- 1 root disk 8, 18 2010-11-15 13:56 sdb2
- 블록 디바이스의 마운트 정보
파일시스템 크기 사용됨 사용가능 사용율% 마운트 됨
/dev/sda1 284G 109G 161G 41% /
none 1.7G 284K 1.7G 1% /dev
none 1.7G 252K 1.7G 1% /dev/shm
none 1.7G 1.2M 1.7G 1% /var/run
none 1.7G 4.0K 1.7G 1% /var/lock 2개의 파티션(FAT-sdb1, Ext3-
none 1.7G 0 1.7G 0% /lib/init/rw sdb2)이 mount되어 있는 정보
/dev/sdb1 70M 2.6M 67M 4% /media/BOOT
/dev/sdb2 3.6G 1.6G 1.9G 46% /media/ROOTFS
GPH
19. Linux Device Driver – 2. Device Driver 개요
3) Network Device Driver
- 네트워크 디바이스 드라이버는 다른 드라이버와 다르게 사용자 영역과 통신하기 위해 /dev나 /sys에 의존하지
않는다.
- 어플리케이션은 기반 프로토콜 스택을 추상화한 네트워크 인터페이스(ex eth0)를 거쳐 드라이버와 상호작용
한다.
GPH
20. Linux Device Driver – 2. Device Driver 개요
네트워크 스텍을 설명하는 인터넷 모델
일반적으로 이동하는 자료를 이해하는 의미론적인 layer.
(HTTP서버와 클라이언트의 관계에서는 웹 내용의 요청
과 응답을 전송)
point-to-point 통신을 담당.
(호스트 내부에서 종단점 사이에 일어나는 통신을 관리)
패킷을 목적지로 전달.
(호스트 사이에서 일어나는 통신을 관리)
물리층에 접근하는 디바이스 드라이버를 참조. (직렬 연
결 혹은 이더넷 디바이스같은 매체)
GPH
21. Linux Device Driver – 2. Device Driver 개요
리눅스 네트워크 스텍 구조
사용자 영역 응용 프로그램이 커널 네트워크 하위 시스
템에 접근하는 API를 제공
프로토콜 중립 계층(소켓): 다양한 프로토콜을 위한 공통
함수 집합을 제공하는 Interface.
TCP, UDP등 사용 가능한 특정 네트워킹 프로토콜을 정
의.
다양한 기능의 하드웨어 디바이스 드라이버를 프로토콜
로 연결하는 중립 인터페이스 계층.
물리적인 네트워크 디바이스를 관리하는 디바이스 드라
이버.
GPH
22. Linux Device Driver – 2. Device Driver 개요
▶ Network Device Driver 자료 구조.
- 소켓 버퍼(struct sk_buff): 네트워크 프로토콜 스택의 구성 단위를 형성하는 구조체이며 커널의 TCP/IP 스택이
이용하는 핵심 구조체. (include/linux/sk_buff.h)
- struct net_device: Network driver와 프로토콜 스택 사이의 인터페이스를 정의하는 구조체.
(include/linux/netdevice.h)
- I/O 버스와 관련있는 구조체: PCI 또는 CPU Address/Data bus
GPH
24. Linux Device Driver – 3. Linux Device Model
▶ Linux Device Model(LDM) 개요.
- Power management and system shutdown: 예를 들어 USB host adaptor는 host에 연결된 device
들이 모두 안정적으로 power off(or shut down)된 후에 power off되어야 한다 LDM은 이러한 올바
른 절차에의해 이러한 작업을 수행하도록 한다.
- Communications with user space: 가상 파일 시스템인 sysfs는 LDM과 매우 밀접하게 연관되어 있
으며 구조화된 LDM의 자료구조를 user space에 표현.
- Hotpluggable devices: USB 이동식 디스크와 같은 장치는 시스템이 동작 중일 때 언제든 삽입
(plugging)/제거(unplugging) 될 수 있다. 커널은 이와 같은 사건(event)들을 LDM을 이용해 다루
고(handling) 사용자 영역과 소통(communicate)한다.
- Device Classes: 때대로 시스템에 어떠한 종류의 디바이스가 연결되어 있는지 알아야할 필요성이
있다. LDM은 연결된 디바이스를 그것이 속하게 되는 적절한 상위 클레스로 분류하는 메커니즘
을 가지고 있으며, 디바이스가 사용자 영역(user space)에서 발견될 수 있도록 한다.
GPH
25. Linux Device Driver – 3. Linux Device Model
1) udev
- 초창기부터 2.4버전의 커널은 (수천 개에 이르는) 필요한 디바이스 노드를 /dev에 정적으로 만들
어야만 했다.
- 2.4버전대에 이르러 동적으로 디바이스 노드를 생성하는 devfs를 도입하였지만, 노드 작명은 여전
히 디바이스 드라이버에 의존.
- 디바이스 관리를 사용자 영역으로 옮기기 위해 udev가 등장.
GPH
26. Linux Device Driver – 3. Linux Device Model
▶ udev는 아래의 내용에 의존하여 동작.
- Kernel Sysfs 지원: sysfs는 리눅스 디바이스 모델에서 중요한 위치를 차지하며, sysfs는 메모리 내
부 파일 시스템으로 시동 시점에서 /sys에 mount 된다. 아래에 나오는 udevd나 udevinfo는 sysfs
를 참고하여 동작하게 된다.
- udevd나 udevinfo 같은 사용자 영역 demon과 utility.
- /etc/udev/rules.d/ 디렉터리에 있는 사용자 지정 규칙.
GPH
27. Linux Device Driver – 3. Linux Device Model
▶ udevd 데몬 확인 Example (CAANOO)
GPH
28. Linux Device Driver – 3. Linux Device Model
▶ 사용자 지정 규칙 Example(CAANOO SD/MMC)
SD/MMC
사용자 규칙 파일
SD/MMC
Insert
SD/MMC
Remove
GPH
29. Linux Device Driver – 3. Linux Device Model
▶ 임베디드 시스템에서의 udev
- 아래와 같은 이유로 인해 특정 임베디드 시스템에서는 udev를 활용하기 보다 정적으로 생성한 디바이스 노드
를 선호하기도 함.
• udev는 소프트웨어 설치 과정에서 한 번만 만들어지는 정적 노드와는 달리 시동할 때마다 /dev노드를
생성한다. /dev 디렉터리가 플래시 저장소를 사용할 경우 매번 시동 과정에서 지우기/쓰기 과정을 거
치므로, 플래시 수명이 줄어든다.
• udev를 사용하면 시스템 시동 시간이 더 오래 걸린다.
• /dev노드를 동적으로 생성하며 모듈을 자동적으로 적재하는 udev기능에는 특수 목적으로 사용할 임베
디드 디바이스에서 피하고 싶은 비결정성이 따라다닌다. 특히 핫플러그 가능한 버스를 거쳐 외부 세상
과 상호작용을 원하지 않은 경우에 문제가 된다. 이런 관점에 따르면 정적 노드 생성과 시동 시점에 모
듈을 메모리에 올리는 방식은 시스템에 대한 통제를 강화하며, 테스트를 용이하게 한다.
GPH
30. Linux Device Driver – 3. Linux Device Model
2) sysfs, kobject, device class
- sysfs, kobject, device class는 디바이스 모델의 기초적인 구성요소이지만, 대부분의 경우 밖으로 드러나지 않
는다. (즉 직접적으로 드라이버 작성자나 프로그래머가 다루거나 관련 source를 수정하는 일은 거의 없다.)
- sysfs는 커널의 구조화된 디바이스 모델의 사용자 영역으로의 표현이다. sysfs는 커널 자료 구조에 대한 정보
를 포함하는 메모리 기반 파일 시스템이라는 점에서 procfs와 유사하지만, procfs가 커널 내부로 통하는 일반
적인 interface를 제공하는 반면, sysfs는 디바이스 모델에 특화된 interface로서 udev의 확장기능 대부분이
sysfs에 의존한다.
- kobject는 참조 카운트 같은 공통 객체 속성의 추성화를 지원한다. 일반적으로 kobject는 더 큰 구조체(e.g.
struct device)에 내장된다. kobject 구조체의 주요 field와 내용은 다음과 같다.
• 참조 카운트 관리를 수행하기 위한 kref
• kobject가 속하는 객체 집합인 kset에 대한 포인터
• Kobject를 기술하는 객체 유형인 kobj_type
- kobject는 sysfs와 밀접한 관련이 있다. 커널 내부에서 인스턴스로 만들어지는 모든 kobject가 sysfs에서 나타
난다.
- 디바이스 클래스 개념은 디바이스 모델의 또 다른 특징이며, 드라이버에서 사용하기를 원하는 interface이다.
클래스 인터페이스는 디바이스마다 더 큰 디바이스 클래스(또는 범주)에 속한다는 생각을 추상화한다. (e.g.
usb 마우스, ps/2 키보드, 조이스틱은 입력 클래스에 속하며 /sys/class/input이라는 독자적인 항목을 소유하
게 된다.)
GPH
32. Linux Device Driver – 3. Linux Device Model
USB Mouse의 sysfs 계층
[/sys]
+[block]
-[bus]—[usb]—[devices]—[usb2]—[2-2]—[2-2:1.0]-[usbendpoint:usbdev2.2-ep81]
-[class]-[input]—[mouse2]—[device]—[bus]—[usbendpoint:usbdev2.2-ep81]
-[usb_device]—[usbdev2.2]—[device]—[bus]
-[usb_endpoint]—[usbdev2.2-ep00]—[device]
—[usbdev2.2-ep81]—[device]
-[devices]—[pci0000:00]—[0000:00:1d:1]—[usb2]—[2-2]—[2-2:1.0]
+[firmware]
+[fs]
+[kernel]
+[module]
+[power]
GPH
33. Linux Device Driver – 3. Linux Device Model
RTC 드라이버 모듈을 커널에 올렸을 때 처리 경로
GPH
34. Linux Device Driver – 3. Linux Device Model
2) Hotplug
- 동작중인 시스템에 동적으로 연결되는 것을 Hotplug라고 표현한다.
- 최신의 리눅스 커널은 hotplug를 감지하면 netlink소켓을 거쳐 사용자 영역으로 uevent를 보낸다.
- netlink 소켓은 소켓 API를 이용해 커널영역과 사용자 영역 사이에 통신이 가능하게 만드는 효율적인 매커니즘
이다.
- 사용자 영역 끝에서 디바이스 노드 생성과 삭제를 관리하는 udevd 데몬이 uevent를 받아 핫플러그를 관리한다.
GPH
36. Linux Device Driver – 4. CAANOO Example
1) Vibration Motor
- Hardware 구성:
• 2EA AC-type Vibration Motor
• 2EA Vibration Motor Controller chip (ISA1200)
- Hardware 연결:
• 두 개의 ISA1200이 i2c로 연결되어 있고, 이를 통해 MCU(POLLUX) 로부터 각종 command
(enable/disable, AC/DC motor type 등)을 받는다.
• 두 개의 ISA1200은 MCU로부터 하나의 PWM라인을 공유하며 MCU는 PWM의 duty비를 이용하여
모터의 세기(강/약)를 조절한다.
- source file location: <Kernel Top Dir>/drivers/haptic/simple_isa1200.c
GPH
37. Linux Device Driver – 4. CAANOO Example
Vibration Motor Block Diagram
ISA1200
Command
RAM
Vibration
Strength
control
GPH
39. Linux Device Driver – 4. CAANOO Example
▶ source code – 디바이스 드라이버의 시작 지점(init)과 종료 지점(exit)
디바이스 드라이버의 시
작 지점:
- 플랫폼 디바이스 구조
체를 동적으로 할당하고
디바이스와 드라이버를
등록
디바이스 드라이버의 종
료 지점:
- 등록된 플랫폼 디바이
스와 드라이버 제거
드라이버 시작/종료지점
명시
GPH
40. Linux Device Driver – 4. CAANOO Example
▶ source code – platform_device, platform_driver
- platform_device의 동적할당을 위한 포인터 선언
- platform_driver 선언
GPH
41. Linux Device Driver – 4. CAANOO Example
▶ source code – platform_device, platform_driver
i2c Driver register
- probe() method.
cdev 와 file_operations 등록
- remove() method.
GPH
42. Linux Device Driver – 4. CAANOO Example
▶ source code – struct file_operations
사용자 영역 Application Code Source
fd = open(const char *pathname, int flags);
Device driver Code Source
int xxx_open(struct inode * inode, struct file *filp)
{
/* … … */
return ret;
}
GPH
43. Linux Device Driver – 4. CAANOO Example
▶ source code – struct file_operations
▶ source code – /sys와 /dev에서 Vibration Motor
▶ File operations Example – Haptic_test
GPH
44. Linux Device Driver – 4. CAANOO Example
2) Analog Joystick
- Hardware 구성:
• X, Y 2개 축으로 구성된 Analog Joystick
- Hardware 연결:
• X, Y 각각의 축이 MCU의 ADC(Analog to Digital Converter) Pin 2EA에 연결
- source file location: <kernel top dir>/drivers/i2c/chips/ad7993.c
GPH
46. Linux Device Driver – 4. CAANOO Example
▶ source code – platform_device의 probe() 루틴에서 Input Device 초기화
CAANOO의 Analog
Joystick과 Button을
Linux Input Device
Interface 로 사 용 하
기 위한 처리
GPH
47. Linux Device Driver – 4. CAANOO Example
▶ source code – Device 속성 파일 Sysfs에 만들기.
▶파일 생성 결과 확인
GPH
48. Linux Device Driver – 4. CAANOO Example
▶Sysfs Examples
calibration 파일의 내용(Text)를 출력
root@wiz:/usr/gp2x# cat /sys/devices/platform/pollux-analog.0/calibration
861 161 511 861 161 511 1 0root@wiz:/usr/gp2x#
root@wiz:/usr/gp2x# echo "0 0 0 0 0 0 0 0" > /sys/devices/platform/pollux-
analog.0/calibration
calibration 파일에 특정 내용(Text)을 입력!
결과는…?
GPH