陷阱門和中斷門幾乎是一模一樣的:
(注:圖里高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;
}
測試結果:

正常運行。
小結
