Windows內核中的CPU架構-7-陷阱門(32-Bit Trap Gate)
- 2021 年 11 月 11 日
- 筆記
- Windows內核中的CPU架構
陷阱門和中斷門幾乎是一模一樣的:
(註:圖裡高32位中的第11位的值為D,其實是1)
除了高32位中的type欄位的內容不一樣:
陷阱門的值為15,中斷門的值為14。
陷阱門和中斷門的區別:
陷阱門和中斷門只有一個唯一的區別,其它的包括調用方式都是一模一樣。
唯一區別:通過中斷門進入中斷服務程式時CPU會欄位將中斷關閉,也就是把CPU中EFLAG暫存器中的IF標誌位複位,來防止嵌套中斷的發生。而通過陷阱門進入中斷服務程式時則維持IF標誌位不變,這就是唯一區別。
其中有幾個概念需要特殊說明,IF標誌位,和中斷的擴展內容。
中斷
中斷可分為,可屏蔽中斷和不可屏蔽中斷。
比如說:滑鼠,鍵盤操作就是可屏蔽中斷。
IF標誌位:
EFLAG暫存器:
IF標誌位對應的內容是中斷使能標誌,Interrupt flag。
當某一個中斷請求發生時,中斷控制器通過判斷IF標誌位的值來確定是否給CPU發生中斷訊號。
當IF為1時,可以響應可屏蔽中斷請求,當IF為0時,就會禁止響應可屏蔽中斷請求。
簡單來說,就是Eflag暫存器中的IF標誌位,來決定是否可以響應可屏蔽中斷請求。
使用陷阱門:
這個和中斷門一模一樣,除了段描述符得改一改,我直接用之前的程式來配置了。
配置段描述符:
這裡我就省略過程了。
段描述符值為:0040EF0000081080
保存在idt表內:
調用中斷:
和中斷門一模一樣:
#include<iostream> #include<Windows.h> using namespace std; void _declspec(naked) test() { _asm { push eax mov eax,0x80b93040 mov eax,[eax] pop eax iretd } } int main() { printf("%x\n", test); _asm { int 0x20 } system("pause"); return 0; }
測試結果:
正常運行。
小結