核心模組是專門針對 Linux 的還是通用機制?

核心模組是專門針對 Linux 的還是通用機制?

我在Tanenbaum關於作業系統的書中看到有保護環,並且ring 0屬於核心。一般來說,人們可能會說“內核模組處理環 0 的 I/O 和記憶體管理”,或者“內核模組”特定於 Linux,不適用於 OpenBSD 和 MULTICS 等?

答案1

Andrew Tanenbaum 提出的想法通常無法直接適用於 Linux(或任何傳統的整體 Unix 核心)。您問題的答案比您建議的要簡單得多:Linux 核心模組是已編譯並連結到單獨檔案中的核心程式碼,而不是連結到核心映像中。這個單獨的核心物件檔案 (.ko) 可以在運行時按需載入到核心位址空間。實際上,所有可以編譯為核心模組的驅動程式也可以靜態連結到核心映像中,一旦載入程式碼,功能上沒有任何差異。

模組程式碼是核心程式碼,它以與所有其他核心程式碼相同的權限運行。原則上,核心模組可以替換任何核心程式碼,但為了乾淨地做到這一點,核心本身必須提供一種機制供模組掛鉤。

關於術語的附註:保護環是 Multics 作業系統引入的概念。 “Ring 0”到“Ring 3”是特定於 Intel 處理器的術語。其他處理器架構使用其他術語,例如使用者/管理員模式。儘管英特爾處理器提供四種不同級別的特權,但大多數作業系統只使用兩種:Ring 3 用於用戶級代碼,Ring 0 用於核心代碼,鏡像其他處理器的用戶/管理員模式。 (OS/2 是個例外,它使用三個等級的特權。)

隨著硬體級虛擬化技術的出現,特權級概念最近得到了擴展。例如,ARM架構定義了三個權限等級:User、Supervisor和Hypervisor。開玩笑地說,最終在基於Intel 的機器上使用了四個環:Ring 3 用於用戶級代碼,Ring 0 用於(虛擬機)內核代碼,Ring -1 用於管理程式碼,Ring -2 用於SMM 模式。

答案2

核心的概念並不適用於所有作業系統。它很普遍,但究竟如何將其應用於特定係統可能是一個有爭議的問題。

在程式彼此隔離的多道程式系統中,核心有一個精確的定義:核心是系統中可以存取所有內容的部分。內核是不孤立的部分。內核的作用至少是提供隔離機制,但它可以做更多的事情。在包括Linux在內的傳統Unix核心架構中,核心還包含硬體驅動程式、網路協定、檔案系統驅動程式等。

在大多數系統上,正在運行的程式之間的隔離依賴硬體功能(處理器特權模式、記憶體管理單元)。核心是系統中運作在處理器最高特權模式下的部分,在該模式下可以控制整個系統的特權。在 x86 處理器上,此模式稱為「ring 0」;請注意,「ring 0」是 x86 術語,而不是一般概念。一般概念稱為「核心模式」或「特權模式」或「主管模式」。

「核心模組處理環 0 的 I/O 和記憶體管理」這一說法沒有意義。核心作為一個整體,處理記憶體管理(在決定哪個進程擁有哪個記憶體以及在什麼位址存取記憶體的層級)和 I/O(在將資料複製進和複製外設的層級)。核心作為一個整體運行在處理器的核心模式下,即 x86 處理器上的 Ring 0。

核心模組是核心的一部分,在啟動後載入。模組和啟動時程式碼之間的唯一區別在於其載入方式。核心模組中的程式碼與啟動時載入的核心程式碼具有相同的權限級別,並且可以執行相同的功能(任何可以作為模組載入的程式碼也可以包含在啟動時映像中)。許多現代 Unix 系統都有核心模組,包括 Solaris、*BSD、Linux 等。

相關內容