Windows內核中的CPU架構-7-陷阱門(32-Bit Trap Gate)

Windows內核中的CPU架構-7-陷阱門(32-Bit Trap Gate)

陷阱門和中斷門幾乎是一模一樣的:

 

(註:圖裡高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;
}

  

測試結果:

 

 

 

正常運行。

小結

陷阱門(trap gate)和中斷門幾乎一致,只是有能否屏蔽可屏蔽中斷這個概念而已。