IA32的分段機制中,特權級總共有4個特權級別,分別是0,1,2,3。數字越小表示特權級越大。DPL和RPL都是用來表示特權級別的。
見上圖 ,較爲核心的代碼和數據,被放在特權級較高的層級中。處理器將這樣的機制來避免低特權級的任務在不被允許的情況下訪問位於高特權級的段。如果處理器檢測到一個訪問請求不是合法的,將會產生常規保護錯誤(#GP)
處理器通過識別CPL、DPL、RPL這3中特權級別進行特權級別檢查。
1.CPL(Current Privilege Level)
CPL是當前執行的程序或任務的特權級。它被存儲在CS和SS的第0位和第1位上。在通常情況下,CPL等於代碼所在的段的特權級。當程序轉移到不同特權級的代碼段時,處理器將改變CPL。
但是有個例外是一致代碼段,一致代碼段可以被相同或者更低特權級的代碼訪問,當處理器訪問一個與CPL特權級不同的一致代碼段時,CPL不會改變。
2.DPL(Descriptor Privilege level)
DPL表示段或者門的特權級。它被存儲在段描述符或者門描述符的DPL中,噹噹前代碼段試圖訪問一個段或者門時,DPL將會和CPL以及段或門選擇子的RPL相比較。下面是各種類型的段或者門的情況:
數據段:
DPL規定可以訪問此段的最低特權級。只有運行在CPL<=DPL程序纔有權訪問。比如一個數據段的DPL是1,只有運行在CPL爲0或者1的程序纔有權訪問。
非一致代碼段(不使用調用門):
DPL規定訪問此段的特權級。只有CPL=DPL的程序纔可以訪問。比如,一個非一致代碼段的特權級爲0,只有CPL爲0的程序纔可以訪問。
調用門:
DPL規定可以訪問此段的最低特權級。(這與數據段的規則是一致的)
一致代碼段和通過調用門訪問的非一致代碼段:DPL規定了訪問此段的最高特權級。比如一個一致代碼段的DPL是2,那麼CPL爲0和1的程序將無法訪問此段。
TSS:
DPL規定了可以訪問次TSS的最低特權級(與數據段的規則是一致的)
3.RPL(Requested Privilege Level)
RPL是通過段選擇子的第0位和第1位表現出來的。操作系統過程往往用RPL來避免低特權級應用程序訪問高特權級段內的數據。當操作系統過程(被調用過程)從一個應用程序(調用過程)接受選擇子時,將會把選擇子的RPL設成調用者的特權級。於是,當操作系統用這個選擇子區訪問相應的段時,處理器將會用調用過程的特權級(RPL),而不是更高的操作系統過程的特權級(CPL)進行特權檢驗。這樣,RPL就保證了操作系統不會越俎代庖的代表一個程序區訪問一個段,除非這個程序本身是有權限的。
===============================================================
特權級轉移:
我們可以通過jmp或call進行直接轉移,轉移的條件如下
1.目標是非一致代碼段:CPL = DPL(目標)並且RPL<=DPL(目標)
2.目標是一致代碼段:CPL>=DPL(目標) RPL不做檢查。
當轉移到一致代碼段中後,CPL會被延續下來,而不會變成目標代碼段的DPL。
通過jmp和call所能進行的代碼段間的轉移時非常有限的:
對於非一致代碼段,只能在相同特權級別的代碼之間轉移。
對於一致代碼段也最多能從低到高,而且CPL不會改變。
如果想自由的進行不同特權級之間的轉移,需要其他幾種方式,即運用門描述符或者TSS。