포스트

임베디드 스터디 - 문자, 블록, 네트워크 디바이스 드라이버

임베디드 스터디 - 문자, 블록, 네트워크 디바이스 드라이버

문자 (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, eMMCeth0, wlan0
데이터 단위1바이트 (스트림)512B / 4KB (고정 블록)가변 (최대 MTU 1500B)
랜덤 접근❌ (순차 스트림)✅ (블록 번호로 점프)
인터페이스디바이스 파일 (/dev/ttyS0)디바이스 파일 (/dev/sda)소켓 (socket())
/dev 파일
파일 타입 기호cb없음
식별 방식Major / Minor numberMajor / Minor number인터페이스 이름 (eth0)
커널 캐시✅ (페이지 캐시)
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.