裝置驅動程式與核心模組

裝置驅動程式(device driver)

把核心想成一位忙碌的辦公室主管,他絕不想記住大樓裡每台機器的每個按鈕與旋鈕。音效卡、磁碟、網路卡與滑鼠,內部結構天差地遠。裝置驅動程式就是那位深諳某台特定機器的專員,他向主管提供一小組統一的請求:開啟、讀取、寫入、關閉。驅動程式就是核心的硬體抽象層——把單一裝置的怪異細節藏在一個熟悉的介面背後。

具體來說,驅動程式是一段程式碼,通常用 C 撰寫並以核心模式執行,位於核心其餘部分與某一硬體之間。它一面說核心的內部語言(向核心註冊自己、提供標準的操作表、回應核心呼叫);另一面則戳弄真正的裝置:讀寫裝置的硬體暫存器、處理裝置發出的中斷、並在兩端搬移資料。當你對 /dev/ttyS0 呼叫 read() 時,核心會經由虛擬檔案系統把這個呼叫導向序列埠驅動程式,而它知道這其實是要從某個特定 UART 晶片的資料暫存器讀出位元組。

驅動程式之所以重要,是因為它正是乾淨可移植的核心與雜亂、各家廠商各異的真實世界相遇之處,而核心裡的驅動程式碼行數遠多於核心本體。一個微妙之處:驅動程式以完整核心特權執行,位於核心自己的定址空間內,因此驅動程式裡的臭蟲不是一個有禮貌的應用程式當掉——它可能破壞核心記憶體或讓整台機器卡死。寫驅動程式是真正的系統程式設計工作,不是把函式庫黏在一起而已。

應用程式: read(fd, buf, 100) -> 核心 VFS 層 -> 序列埠驅動程式的 .read 處理常式 -> 從位於 0x3F8 的 UART 暫存器讀出位元組 -> copy_to_user(buf, ...) // 交還給使用者

一個應用程式呼叫被驅動程式一步步翻譯成真正的硬體暫存器讀取。

驅動程式不是應用程式:它沒有 main()、不是行程,你也不會去執行它。它被載入核心,由核心按需呼叫,並擁有核心特權。

又称
driver驅動程式