🚩 核心目標

今天的目標是打破「全內核運行」的現狀,實作從 Ring 0 (Kernel Mode) 到 Ring 3 (User Mode) 的切換。為了達成這個目標,我們擴展了全局描述符表 (GDT),並利用 x86 的中斷返回機制,「偽造」了一個跨特權級的跳轉。


1. 基礎理論:x86 特權級與 GDT 擴展

在 x86 架構中,特權級分為 Ring 0 到 Ring 3。內核運行在 Ring 0,擁有最高權限;用戶程序則應運行在 Ring 3。

1.1 增強 GDT 結構

為了支持用戶態,我們在原本的內核段(Kernel Code/Data)基礎上,新增了兩個描述符:

1.2 權限檢查 (CPL, DPL, RPL)

當 CPU 執行跳轉時,會檢查當前特權級 (CPL) 是否有權訪問目標段 (DPL)。切換進入 Ring 3 的關鍵在於如何讓 CPU 「降權」。


2. 實作:如何「降級」進入 User Mode?

x86 沒有直接從高權限跳轉到低權限的指令(如 jmp 是不允許的)。我們必須利用 iret (Interrupt Return) 指令的特性。

2.1 偽造堆疊框架 (Stack Framing)

我們手動在堆疊上壓入 Ring 3 所需的環境資訊:

  1. User SS (指向 User Data Segment,RPL=3)
  2. User ESP (用戶態的棧頂指針)
  3. EFLAGS (包含 IF 位,確保用戶態能接收中斷)
  4. User CS (指向 User Code Segment,RPL=3)