Linux

核心驅動程序和核心模組有什麼區別?

  • September 30, 2021

當我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,,,nouveaunvidiafb

現在我想知道核心驅動程序和核心模組之間可能有什麼區別?

核心模組是一段編譯後的程式碼,可以在執行時插入核心,例如 withinsmodmodprobe.

驅動程序是在核心中執行以與某些硬體設備通信的程式碼。它“驅動”硬體。您電腦中的大多數硬體都有一個相關的驅動程序。¹執行核心的很大一部分是驅動程式碼。²

驅動程序可以靜態建構到磁碟上的核心文件中。³ 驅動程序也可以建構為核心模組,以便以後可以動態載入。(然後可能會解除安裝。)

標準做法是盡可能將驅動程序建構為核心模組,而不是將它們靜態連結到核心,因為這提供了更大的靈活性。但是,有充分的理由不這樣做:

  • 有時,給定的驅動程序對於幫助系統啟動是絕對必要的。由於initrd特性,這種情況不會像您想像的那樣經常發生。
  • 在靜態範圍的系統(例如嵌入式系統)中,靜態建構的驅動程序可能正是您想要的。也就是說,如果您事先確切地知道始終需要哪些驅動程序並且這永遠不會改變,那麼您有充分的理由不去打擾動態核心模組。
  • 如果您靜態建構核心並禁用 Linux 的動態模組載入功能,則會阻止核心程式碼的執行時修改。這以犧牲靈活性為代價提供了額外的安全性和穩定性。

並非所有核心模組都是驅動程序。例如,Linux 核心中一個相對較新的特性是您可以載入不同的程序調度程序。另一個例子是,更複雜的硬體類型通常有多個通用層,位於低級硬體驅動程序和使用者空間之間,例如USB HID 驅動程序,它實現了 USB 堆棧的特定元素,獨立於底層硬體。


旁白:

  1. 這一廣泛聲明的一個例外是 CPU 晶片,它本身沒有“驅動程序” 。您的電腦還可能包含您沒有驅動程序的硬體。
  2. 作業系統核心中的其餘程式碼提供通用服務,如記憶體管理IPC調度等。這些服務可能主要服務於使用者級應用程序,如前面連結的範例一樣,或者它們可能是驅動程序或其他內部服務使用的內部服務。核心基礎設施。
  3. 其中之一,在引導過程的早期由引導載入程序/boot在引導時載入到 RAM中。

引用自:https://unix.stackexchange.com/questions/47208