特權級檢查的時間
在選擇子沒有被裝入cs之前進行檢查,如果檢查成功則將選擇子裝入cs暫存器。相應的rpl變為cpl。我覺得這個檢查的機制就像是資料庫的對內容的約束檢查,或者說更像是乙個before型別的觸發器。當cpl、rpl、dpl都通過檢查後,cpu將選擇子裝入相應的暫存器中。否則產生乙個通用保護異常。
特權級檢查的幾種情況:
● 訪問資料段
只要將選擇子裝入對應的資料段暫存器(ds、es、fs、gs)時就按照這個訪問規則進行的檢查,無論選擇子對應的描述符的屬性標識是否為資料段(type域的最高位——段描述符的第二個雙字的第11 位將決定該描述符為資料段描述符(為0)還是**段描述符(為1))。因為有的時候也需要訪問**段的資料。
資料段的訪問原則就是可以被高階的**訪問,不能夠被比自己許可權低的**訪問。
因此要求dpl>=cpl && dpl>=rpl
即 destination.dpl >= max
這裡所說的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值被延續了下來保持不變。
不通過「新增引用服務」呼叫WebService介面
有時候,在呼叫外網的服務時,例如webservice服務,直接新增引用服務,有時候還要手動更新服務,比較不夠智慧型,如果能只通過傳入服務位址和引數就能獲取資料,那就最好不過。以下就是乙個例子 public static xelement webcallrequestfunc string param...
不通過App Store裝MAC系統
mbp奮力上傳完畢.q a q 最近xcodeghost這麼猖獗,我憑什麼相信你提供的安裝包沒被植入惡意 a q a q 最近xcodeghost這麼猖獗,你為什麼要我開啟 允許任何 a q a 這是因為mac和windows檔案大小換算不同罷了,而且我在打包dmg檔案時設定的最高壓縮率。q a 不...
g 使用container of編譯不通過
linux核心裡面大量使用了container of,使用gcc編譯完全不存在問題 但專案中剛好需要使用g 進行編譯,container of一直編譯不通過,通過使用 g e source.cpp test.cpp一步一步測試,最後修改如下 ifdef cplusplus define contai...