임베디드 스터디 - 문자, 블록, 네트워크 디바이스 드라이버
임베디드 스터디 - 문자, 블록, 네트워크 디바이스 드라이버
문자 (Character) 디바이스 드라이버
- 1바이트 단위로 데이터를 송수신하는 디바이스 드라이버
- 바이트 스트림으로 데이터를 처리하는 디바이스를 연결하는 데 사용함 (e.g. 키보드, 마우스)
- 일반적으로 순차 접근으로 데이터를 접근함
- 단, 일부 디바이스
/dev/mem이나/dev/random은 랜덤접근을 수행함
- 단, 일부 디바이스
블록 (Block) 디바이스 드라이버
- 512바이트, 혹은 4096바이트 단위로 데이터를 송수신하는 디바이스 드라이버
- 대용량 데이터를 송수신하는 디바이스를 연결하는데 사용함
- 명령어로 블록 단위 이하의 바이트만 호출할 경우 블록 단위로 데이터를 불러온 후 버퍼에서 오프셋을 추출함
- 이 때, 블록 단위로 호출한 나머지 데이터는 버리지 않고 캐시에 저장함
- 이를 페이지 캐시(Page Cache)라고 함
1 2 3 4 5
read(fd, buf, 1) 요청 ↓ 커널이 해당 위치가 속한 블록(4KB) 전체를 SSD에서 읽어 커널 버퍼에 저장 ↓ 버퍼에서 요청한 1바이트만 사용자 공간으로 복사
- 일반적으로 랜덤 접근으로 데이터를 접근함
lseek(fd, 1024, SEEK_SET)명령어로 데이터 접근
네트워크 (Network) 디바이스 드라이버
- MTU(Maximum Transmission Unit)에 따라 전송 단위 데이터가 달라짐
- TCP는 IP 헤더, TCP 헤더를 제외하고 MSS(Maximum Segment Size) 1,460바이트
1
2
3
4
5
6
7
애플리케이션 → 데이터 (크기 제한 없음)
↓
TCP → 세그먼트 (최대 MSS, 보통 1460바이트)
↓
IP → 패킷 (최대 MTU, 보통 1500바이트)
↓
이더넷 → 프레임 (최대 1518바이트)
- 네트워크 디바이스 드라이버는 소켓으로 드라이버가 관리됨
ifconfig,ip명령으로 제어eth0,wlan0같은 네트워크 인터페이스 이름으로 관리
1
2
3
4
5
6
문자/블록 디바이스 네트워크
───────────────────── ─────────────────────
open("/dev/ttyS0") socket(AF_INET, ...)
read() / write() send() / recv()
/dev 아래 파일 존재 /dev 파일 없음
Major/Minor로 식별 IP:Port로 식별
문자 vs 블록 vs 네트워크
| 구분 | 문자 디바이스 | 블록 디바이스 | 네트워크 디바이스 |
|---|---|---|---|
| 대표 장치 | UART, 키보드, 마우스 | SSD, HDD, eMMC | eth0, wlan0 |
| 데이터 단위 | 1바이트 (스트림) | 512B / 4KB (고정 블록) | 가변 (최대 MTU 1500B) |
| 랜덤 접근 | ❌ (순차 스트림) | ✅ (블록 번호로 점프) | ❌ |
| 인터페이스 | 디바이스 파일 (/dev/ttyS0) | 디바이스 파일 (/dev/sda) | 소켓 (socket()) |
/dev 파일 | ✅ | ✅ | ❌ |
| 파일 타입 기호 | c | b | 없음 |
| 식별 방식 | Major / Minor number | Major / Minor number | 인터페이스 이름 (eth0) |
| 커널 캐시 | ❌ | ✅ (페이지 캐시) | ❌ |
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.