-
-
[原创]13.滴水中级班(内核驱动)——陷阱门
-
发表于: 2小时前 49
-
陷阱门和中断门几乎是一样的
之前和大家说过,IDT表里包含三种门描述符,分别是任务门、中断门、陷阱门,中断门刚才已经讲过了,接下来来看一下陷阱门的描述符。
低四个字节的0~15和高四个字节的16~31依旧是组合在一起可以组成一个代码段的段内偏移,至于是哪个代码段,则由低四个字节的16~31来指定,这里要写上一个代码段的段选择子。陷阱门也是不能传参数的,所以高四个字节的0~7是0。P是1;DPL是11;8~12位需要注意,如果是中断门的话,这部分是1110也就是E,如果是陷阱门的话是1111也就是F。
这里做个实验演示一下。
这里用的代码是中断门的代码,一模一样一点没改,这里依旧是读取一下高2G的内存,如果读取成功,就说明我们的这个是正确的。
可以看到值读出来了,说明没问题。这个时候有人要问了,既然陷阱门和中断门没有区别的话,为什么要有陷阱门啊?注意我们刚才说的是几乎一样,这里还有一个地方是不一样的,它俩唯一的区别就是——中断门执行时,会将IF位清理,但陷阱门不会。
IF位是做什么?IF位是interrupt flag里面下标为9(下标从0开始)的寄存器,中断允许标志位。它用来控制8086是否允许接收外部中断请求。若IF=1,8086能响应外部中断,反之则屏蔽外部中断。中断分为可屏蔽的和不可屏蔽的,这是硬件上的一个概念,比如说程序正在执行的时候,我们按了一下键盘,比如Win+L可以把屏幕锁住,虽然我们的程序在跑,但是依旧会锁屏,那么为什么会这样呢?就是因为我们的CPU接收到后会发送一个硬件请求,按键盘的中断就是可屏蔽中断,这种可屏蔽中断是受IF位影响的。而如果IF位此时为0,那么CPU不管,就像没听见一样,这就是可屏蔽中断,总结一下就是IF=1,可以对可屏蔽中断反应,IF=0,对可屏蔽中断没反应。那么什么事不可屏蔽中断呢?比如说寄存器执行的时候突然断电了,那么电源就会通过电源管理器向CPU发送请求,这种中断就是不可屏蔽中断,一旦发生这种中断,那么CPU不管IF为0还是为1,CPU必须立刻去处理。即CPU断电发出的请求就是不可屏蔽请求。IF位这个开关,只对那些“可以被忽略”的中断请求起作用,对于那些“必须处理”的紧急中断是无效的。