这一篇来说陷阱门,陷阱门这东西,就没什么好讲的,应该Windows几乎没怎么用,陷阱门也是位于IDT表里的,列出前48个描述符,就没有陷阱门。。。
陷阱门描述符
看图,陷阱门描述符,和中断门描述符,就1个位不一样,中断门的Type域是1110,陷阱门是1111
代码实现
代码实现也和中断门的完全一样,搬过来就行了。
1 |
|
与中断门的差别
那可能有人要问了,既然陷阱门和中断门完全一样,有什么存在的意义。那还是有一点不同的,来看两次执行的结果:
同样的代码,执行结果不同,可以发现,陷阱门和中断门的区别在于,中断门执行后EFLAG寄存器的值发生了改变,而陷阱门不会改变EFLAG,这就是陷阱门和中断门的差别。
EFLAG寄存器结构
根据EFLAG寄存器的结构可以得知,中断门执行后,将IF位置0了,但陷阱门不会,这就是中断门和陷阱门的唯一区别。
那么这个IF位有什么用呢?为什么陷阱门要将IF位置0呢?
稍查资料,可以了解到IF标志是用于控制处理器对可屏蔽中断请求的响应。置1以响应可屏蔽中断,反之则禁止可屏蔽中断。IF标志对不可屏蔽中断没有影响。
这里举个简单的例子说明下什么是可屏蔽中断,什么是不可屏蔽中断。打开任务管理器,可以看到有很多进程正在运行,这时候,你想把电脑锁屏,于是按下Win+L,这个时候键盘会向CPU发送一个可屏蔽中断,告诉CPU,用户按下了Win+L键,需要执行锁屏功能,如果此时EFLAG的IF位为1,这是CPU会短暂放下手上的任务,先去处理你的锁屏任务,处理完后,你的电脑锁屏了,CPU会继续运行刚刚处理的进程;如果此时ELFAG的IF位为0,那么CPU就和没听到一样,继续做它自己的事。如果遇到意外状况,电脑的电源线拔了下来,断电了,这时电源会向CPU发送一个不可屏蔽中断,这个中断不受IF位影响,CPU一定会去处理。这时有人会问了,断电后CPU还怎么工作?其实在主板上,是有电容的,可以在断电后让CPU再去做一些清理工作,这就是不可屏蔽中断。
总结
中断门和陷阱门的唯一区别:中断门执行时,将IF位清零,但陷阱门不会。