Windows内核中的CPU架构-7-陷阱门(32-Bit|Windows内核中的CPU架构-7-陷阱门(32-Bit Trap Gate)

Windows内核中的CPU架构-7-陷阱门(32-Bit Trap Gate) 陷阱门和中断门几乎是一模一样的:

(注:图里高32位中的第11位的值为D,其实是1)
Windows内核中的CPU架构-7-陷阱门(32-Bit|Windows内核中的CPU架构-7-陷阱门(32-Bit Trap Gate)
文章图片



除了高32位中的type字段的内容不一样:
Windows内核中的CPU架构-7-陷阱门(32-Bit|Windows内核中的CPU架构-7-陷阱门(32-Bit Trap Gate)
文章图片



陷阱门的值为15,中断门的值为14。

陷阱门和中断门的区别: 陷阱门和中断门只有一个唯一的区别,其它的包括调用方式都是一模一样。
唯一区别:通过中断门进入中断服务程序时CPU会字段将中断关闭,也就是把CPU中EFLAG寄存器中的IF标志位复位,来防止嵌套中断的发生。而通过陷阱门进入中断服务程序时则维持IF标志位不变,这就是唯一区别。
其中有几个概念需要特殊说明,IF标志位,和中断的扩展内容。
中断
中断可分为,可屏蔽中断和不可屏蔽中断。
比如说:鼠标,键盘操作就是可屏蔽中断。

IF标志位:
EFLAG寄存器:
Windows内核中的CPU架构-7-陷阱门(32-Bit|Windows内核中的CPU架构-7-陷阱门(32-Bit Trap Gate)
文章图片



IF标志位对应的内容是中断使能标志,Interrupt flag。
当某一个中断请求发生时,中断控制器通过判断IF标志位的值来确定是否给CPU发生中断信号。
当IF为1时,可以响应可屏蔽中断请求,当IF为0时,就会禁止响应可屏蔽中断请求。
简单来说,就是Eflag寄存器中的IF标志位,来决定是否可以响应可屏蔽中断请求。
使用陷阱门: 这个和中断门一模一样,除了段描述符得改一改,我直接用之前的程序来配置了。
配置段描述符:
这里我就省略过程了。
段描述符值为:0040EF0000081080
保存在idt表内:
Windows内核中的CPU架构-7-陷阱门(32-Bit|Windows内核中的CPU架构-7-陷阱门(32-Bit Trap Gate)
文章图片


调用中断:
和中断门一模一样:

#include #include 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; }

【Windows内核中的CPU架构-7-陷阱门(32-Bit|Windows内核中的CPU架构-7-陷阱门(32-Bit Trap Gate)】
测试结果:

Windows内核中的CPU架构-7-陷阱门(32-Bit|Windows内核中的CPU架构-7-陷阱门(32-Bit Trap Gate)
文章图片



正常运行。
小结 陷阱门(trap gate)和中断门几乎一致,只是有能否屏蔽可屏蔽中断这个概念而已。

    推荐阅读