今天的目標是打破「全內核運行」的現狀,實作從 Ring 0 (Kernel Mode) 到 Ring 3 (User Mode) 的切換。為了達成這個目標,我們擴展了全局描述符表 (GDT),並利用 x86 的中斷返回機制,「偽造」了一個跨特權級的跳轉。
在 x86 架構中,特權級分為 Ring 0 到 Ring 3。內核運行在 Ring 0,擁有最高權限;用戶程序則應運行在 Ring 3。
為了支持用戶態,我們在原本的內核段(Kernel Code/Data)基礎上,新增了兩個描述符:
當 CPU 執行跳轉時,會檢查當前特權級 (CPL) 是否有權訪問目標段 (DPL)。切換進入 Ring 3 的關鍵在於如何讓 CPU 「降權」。
x86 沒有直接從高權限跳轉到低權限的指令(如 jmp 是不允許的)。我們必須利用 iret (Interrupt Return) 指令的特性。
我們手動在堆疊上壓入 Ring 3 所需的環境資訊: