Linux模組/驅動程式屬於核心空間還是使用者空間

Linux模組/驅動程式屬於核心空間還是使用者空間

有些文章說模組/驅動程式屬於內核空間,因為它參與形成內核; (參考:http://www.freesoftwaremagazine.com/articles/drivers_linux

而其他人則說只有 Ring0(直接與硬體交互)可以稱為內核空間(排除模組/驅動程序,因為它們位於 Ring2)。 (參考:http://jaseywang.me/2011/01/04/vfs-kernel-space-user-space-2/

誰能告訴我哪一種觀點是正確的?

答案1

在 AMD64 及其克隆版本以及 ix86 上,Linux 僅使用環 0 和 3。此外,Linux 是單一的。整個環的想法是能夠在環0 上運行微內核,並讓服務進程在更高的環上運行,這樣它們就不會弄亂微內核,最後讓用戶空間在最高環上運行,這是它無法做到的傷害很大。

答案2

能提供一下參考嗎?我假設您談論的是 Linux,(據我所知)它僅使用 Rings 0(核心)和 3(用戶)。

編輯:

我認為這取決於作業系統的設計。您可以在微核心架構中使用內環。您是否詢問特定係統(例如Linux)?我相信只有針對特定作業系統才能回答這個問題。然而,在大多數情況下,基於 x86 的作業系統僅使用「核心」(0) 和「使用者」(3)。

答案3

對於傳統作業系統(不在虛擬化下運作),核心空間和ring0在權限方面是同義詞。然而,我必須分別解釋它們,以突出它們存在的差異和共同點。

Kernel space- 作業系統通常有兩種執行模式:核心空間和使用者空間。核心空間是作業系統的特權程式碼(如調度程式、裝置驅動程式等)所在的地方。它的任務是管理整個系統,並確保其穩定運作。使用者空間包含Web瀏覽器等的進程,它們使用核心空間提供的功能。

Rings- 英特爾處理器具有 4 個操作權限等級。這些稱為環。環 0 的特權最高,而環 3 的特權最低。電腦記憶體的任何區域都可以用這些等級來標記。如果一個記憶體區域被ring0標記為訪問,那麼只有駐留在ring0中的程式碼可以存取它,而被ring3標記為訪問的記憶體區域可以被所有環訪問。這提供了一種機制,確保如果您在較低特權等級(較高環)中執行不太受信任的程式碼,而在較高特權等級(較低環)中執行更受信任的程式碼,則前者無法影響後者。可以透過程式設定哪些程式碼在哪個環(權限等級)中運行。

為了簡化設計,並使程式碼可移植(ARM 等非英特爾 CPU 沒有 4 環架構),大多數作業系統僅使用 4 環中的兩個。這些通常是ring0 和ring3。核心運行在ring0,構成核心空間(注意,如果明天作業系統開發者讓核心運行在ring1,而不是ring0,那麼ring1將構成核心空間)。應用程式運行在ring3中,構成用戶空間。

這是大多數作業系統遵循的約定。然而,如果我是作業系統開發人員,我可以以任何我想要的方式自由使用環形架構。考慮以下場景
:(KS=內核空間,我們=使用者空間,DD=裝置驅動程式或內核模組,rX= 環 X)

  1. KS在 r0 中,我們在 r3 中 - 最常用。例如。 Linux、Windows 等
  2. KS在 r1 中,我們在 r3 - 虛擬化設定中,虛擬機器管理程式在 Ring0 中運作。
  3. KS在 r0 中,DD在 r1 中,我們在 r3 中 - 一些研究項目使用此配置來保護核心免受有缺陷的裝置驅動程式的影響。
  4. KS在 r0 中,DD在 r3 中,我們在 r3 中 - 微內核使用此配置。
  5. KS在 r0 中,我們在 r0 中 - 一切都在同一個環中。一些研究作業系統(例如 Microsoft 的奇點)使用此配置。使用其他機制保護 KS 免受 US 影響。 (MS DOS、Windows 98 等較舊的作業系統使用了此功能。KS 不受 US 保護,因此作業系統崩潰很頻繁。)
  6. KS在 r3 中,我們在 r0 - 荒謬。給予美國更多特權,將允許美國腐敗KS。從未見過這樣的配置,但如果我想編寫這樣的作業系統,沒有什麼可以阻止我這樣做。

附註:我在寫作時做了一些簡化,例如將 x86 架構稱為 Intel CPU。現在不要為複雜的事情而煩惱。

相關內容