x86-6-特权级-3-陷阱门(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)和中断门几乎一致,只是有能否屏蔽可屏蔽中断这个概念而已。