文库网
首页 > 小知识

系统机制之中断分发 深入解析windows操作系统 学习笔记(2)

2023-04-08 来源:文库网
软件程序可以用一个固定的中断 转送算法,对I/O APIC进行重新编程,从而绕过主板上的这部分逻辑。Windows正是这样做的, 它将APIC的转送模式编程为“中断指定集合中的一个处理器”。
4.X64中断控制器
因为x64体系架构与x86操作系统兼容,所以x64系统必须提供与x86同样的中断控制器。 然而,一个重要的区别是,Windows的x64版本将无法运行于不具有APIC的系统上,因为它们 使用APIC进行中断控制。
5.IA64中断控制器
IA64体系架构依赖于精简的高级可编程中断控制器(SAPIC),这是APIC的一个演化。即 使固件中有中断转送和负载均衡的功能,Windows也不使用,而是釆用轮转方式静态地将中断 分配给相应的处理器。
6.软件中断请求级别(IRQL)
虽然中断控制器已经实现了中断优先级,但是,Windows仍然强制使用它自己的中断优先 级方案,称为中断请求级别(IRQL, interrupt request level)在x86系统上,内核在内部使用 0~31的数值来表示IRQL;而在x64和IA64系统上,内核釆用0〜15的数值来表示IRQL。这里数 值越大,代表中断的优先级越高。内核为软件中断定义了一组标准的IRQL,而HAL则将硬件 中断号映射为IRQL。
中断是按照优先级处理的,高优先级的中断会抢占低优先级中断的执行权。当一个高优 先级的中断发生时,处理器把被中断的线程的状态保存起来,并调用与该中断关联的陷阱分 发器。该陷阱分发器提升IRQL,并调用该中断的服务例程。在服务例程执行完以后,中断分 发器再降低处理器的IRQL,使其回到中断发生前的级别,然后装入保存的机器状态。被中断 的线程从原来停止的地方恢复运行。当内核降低IRQL时,被屏蔽的低优先级中断有可能得以 出现。如果是这样,内核会重复上述过程来处理新的中断。
与线程调度优先级比起来,IRQL优先级别有着完全不同的含义。调度优 先级是线程的一个属性,而IRQL则是中断源(比如键盘或鼠标)的一个属性。而且,每个处 理器都有一个IRQL设置,它会随操作系统代码的执行而变化。
每个处理器的IRQL设置决定了该处理器可以接收哪些中断。IRQL也被用来实现对某些内 核模式数据结构的同步访问。内核模式的线程运行 时,它或者通过调用KeRaZse/rg/或KeZower/rg/直接地提升或降低处理器的IRQL,或者,更常 见地,通过调用那些获取内核同步对象的函数间接地提升或降低处理器的IRQL。 如果中断源的IRQL高于处理器当前的级别,则从该源处发生的中断会打断处理器;如果中断 源的IRQL等于或者低于当前的级别,则这样的中断会被屏蔽(mask),直到有一个正在执行的 线程降低IRQL级别为止。
因为访问PIC是一个相对比较慢的操作,所以,那些要求访问I/O总线来改变IRQL的HAL, 比如PIC和32位ACPI (Advanced Configuration and Power Interface)系统的HAL,它们实现了 一种性能优化,称为延迟IRQL,以避免PIC访问。当IRQL被提升时,HAL在内部记录下新的 1RQL,而不是改变中断屏蔽值。如果一个优先级较低的中断随后发生,则HAL将中断屏蔽值 设置成对于第一个中断较为正确的值,并且在IRQL被降下来之前不会提交优先级较低的中断 (因此,保持该中断不被处理)。因此,如果当IRQL被提升时没有优先级较低的中断发生,则 HAL并不需要修改PIC。
7.中断屏蔽
内核模式的线程根据想要做什么事情,来提升或降低它运行所在的处理器的IRQL。例如, 当一个中断发生的时候,陷阱处理器(或者,也可能是处理器本身)将该处理器的IRQL提升 至中断源所分配到的IRQL。这一提升会屏蔽住那些属于该IRQL或者比它低的所有中断(仅仅 在同一处理器上),这样可确保处理该中断的处理器不会被同一级别或者更低级别的中断劫掉。 被屏蔽的中断或者由另外的处理器来处理,或者被保留,直到IRQL降下来。因此,系统的所 有组件,包括内核和设备驱动程序,都试图让IRQL保持在被动级别(有时候也称为低端级别)
上。它们之所以这样做,是因为,如果处理器的IRQL不被长时间地保持在不必要的高级别上, 设备驱动程序就可以更加及时地响应硬件中断。
8.中断对象
内核提供了一种可移植的机制,使得设备驱动程序可以为它们的设备注册1SR,这种机制 就是一个称为中断对象的内核控制对象。中断对象中包含了所有“供内核将一个设备的ISR与 一个特定级别的中断关联起来而需要”的信息,包括该ISR的地址、该设备中断时所在的IRQL, 以及内核中与该ISR关联的IDT项。中断对象被初始化时,少量的汇编语言代码指令(称为分 发代码(dispatch code))将被从中断处理模板KilnterruptTemplate中复制过来,保存在该对象 中。当中断发生时,这些代码将被执行。
猜你喜欢