中断和异常时导致处理器转向正常控制流之外代码的两种操作系统条件。硬件或者软件都可以检测到这两种条件。陷阱trap指的是,当异常或者中断发生时,处理器捕捉到一个执行线程,并且将控制权转移到操作系统中某一固定地址处。Windows中,处理器将控制权转给一个陷阱处理器。陷阱处理器指的是与某个特殊的中断或者异常相关联的一个函数。
中断是一个异步事件,任何时候都可以发生,并且与处理器当前正在执行的任务毫无关系。中断主要是由IO设备、时钟或者定时器产生。中断可以被允许(打开)、或者被禁止(关闭)。
异常是一个同步事件,是一个特殊指令执行的结果。在同样的条件下用同样的数据第二次运行一个程序可以重现原来的异常。例子有:内存访问威力、特定的调试器指令、除零错误。内核也把系统服务调用看做异常。
无论硬件还是软件都可以产生异常和中断
当一个硬件异常或者终端产生的时候,处理器在被中断的线程的内核栈中记录下足够多的机器状态信
息,因而它可以回到控制流中该点出继续进行。如果线程在用户模式下执行,那么windows就切换到
该线程的内核模式栈,在被中断的线程的内核栈上创建一个陷阱帧,并且把线程的执行状态保存到陷
阱帧中。用dt nt!_ktrap_frame可以看到陷阱帧的定义。
内核安装了中断陷阱处理器来响应设备的中断。中断陷阱处理器将控制权传递给一个负责处理该中断
的外部例程ISR,或者传递给一个响应该中断的内部内核例程。设备驱动程序提供了ISR来处理设备中
断,内核则为其他类型的中断提供了中断处理例程。
绝大多数x86系统依赖i8259A可编程中断控制器PIC或者i82489高级可编程中断控制器APIC
Windows所支持的硬件平台上,外部IO中断进入到中断控制器的一根线上,控制器然后在一根线上中
断处理器。一旦处理器被中断了,就询问控制器获取此中断请求(IRQ)。中断控制器将IRQ转译成一个
中断号,利用该号码作为在中断分发表IDT中的索引,并且将控制权传递给恰当的中断分发例程。
windows使用自己的中断优先级方案,称为中断请求级别IRQL,在x86中,内核在内部使用0-31的数值
代表IRQL,在x64和ia64中,内核采用0-15的数值来代表IRQL。数值越大,代表中断的优先级越高。
内核为软件中断定义了一组标准的IRQL,而HAL则将硬件中断号映射为IRQL。
31 高端
30 电源失败
29 处理器间的中断
28 时钟
27 性能剖析
26 设备n
.............
3 设备1
2 DPC/dispatch
1 APC (1和2是软件中断)
0 被动(普通线程在这一级别执行)