陷阱门,存在于IDT表中,与陷阱门一样
一个陷阱门描述符
一个3环可以访问的正确的陷阱门描述符,P位必为1,DPL也要为11(3)才能访问
TYPE位第一位为0,那么,P+DPL+TYPE第一位,必为1110,E
TYPE省下的位为1111,那么一个基础的陷阱门描述符为
陷阱门也没有参数传递
000000EF`00000000
由此可见,中断门和陷阱门的区别,在EE和EF上面(构造代码的区别)
0: kd> eq 8003f500 0040EF00`00081000
使用中断门的代码,无需任何代码上的修改(除了打印的时候把中断门改成陷阱门的字符串修改)成功访问0环,读取高2G内存
同样的一份代码,只在构造门描述符的时候,有了细微的改动,那么他们的区别在哪呢?
中断门执行的时候,会将IF位清零,但是陷阱门不会!
IF:在ELFAGES下标为9的位置,中断使能标志位
当IF位为0的时候,系统将会不再接收可屏蔽中断
可屏蔽中断:
简述:保存断点入栈,响应经中断控制器8259优先级判断后的中断请求,恢复断点。
I/O设备发出的所有中断(IRQ)都可以产生可屏蔽中断,受标志位IF的影响,根据中断循序标志的设置来判断CPU是否响应中断请求。
接口发出中断请求
当前指令执行完后,CPU响应中断
中断类型号 N送CPU
当前的EFR CS HE EIP 推入栈
清除 IF(中断允许标志位,IF=0,禁止CPU响应外部中断请求,IF=1,允许响应) 和TF(跟踪标志,也称单步执行,CPU按跟踪方式执行)
由中断类型号,查中断向量表获得中断服务子程序的入口地址
CPU执行中断子程序
开中断
IRET指令使EIP CS HE EFR弹出栈 ,返回被中断的源程序
不可屏蔽中断:
不可屏蔽中断属于 中断请求 的一种。外部不可屏蔽中断请求经由专门的CPU针脚NMI,通知CPU发生了灾难性事件,如电源掉电、总线奇偶位出错等。内部不可屏蔽中断请求是CPU内部自发产生的,如存储器读写出错、溢出中断、除法出错中断等。NMI线上中断请求是不可屏蔽的(既无法禁止的)、而且立即被CPU锁存。因此NMI是边沿触发,不需要电平触发。NMI的优先级也比INTR高。不可屏蔽中断的类型指定为2,在CPU响应NMI时,不必由中断源提供中断类型码,因此NMI响应也不需要执行总线周期INTA
简单描述:
可屏蔽中断,就是当我们的cpu正在运行一个程序的时候,我们的键盘或者鼠标使用的时候就会发出可屏蔽中断,系统接收到中断请求(键盘按下,键盘弹起,鼠标移动等等),就会中断应用程序,并且对鼠标的事件进行处理,CPU可以不处理鼠标键盘事件
而不可屏蔽中断,就是无法阻止,当cpu断电的时候,cpu并不是立即停下,cpu会使用内部的电源,而是通知电源管理器来对CPU内部的工作进行最后的处理,这个时间内,CPU不再接受任何中断,因为CPU知道自己已经断电,不会再处理别的中断请求,CPU需要马上去处理这个请求
当IF位为0的时候,系统不会再接收可屏蔽,不响应鼠标键盘事件等等!
当使用陷阱门的时候
并不在于中断是由外部产生的或是由cpu本身产生的
而是在于通过中断门进入中断服务程序时cpu会自动将中断关闭,也就是将cpu中eflags寄存器中IF标志复位,防止嵌套中断的发生;而通过陷阱门进入服务程序时则维持IF标志不变
通过中断门的转移和通过陷阱门的转移之间的差别只是对IF标志的处理。对于中断门,在转移过程中把IF置为0,使得在处理程序执行期间屏蔽掉INTR中断(当然,在中断处理程序中可以人为设置IF标志打开中断,以使得在处理程序执行期间允许响应可屏蔽中断);对于陷阱门,在转移过程中保持IF位不变,即如果IF位原来是1,那么通过陷阱门转移到处理程序之后仍允许INTR中断。因此,中断门最适宜于处理中断,而陷阱门适宜于处理异常。