輸入輸出系統與裝置管理

裝置驅動程式(a device driver)

想像一個萬用旅行轉接頭。各國的牆上插座差異極大,但轉接頭對你的筆電呈現一個熟悉的插頭,並在背後悄悄處理各地的怪癖。裝置驅動程式就是作業系統裡的那個轉接頭:一個針對特定裝置的模組,知道某一個硬體確切的暫存器與怪癖,卻向核心其餘部分呈現同一套標準介面——open、read、write、close 等等——也就是核心對每個裝置所期待的那一套。

具體來說,驅動程式位於輸入輸出堆疊的最底層,就在控制器之上。它上面是所有裝置共用的、與裝置無關的輸入輸出軟體(命名、緩衝、錯誤處理);驅動程式把那一層送來的通用請求,翻譯成這個特定控制器所需的、精確的暫存器讀寫序列,而它也包含該裝置的中斷服務常式。所以當一個程式對網路卡呼叫 read 時,請求沿著統一的層次往下流,直到抵達網路驅動程式,由它知道這顆確切的晶片需要在這些確切的暫存器裡下這些確切的命令。驅動程式正是為什麼同一行程式碼能操作 SSD、USB 隨身碟或磁性硬碟:每個裝置都有自己的驅動程式,但全部向上暴露同一套介面。

為什麼重要:驅動程式是作業系統中無止盡成長的部分,因為每個新裝置都需要一個,它們也是風險最高的部分。驅動程式以核心模式、完整特權執行,所以一個有臭蟲或惡意的驅動程式能讓整個系統當機或被攻陷——歷史上一直是作業系統當機的主因之一。這正是這個設計核心的張力:上方統一的介面讓應用程式保持簡單又可移植,而所有雜亂、危險、針對特定裝置的知識,則被集中(並盡可能隔離)在驅動程式裡。

你插上兩台不同的網路攝影機。每一台都有自己的驅動程式,但兩者都登記為一個標準的視訊裝置。你的視訊通話程式對任一台都用同樣方式開啟 /dev/video0 並呼叫 read;底下的驅動程式把那些呼叫轉成那台攝影機特定的命令。

向上是同一套統一介面;向下是針對特定裝置的命令——這就是驅動程式。

驅動程式是軟體、不是裝置,而且它以核心特權執行。它呈現的統一介面是刻意的抽象;裝置真正醜陋的細節只住在它裡面——這也是為什麼一個有缺陷的驅動程式能把整個作業系統拖垮。

又稱
driverdevice-specific module驅動程式