Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

꾸준히

디바이스 드라이버 개요 본문

Device Driver

디바이스 드라이버 개요

S210530 2023. 7. 1. 18:02

정의

디바이스 드라이버란 디바이스와 응용프로그램 사이에 데이터를 주고 받기 위한 인터페이스이다. 쉽게 말하면 OS에서 디바이스를 인식하게 해주고, 디바이스를 제어할 수 있는 코드를 작성하는 것이다. 여기서 디바이스란 키보드, 마우스, 네트워크 카드 등의 CPU와 연결되어 있는 주변장치를 말한다. 응용 프로그램에서 open(), read(), write(), close() 등 file_operations 구조체에 정의된 함수를 통해 장치 파일에 접근할 때, 호출할 함수를 정의하고 구현해야한다. 
사용자는 드라이버 내의 함수에 대해 알 필요가 없다.

 

디바이스 종류

디바이스는 문자 디바이스, 블록 디바이스, 네트워크 디바이스로 나눌 수 있다. 문자 디바이스는 시간 순으로 들어오는 데이터를 처리한다. 예를 들어 마우스, 키보드의 입력과 같이 순서대로 처리하는 것이 의미가 있는 데이터들이다. 이와 달리 블록 디바이스는 블록 단위로 random access가 가능한 데이터를 처리한다. 블록 디바이스의 대표적인 예는 하드디스크이다. 네트워크 디바이스는 이더넷과 같은 다른 호스트와 데이터를 교환해 주는 디바이스를 말한다.

 

리눅스 커널과 디바이스 드라이버 구조

* System Call Interface

응용 프로그램에서 하드웨어나 커널의 리소스를 접근할 수 있도록 해주는 인터페이스이다.
예를 들어 Application(Process)에서 open()함수를 호출 했을 때(system call), 시스템 콜 핸들러 수행 과정을 나타내보면 아래 그림과 같다.

main 함수에서 시스템 콜 함수(oepn())를 호출하면 exception이 발생하고, exception이 발생하면 시스템은 커널 모드로 전환되어 exception handler를 실행한다.
exception 핸들러에서 swi 인터럽트 핸들러를 호출하고, 인터럽트 핸들러에서 시스템 콜 번호를 참조하여 VFS의 sys_open()함수를 호출한다. 마지막으로 연결된 디바이스 드라이버의 open함수를 호출한다
정리하면 process에서 시스템 콜 인터페이스를 통해 커널에 요청하고 커널은 fd에 맞는 디바이스의 fops에 정의되어 있는 함수를 실행시킨다.

 

* VFS

리눅스를 사용하면 다양한 형식으로 포맷된 디스크를 사용할 수 있다. 보통 리눅스에서는 ext2, ext3, ext4를 사용하지만 윈도우에서 사용하는 NTFS나 FAT같은 디스크도 사용할 수 있다. 그런데 어떤 디스크를 사용하던간에 프로그램을 작성할 땐 open, read, write, close와 같은 시스템 호출을 사용해서 이 모든걸 처리할 수 있다. 리눅스에서 실제 파일시스템에 관계 없이 공통된 인터페이스로 파일시스템에 접근하도록 하는 계층을 가상 파일시스템(VFS : Virtual Filesystem Switch)이라고 한다.

 

* 커널에서의 동시성 처리

커널은 특히 동시적으로 처리해야 하는 프로세스가 많이 발생한다. 예를 들어 printer driver의 경우 여러 pc에서 요청이 한번에 들어올 수 있다.
동시성 발생하는 경우는 특정 드라이버에 둘 이상의 프로세스가 접근하거나, 인터럽트 처리, 프로세서가 둘 이상인 시스템에서 프로세스 처리가 있을 수 있다.
커널 코드는 재진입이 가능해야 한다. 이는 동시에 여러 문맥에서 실행할 수 있어야 한다는 뜻이다. 프로세스는 동시성 문제를 세마포어나 뮤텍스를 많이 사용하지만 커널은 스핀락을 많이 사용한다.


'Device Driver' 카테고리의 다른 글

리눅스 디바이스 모델  (0) 2023.08.08
Virtual Memory  (0) 2023.07.16
디바이스 드라이버에서 변수와 메모리 할당  (0) 2023.07.09
디바이스 드라이버 구현  (0) 2023.07.01