Transforming I/O Requests
Basic Concept
Transforming I/O requests 指的是 OS 如何把 application 的 high-level request,例如「讀取某個 file descriptor」,逐層轉換成 hardware 可以執行的 operation,例如「對某個 controller register 下命令,從某個 disk sector 讀資料到 kernel buffer」。
Device Namespace Mapping
Application 通常用 symbolic name 或 file descriptor 指稱 I/O target,但 hardware 只理解 controller address、port、device register、sector / block。OS 因此需要多層 mapping。
Dynamic Driver Loading
多層 lookup 讓 OS 可以更彈性地加入新 device。Boot time 時,OS 會 probe hardware buses,找出目前有哪些 devices,然後載入對應 drivers。有些 OS 還可以在第一次 I/O request 需要時才載入 driver。
Hot-plug device 則可能在 boot 後才出現。Kernel 可以透過 interrupt、bus event、或 error condition 發現新 device,再檢查 device details 並動態載入合適 driver。
Lifecycle of a Blocking read()

一個 blocking read() 可能經過很多層:
- Process 對已開啟的 file descriptor 呼叫
read()。 - Kernel system-call code 檢查參數是否合法。
- 如果 requested data 已在 buffer cache 中,kernel 直接 copy 給 process,I/O 結束。
- 如果需要 physical I/O,process 從 run queue 移到 device wait queue。
- Kernel I/O subsystem scheduling request,並把 request 傳給 device driver。
- Device driver 配置 kernel buffer,準備接收資料。
- Driver 透過 memory-mapped register 或 I/O port 對 controller 下 command。
- Controller 操作 device hardware 進行 transfer,可能透過 DMA 把資料搬到 kernel memory。
- Transfer 完成後 DMA controller / device controller 產生 interrupt。
- Interrupt handler 透過 interrupt vector 被呼叫,記錄狀態並通知 driver。
- Driver 判斷哪個 request 完成、是否成功,通知 kernel I/O subsystem。
- Kernel 把資料或 return code copy 到 process address space。
- Kernel 把 process 從 wait queue 移回 ready queue。
- Scheduler 之後選到該 process 時,process 從
read()system call 返回。