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)和中斷門幾乎一致,只是有能否屏蔽可屏蔽中斷這個概念而已。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM