天天看點

特權級3(調用門)

調用門的作用

gate簡單來說可以想象成政府為人民提供的一個政府訴求中心,它可以集中收集人民對政府的要求和投訴,然後把這些訴求發給相關的政府部門來處理。

門提供了受保護的間接調用,為任務内的特權轉移提供了安全可靠的方法。由于程式不可能進入具有更高優先級段中的任何位置。如果他們一定要進入,則隻能使用調用門進入到調用門描述符指定的位置。而作業系統中定義了系統中的全部門,是以也就保證了所有的門隻能進入幾個受托的過程。這與試用軟中斷間接調用BIOS和DOS的功能調用所提供的機制相似。例如配置設定存儲空間和I/O等操作。一旦通過調用門進入後,CPL發生改變,程式就完全進入了被調用代碼的特權級。

調用門描述符的存儲位置:

調用門描述符可以放在GDT、LDT中,但是不能放在IDT中。

調用們的通路規則:

調用門就是允許外層程式通路非一緻代碼時能夠像一緻代碼那樣使用。門的通路規則就像是對資料段的通路——使用調用門的代碼的特權級要>=調用門的特權級才能使用該門,否則(調用程式的特權級比調用門中的特權級低)不允許通路。

例如,如果調用門描述符中的DPL=2,那麼一個CPL=2的程式可以使用該門調用一個特權級為1的過程,但特權級為3的程式則不行。

通過調用門調用門描述符所對應的選擇子中對應的代碼需要對以下幾個标志進行檢查:

● CPL(目前特權級)

● 調用門選擇子的RPL

● 調用門描述符的DPL

● 目标代碼段的段描述符的DPL

規則對一緻碼和非一緻碼也有所不同(C=1/0)

處理器首先會處理調用程序和調用門之間的特權級檢查,如果檢驗通過了處理器緊接着就用代碼段描述符DPL和調用程序的CPL進行特權級檢查。

從下表中可以看到,隻有CALL指令可以使用調用門将程序控制轉移到一個特權級更高(DPL<CPL)的非一緻代碼段,而對JMP指令使用調用門與否是一樣的。

指令 通路門的權限 通路代碼權限
CALL

CPL <= callgate.DPL

&&

RPL <= callgate.DPL

目标為一緻代碼段:destination. DPL <= CPL
目标為非一緻代碼段:destination.DPL <= CPL
JMP

CPL <= callgate.DPL

&&

RPL <= callgate.DPL

目标為一緻代碼段:DPL <= CPL
目标為非一緻代碼段:DPL = CPL

如果調用特權級更高的非一緻目标代碼段,CPL就降為目标代碼段的DPL特權級,并且會發生棧切換。如果調用或者跳轉到一個特權級更高的一緻目标代碼段,CPL不會發生變化,也不會發生棧切換。

我在想如果系統有定義的話,如果不嫌麻煩,你也完全可以從一個門調用另一個門中的程式(調用門1→調用門2→程式)。這樣做不會讓你得到任何額外的好處,你的權限也不會有任何提升。是以你完全可以直接調用門2去調用希望被調用的代碼。

繼續閱讀