Linux
核心驅動程序和核心模組有什麼區別?
當我
lspci -k
使用 3.2.0-29-generic 核心在我的 Kubuntu 上執行操作時,我可以看到如下內容:01:00.0 VGA compatible controller: NVIDIA Corporation G86 [Quadro NVS 290] (rev a1) Subsystem: NVIDIA Corporation Device 0492 Kernel driver in use: nvidia Kernel modules: nvidia_current, nouveau, nvidiafb
有一個核心驅動程序和
nvidia
核心模組nvidia_current
,,,nouveau
。nvidiafb
現在我想知道核心驅動程序和核心模組之間可能有什麼區別?
核心模組是一段編譯後的程式碼,可以在執行時插入核心,例如 with
insmod
或modprobe
.驅動程序是在核心中執行以與某些硬體設備通信的程式碼。它“驅動”硬體。您電腦中的大多數硬體都有一個相關的驅動程序。¹執行核心的很大一部分是驅動程式碼。²
驅動程序可以靜態建構到磁碟上的核心文件中。³ 驅動程序也可以建構為核心模組,以便以後可以動態載入。(然後可能會解除安裝。)
標準做法是盡可能將驅動程序建構為核心模組,而不是將它們靜態連結到核心,因為這提供了更大的靈活性。但是,有充分的理由不這樣做:
- 有時,給定的驅動程序對於幫助系統啟動是絕對必要的。由於initrd特性,這種情況不會像您想像的那樣經常發生。
- 在靜態範圍的系統(例如嵌入式系統)中,靜態建構的驅動程序可能正是您想要的。也就是說,如果您事先確切地知道始終需要哪些驅動程序並且這永遠不會改變,那麼您有充分的理由不去打擾動態核心模組。
- 如果您靜態建構核心並禁用 Linux 的動態模組載入功能,則會阻止核心程式碼的執行時修改。這以犧牲靈活性為代價提供了額外的安全性和穩定性。
並非所有核心模組都是驅動程序。例如,Linux 核心中一個相對較新的特性是您可以載入不同的程序調度程序。另一個例子是,更複雜的硬體類型通常有多個通用層,位於低級硬體驅動程序和使用者空間之間,例如USB HID 驅動程序,它實現了 USB 堆棧的特定元素,獨立於底層硬體。
旁白: