Block and Character Devices

Basic Concept

OS 會把許多 device 抽象成兩種基本 I/O interface:block devicecharacter device。這個分類在描述 application / kernel 要用什麼資料單位和操作模型來存取它。

  • Block device 適合以固定大小 block 存取的裝置,例如 disk、SSD。
  • Character device 適合以 byte stream 存取的裝置,例如 keyboard、mouse、serial port、printer、audio device。

這個分類讓 application 不必理解每個硬體的 protocol,而是透過 read/write/seek 或 get/put 這類通用行為來操作。

Block Devices

Block device 的核心特性是資料可以被分成 block,而且通常可以 random access。因此 block device interface 通常包含:

  • read():從某個 block 或 file offset 讀資料。
  • write():把資料寫到某個 block 或 file offset。
  • seek():移動目前存取位置,指定接下來要操作哪個 block / offset

Application 通常不是直接對 raw block device 操作,而是透過 file system 存取檔案。File system 會把 file name、directory、file offset 轉成底層 block device 的 block request。

Raw I/O

D-OS-Ch12baa-Raw_IO

Direct I/O

D-OS-Ch12bab-Direct_IO

Memory-Mapped File

D-OS-Ch10-Virtual_Memory

Character Devices

Character device 以 byte stream 為核心,不一定支援 seek,也不保證資料可以 random access。Keyboard 是典型例子。

Character-device interface 通常提供:

  • get():取得一個 character / byte。
  • put():輸出一個 character / byte。

在這個基本 interface 上,library 或 kernel 可以再提供 line buffering、editing 等功能。例如 terminal input 中按下 backspace 時,上層可以把前一個 character 從 input stream 中移除。