我們可以把 Linux 系統大致分為三大層:
這是我們平常使用的應用程式執行的地方,像是 Shell、瀏覽器,以及自己寫的程式,都在這個空間執行。
這是 Linux 核心程式碼執行的地方,負責行程排程、記憶體管理、檔案系統,以及透過驅動程式操作裝置等工作。
當使用者程式需要讀取檔案(I/O)等核心服務時,就會透過 System Call(系統呼叫,也稱 syscall) 提出請求,由 Kernel 檢查處理後把結果交回程式。
包含 CPU、RAM、儲存裝置與網路卡等,提供系統運作需要的實體資源。
區分出 User/Kernel Space 的目的主要是為了保護系統,避免應用程式任意存取核心記憶體或操作硬體。
透過隔離與保護機制,一般使用者程式發生 Crash 時,通常只會讓該 Process 終止,不會直接造成核心崩潰。
除了空間上的區分,CPU 也會區分執行程式碼時的權限模式:
應用程式執行通常處於 User Mode,核心程式碼處於 Kernel Mode。
接下來就以 x86/x86-64 架構為例,看看 CPU 如何透過 Protection Ring 區分執行權限。

圖片來源
x86 架構提供了 Ring 0 到 Ring 3 四個權限等級,數字越小,權限越高。
在 x86/x86-64 架構上,Linux 主要使用其中兩個:
| 權限等級 | 執行模式 | 執行的程式碼 |
|---|---|---|
| Ring 0 | Kernel Mode (核心模式) | Kernel 程式碼 |
| Ring 3 | User Mode (使用者模式) | 應用程式與 User Space 函式庫的程式碼 |
CPU 會配合記憶體保護等機制,限制程式可以執行的操作與存取的資源。
當使用者程式需要 Kernel 提供服務時,可以透過 System Call,讓 CPU 從 User Mode 進入 Kernel Mode,由 Kernel 程式碼處理請求。若正常返回 User Space,就會回到 User Mode 繼續執行。
Ps. 使用 sudo 以 root 身分執行程式,程式本身的 User Space 程式碼仍然在 User Mode(Ring 3) 執行;需要核心服務時,一樣透過 System Call 進入 Kernel Mode。
root 是使用者身分,Ring 0 則是 CPU 的執行權限等級,兩者不同!
今天介紹了 Linux 的三層架構(User/Kernel Space),以及 User Mode 和 Kernel Mode 的差異。
而後面我們會接觸 User Space 與 Kernel Space 中的 Hook,介入的位置不同,能攔截到的行為與影響範圍也會不同。