## 디바이스와 디바이스 드라이버
**디바이스(Device)**는 하드웨어 입출력 리소스를 의미합니다.
**디바이스 드라이버(Device Driver)**는 사용자 프로그램이 이러한 디바이스에 접근할 수 있는 인터페이스를 제공하는 프로그램으로, 커널의 일부로서 동작합니다. 디바이스는 커널에 의해 컨트롤 및 관리되므로, 디바이스 드라이버 역시 커널 영역에서만 사용될 수 있습니다. 사용자 영역의 어플리케이션에서 이 드라이버를 사용하려면, 시스템 콜이 필요합니다. 데이터 전달에는 `copy_from_user`, `copy_to_user` 등의 시스템 함수가 사용됩니다.
## 커널 모듈
리눅스는 원래 모노리식 커널이지만, 마이크로커널의 장점도 가지고 있습니다. 즉, 리눅스 커널 모듈을 사용하면, 새로운 장치를 추가하거나 기존 장치를 수정할 때 커널 전체를 재컴파일하고 재부팅할 필요가 없습니다.
## Major & Minor Number
디바이스를 구별하기 위해 주번호(Major Number)와 부번호(Minor Number)가 사용됩니다. 주번호는 디바이스를 구별하며, 커널에 디바이스 드라이버를 연결할 때 사용됩니다. 1바이트를 사용하므로 총 256가지의 장치를 구별할 수 있습니다. 부번호는 같은 타입의 디바이스를 구별할 때 사용하며, 2바이트를 사용합니다. 같은 타입의 디바이스라면 하나의 디바이스 드라이버로 관리할 수 있습니다.
## 디바이스 드라이버 특징
디바이스 드라이버는 커널의 일부이므로, 잘못 작성될 경우 문제가 심각할 수 있습니다. 이를 예방하기 위해, 디바이스 드라이버는 표준화된 인터페이스를 제공합니다. 필요할 때 로드하여 사용할 수 있습니다.
## 커널 모듈 동작
커널 모듈에는 메인 함수가 없습니다. 모듈을 로드할 때는 `init_module`이, 모듈을 언로드할 때는 `cleanup_module`이 실행됩니다. 모듈을 로드하는 명령어는 `insmod`, 모듈 리스트를 보는 명령어는 `lsmod`, 모듈을 삭제하는 명령어는 `rmmod`입니다.
## 디바이스 드라이버 생성 방법
디바이스 드라이버를 만드는 과정은 대략 다음과 같습니다:
1. `struct file_operations` 구조체를 구현합니다.
2. `init_module`, `cleanup_module`을 구현합니다.
3. 디바이스 드라이버를 커널에 등록합니다.
4. 컴파일하고 로드합니다. (`insmod hellodd.ko`)
5. 디바이스 파일을 만듭니다. (`mknod /dev/hellodd c 100 0`)
## 디바이스 타입
디바이스는 대체로 문자(character) 디바이스와 블록(block) 디바이스로 나눌 수 있습니다.
문자 디바이스는 순차적으로 들어오는 정보를 처리합니다. 예를 들면 키보드, 마우스, 모니터 등이 있습니다. 디바이스 드라이버는 이를 위해 `open`, `close`, `read`, `write` 시스템 콜을 구현합니다.
블록 디바이스는 데이터를 버퍼를 통해 접근합니다.
블록 디바이스는 데이터를 '블록'이라는 일정한 크기 단위로 관리하는 디바이스를 의미합니다. 하드디스크나 SSD 등이 대표적인 블록 디바이스입니다.
블록 디바이스의 특징은 데이터를 블록 단위로 임의로 읽고 쓸 수 있다는 점입니다. 이를 통해 데이터의 임의 접근이 가능합니다. 블록 디바이스 드라이버는 디바이스의 데이터를 블록 단위로 읽고 쓰는 작업을 제어합니다. `read()`, `write()`와 같은 시스템 콜에 응답하며, 이를 처리하기 위한 버퍼를 관리합니다.
네트워크 디바이스는 컴퓨터가 네트워크를 통해 데이터를 송수신할 수 있게 해주는 하드웨어를 의미합니다. 이더넷 카드, Wi-Fi 카드 등이 여기에 해당합니다.
네트워크 디바이스 드라이버는 이런 네트워크 디바이스와 운영체제 사이의 인터페이스 역할을 합니다. 드라이버는 운영체제의 네트워크 스택과 함께 작동하여, 네트워크 패킷의 송수신을 제어합니다. 또한, 운영체제가 디바이스의 기능을 정확히 알고 사용할 수 있도록 정보를 제공합니다.
## 메모리 매핑
`mmap()`, `ioremap()` 함수를 사용하면, 디바이스의 메모리 영역을 커널의 가상 영역으로 매핑할 수 있습니다. 이를 통해, 사용자가 파일 접근하는 것처럼 디바이스를 사용할 수 있게 됩니다.
Device - HW I/O resources
입출력을 할 수 있는 장치를 device라고 한다.
Device driver
디바이스 드라이버는 유저 프로그램이 장치에 접근할 수 있는 인터페이스를 제공하는 프로그램이다.
커널의 일부로 들어간다.(SW - Kernel - HW)
디바이스는 커널에 의해 컨트롤,관리된다. 따라서 커널영역에서만 사용될 수 있다.
어플리케이션 영역에서 커널 영역에 있는 드라이버를 사용하기 위해서는 시스템 콜이 필요하다.
데이터를 전달하기 위해 copy_from_user, copy_to_user등의 시스템 함수들이 사용된다.
Kernel module
리눅스는 monolithic kernel이지만 microkernel의 장점도 가진다.
(monolithic kernel은 새로운 장치를 쓸 때마다 커널을 재컴파일하고 재부팅해야함. microkernel은 최소한의 기능만 커널 공간에서 실행하며, 대부분의 시스템 서비스를 사용자 공간에서 실행하기 때문에 각 시스템 서비스가 독립적이어서 서비스를 추가할때도 재부팅이 필요 없음)
Major & Minor Number
주번호: 디바이스를 구별하는 데 사용, 커널에 디바이스 드라이버 연결 시 사용됨. 1Byte=256가지 장치를 구별가능
부번호: 2Byte 사용. 같은 타입의 디바이스를 구별할 때 사용. 같은 타입이라면 하나의 디바이스 드라이버로 사용가능
Linux Device Driver Features
Kernel code - 디바이스 드라이버는 커널의 일부이므로, 잘못되면 문제가 심각하다.
디바이스 드라이버는 스탠다드 인터페이스를 제공한다.
필요할 때 로드하여 사용할 수 있음.
커널 모듈
디바이스 드라이버, 파일시스템, 네트워크 프로토콜들이 포함
메인함수가 없다.
로딩시 init_module이, 언로딩시 cleanup_module()이 실행
모듈 로딩: insmod hello_module.ko
모듈 리스트 보기: lsmod
모듈삭제: rmmod hello_module(확장자 필요x)
디바이스 드라이버 만드는 방법
1. struct file_operations 구조체를 구현하기
2. init_module, cleanup_module 구현
.. 디바이스 드라이버를 커널에 등록하기
컴파일/로드하기. (insmod hellodd.ko)
디바이스 파일 만들기(mknod /dev/hellodd c 100 0)
Character Devices
순차적으로 들어오는 정보를 처리한다.
키보드,마우스, 모니터...
디바이스 드라이버는 open, close, read, write 시스템콜을 구현한다.
lock Devices
데이터를 버퍼를 통해 접근할 수 있음
Network devices
디바이스 드라이버는:
사용자가 파일 접근하는것처럼 디바이스를 사용할 수 있게 한다.
mmap(), ioremap()
디바이스의 메모리영역을 커널의 가상영역으로 매핑한다(?)
'2023-1 > IoT와 임베디드 소프트웨어' 카테고리의 다른 글
Threads (0) | 2023.06.13 |
---|---|
Device Driver 2 (0) | 2023.06.13 |
CrossDevEnv, Kernel, BootLoader (0) | 2023.04.25 |
Embedded Linux (0) | 2023.04.25 |
IoT and Embedded Software (0) | 2023.03.11 |
댓글