特權級檢查的時間
在選擇子沒有被裝入CS
之前進行檢查,如果檢查成功則將選擇子裝入CS
寄存器。相應的RPL
變爲CPL
。我覺得這個檢查的機制就像是數據庫的對內容的約束檢查,或者說更像是一個before
類型的觸發器。當CPL
、RPL
、DPL
都通過檢查後,CPU
將選擇子裝入相應的寄存器中。否則產生一個通用保護異常。
特權級檢查的幾種情況:
● 訪問數據段
只要將選擇子裝入對應的數據段寄存器(
DS
、ES
、FS
、GS
)時就按照這個訪問規則進行的檢查,無論選擇子對應的描述符的屬性標識是否爲數據段(TYPE
域的最高位——段描述符的第二個雙字的第11
位將決定該描述符爲數據段描述符(爲0
)還是代碼段描述符(爲1
)
)。因爲有的時候也需要訪問代碼段的數據。
數據段的訪問原則就是可以被高級的代碼訪問,不能夠被比自己權限低的代碼訪問。
因此要求 DPL>=CPL && DPL>=RPL
即 destination.DPL >= max{CPL, RPL}
這裏所說的DPL
、RPL
、CPL
都是指其相應位對應的值,值越大表示的特權級別就越低,下同。
● 訪問堆棧段(將選擇子裝入堆棧段寄存器SS
時)
CPL = destination.DPL = destination.RPL
● 不通過調用門訪問代碼段
選擇子裝入CS
寄存器時進行檢查。由於使用JMP
、CALL
和RET
指令在當前代碼段內進行進程控制的轉移的時候不進行段切換不需要更新選擇子所以不進行特權級的檢查。只有將新的選擇子裝入CS
寄存器的時候才進行特權級檢查。
調用可以通過門調用,也可以不通過,但是如果不通過調用門,那麼CPL
不會發生變化。
1.
訪問非一致碼(跳轉目的選擇子對應的描述符的一致性標誌位C=0
)
非一致碼只允許訪問(調用)處於同一特權級別的代碼。大多數代碼都應該是非一致的。這樣,除非使用調用門否則程序只能在同級別之間發生轉移。只有 destination.DPL=CPL && destination.RPL<=CPL
時才允許訪問。
2.
訪問一致代碼(跳轉目的選擇子對應的描述符的一致性標誌位C=1
)
一致代碼段就是無須進行特權轉換的代碼段。當一致代碼段被調用時,直接使用當前特權級執行該代碼段,這樣是爲了從外層級跳到自由內層級。
一致代碼段描述符中的DPL
規定了可以轉移到一致代碼段的最內層特權級。一致代碼段描述符內DPL
的這種解釋,正好與非一致代碼段DPL
的解釋相反。於是3
級的程序可以轉移到任何一致的代碼段,而0
級的程序只允許轉移到DPL
等於0
的一致代碼段。
一致代碼一般用於一些公共程序,
如數學庫函數、異常處理等。這些程序本身是系統或應用程序的一部分,但它們應該能被低級別應用程序任意調用而不需要訪問受保護的系統模塊。
如果是非一致碼則會忽略RPL
,不檢查RPL
,而只檢查CPL
和DPL
。此時只要滿足 destination.DPL>=CPL
即:目的(需要調用的系統函數)的特權級別比當前(應用程序)的特權級別高就可以被調用。但是目的選擇子的RPL
不會被裝入CS
寄存器,原選擇子的CPL
值被延續了下來保持不變。