陷阱门和中断门几乎是一模一样的:
(注:图里高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; }
测试结果:
正常运行。
小结