AI智能
改变未来

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 eaxmov eax,0x80b93040mov eax,[eax]pop eaxiretd}}​int main(){printf(\"%x\\n\", test);_asm{int 0x20}system(\"pause\");return 0;}

  

测试结果:

正常运行。

小结

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

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » Windows内核中的CPU架构-7-陷阱门(32-Bit Trap Gate)