調用門的作用
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指令使用調用門與否是一樣的。
如果調用特權級更高的非一致目標代碼段,CPL就降爲目標代碼段的DPL特權級,並且會發生棧切換。如果調用或者跳轉到一個特權級更高的一致目標代碼段,CPL不會發生變化,也不會發生棧切換。
我在想如果系統有定義的話,如果不嫌麻煩,你也完全可以從一個門調用另一個門中的程序(調用門1→調用門2→程序)。這樣做不會讓你得到任何額外的好處,你的權限也不會有任何提升。所以你完全可以直接調用門2去調用希望被調用的代碼。