1、中断与异常是导致控制流转向的条件,硬件或软件可以检测这两种条件。
2、内核对待中断的态度是:中断是异步事件,与处理器当前执行的任务无关;异常是同步事件,是一个特殊指令执行的结果
3、异常和中断发生时,如果该线程在用户模式下执行,到该线程内核模式栈,在内核栈上创建一个陷阱帧,把线程的执行状态保存到该帧里。陷阱帧是线程完整执行环境的一个子集。
4、内核安装了前端陷阱处理函数,在内核将控制权转交给与该陷阱相关的函数前,由这些前端函数来执行一些常规的陷阱处理任务,通常是判断陷阱类型进行下一步的控制权转交工作。
5、中断分发,内核使用中断陷阱处理器来响应设备的中断。中断陷阱处理器或者将控制权给负责处理中断的外部例程(ISR),或者传递给一个响应该中断的内部内核例程。设备驱动程序提供了ISR来处理设备中断,内核为其他类型的中断提供了ISR
6、硬件中断处理。外部I/O中断进入到中断控制器的某一根线上,该控制器然后在一根线上中断处理器。一旦处理器被中断了,它询问控制器以获得此中断请求(IRQ)。控制器将IRQ转成一个中断号,做为中断分发表(IDT)中的索引,并将控制权传递给恰当的中断分发例程,每个处理器有单独的IDT。
==========
1、X86中断控制器
APIC为依赖于高级可编程中断控制器。由几个部件构成:
(1)专门接收设备中断的I/O APIC
(2)本地APIC
(3)一个与I8259A兼容的中断控制器
2、APIC在私有的APIC总线上接收到来I/OAPIC的中断,中断控制器负责把APIC输入转制成与PIC等价的信号
3、I/O APIC 负责中断传送算法
4、X64中断控制器
无法运行于不具有APIC的系统上
5、IA64中断控制器
依赖于SAPIC,中断不能过私有总线,通过I/O和系统总线传送
6、软件中断请求级别(IRQL)
X86用0到31,X64和IA64用0到15表示,数值大表示优先级高
7、X86中断请求级别从高到低:
高端、电源失败、处理器间中断、时钟、性能剖析、设备N,设备N-1。。。。设备1,DPC/DISPATCH,APC,被动
8、每个处理器有个可变化的可设置的IRQL值
9、访问PIC相对较慢,使用了PIC的HAL使用延迟IRQL,延迟写入处理器的IRQL值,当IRQL提升,HAL内部记录新的IRQL,不改变中断屏蔽值,如果一个更低的优先级中断接着发生,则HAL设置正确的IRQL值,并这个低优先级的中断延迟到IRQL被为止。
========
1、中断对象:内核提供了一种可移植的机制让设备驱动程序可以为它们的设备注册ISR,就是内核控制的中断对象
(1)它包含了供内核将一个设备的ISR与一个特定级别的中断关联起来而需要的信息,包括ISR地址、设备中断时所在的IRQL级别、以及内核中与该ISR关联的IDT项。
(2)当一个中断对象被初始化后,少量汇编语言代码指令被从一个中断处理模板中拷贝过来,保存在该对象中,这些代码调用了实际的中断分发器,并将指向该中断对象的指针传递给它。
2、当一个ISR与某个特定的中断级别关联起来,这一操作称为连接一个中断对象。将一个ISR与IDT项断开关联,则称为断开一个中断对象,这些操作通过调用内核函数IoConnectInterrupt和IoDisconnectInterrupt完成,使得设备驱动程序可以在加载到系统的时候打开一个ISR,如果驱动程序被卸载的话,可以关闭ISR
3、使用中断对象来注册一个ISR,可避免设备驱动程序直接操纵中断硬件,不必知道IDT的细节
4、中断对象使得内核很容易为任何一个中断级别调用多个ISR,如果多个设备驱动程序创建中断对象,可将它们连接到同一个ISR项上