Block and Character Devices
Basic Concept
OS 會把許多 device 抽象成兩種基本 I/O interface:block device 和 character 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
Direct I/O
Memory-Mapped File
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 中移除。