系统机制之中断分发 深入解析windows操作系统 学习笔记(3)
2023-04-08 来源:文库网
这份驻留在中断对象中的代码调用实际的中断分发器,通常是内核的KilnterruptDispatch 或KiChainedDispatch例程,并且将指向该中断对象的指针传递给它。KilnterruptDispatch这个 例程适用于那些仅注册了一个中断对象的中断向量,而KiChainedDispatch适用于那些可在多 个中断对象之间共享的中断向量。中断对象中所包含的信息使得这第二个分发器例程能够找 到并正确地调用设备驱动程序所提供的ISR。
中断对象也保存了与该中断相关联的IRQL ,所以KilnterruptDispatch或者 KiChainedDispatch能在调用ISR之前将IRQL提升到正确的级别上,在ISR返回之后再降低IRQL。 此两步骤处理过程是必需的,因为中断的初始分发是由硬件来完成的,所以,在初始分发时 是没有办法传递中断对象指针的(或者任何此类的其他参数)。在多处理器系统上,内核会为 每个CPU分配一个中断对象,并对它初始化,使该CPU上的本地APIC能够接受特定的中断。
在x64 Windows系统上,内核优化了中断的分发过程,其做法是,使用一些特殊的例程, 通过忽略一些不必要的功能来节省处理器的指令开销,比如:KilnterruptDispatchNoLock,此 例程用于那些’‘没有相关联的、由内核来管理的自旋锁(此自旋锁往往被驱动程序用来同步 它们的ISR)”的中断;KilnterruptDispatchNoEOl,此例程用于那些已经将APIC编程为“Auto- EOK自动结束中断,Auto-End-of-Interrupt) ”的中断——因为中断控制器将自动发送EOI信号, 内核不需要额外的代码来自行完成EOL工作。最后,专门针对性能中断或性能剖析中断,使用 KilnterruptDispatchLBControl处理器,它支持现代处理器所提供的最后分支控制MSR (Last Branch Control MSR)o此寄存器使内核在跟踪模式下可以跟踪/保存分支指令;在中断过程中, 这一信息会被丢失,因为在常规的线程寄存器环境中,并没有存放此信息,所以,必须要加入 特殊的代码来保存此信息。
例如,HAL的性能中断和性能剖析中断使用了这一功能,而其他 的HAL中断例程则利用了 “无锁”分发代码,因为HAL并不要求内核同步其ISR。
另一个内核中断处理器是它用于那些要求保存浮点状态的中断。内 核模式代码通常不允许使用浮点(MMX、SSE、3DNow!)操作,因为这些浮点寄存器在环境 切换时并不被保存;然而,与此不同的是,ISR可能需要用到这些寄存器(比如显卡的ISR执 行一个快速绘制操作)。驱动程序在连接一个中断时,可以将FloatingSave参数设置为TRUE, 从而要求内核使用此浮点分发例程,浮点分发例程将会保存浮点寄存器。(然而,这会极大地 增加中断的延迟。)注意,浮点分发例程仅在32位系统上被支持。
9.Windows和实时处理过程
对时间期限的需求,无论是硬的还是软的,都体现了实时环境的特征。硬实时系统(例如 核电站控制系统)中有一些时间限制是系统必须要满足的,以避免诸如财产或者生命损失之 类的灾难性失败。在软实时系统(例如汽车的燃料节约优化系统)中,有一些时间限制尽管是 可以错过的,但及时性仍然是一个期望的特征。在实时系统中,计算机有传感器输入设备和 控制输出设备。实时计算机系统的设计者必须要清楚,从输入设备产生中断的时间点,到该 设备的驱动程序能够控制输出设备来响应此中断的时间点之间,在最差情形下其延迟该是多 少。在进行最差情形分析时,必须要考虑操作系统引入的延迟,以及应用程序和设备驱动程 序所强加的延迟。
因为Windows并不以任何一种可控的方式对设备IRQ进行优先处理,而且用户应用程序只 能在处理器的IRQL为被动级别的时候执行,所以,Windows往往并不适合用作实时操作系统。 最终决定“最差情形延迟”的是系统的设备和设备驱动程序,而非Windows。当实时系统的设 计者使用市场上的硬件产品时,这就成了一个问题。设计者难以确定市场上每一个设备的ISR 或者DPC在最差情形下需要多长时间。即使经过了测试,设计者也不能保证实际系统在特殊 情形下不会漏掉某个重要的时间期限。而且,系统的DPC和ISR可能引入的所有延迟的总和通 常会远超时间敏感系统的容忍度。
虽然许多类型的嵌入式系统(比如,打印机和车载计算机)有实时性需求,但是,Windows Embedded Standard 7并没有实时性特征。它只是Windows 7的一个版本,这个版本有可能生成 —个小印迹(footprint)的Windows7版本,适合于运行在资源受限的设备上。例如,一个没有 联网功能的设备将省略掉所有与网络有关的Windows?组件,包括网络管理工具,以及适配器 和协议栈设备驱动程序。
中断对象也保存了与该中断相关联的IRQL ,所以KilnterruptDispatch或者 KiChainedDispatch能在调用ISR之前将IRQL提升到正确的级别上,在ISR返回之后再降低IRQL。 此两步骤处理过程是必需的,因为中断的初始分发是由硬件来完成的,所以,在初始分发时 是没有办法传递中断对象指针的(或者任何此类的其他参数)。在多处理器系统上,内核会为 每个CPU分配一个中断对象,并对它初始化,使该CPU上的本地APIC能够接受特定的中断。
在x64 Windows系统上,内核优化了中断的分发过程,其做法是,使用一些特殊的例程, 通过忽略一些不必要的功能来节省处理器的指令开销,比如:KilnterruptDispatchNoLock,此 例程用于那些’‘没有相关联的、由内核来管理的自旋锁(此自旋锁往往被驱动程序用来同步 它们的ISR)”的中断;KilnterruptDispatchNoEOl,此例程用于那些已经将APIC编程为“Auto- EOK自动结束中断,Auto-End-of-Interrupt) ”的中断——因为中断控制器将自动发送EOI信号, 内核不需要额外的代码来自行完成EOL工作。最后,专门针对性能中断或性能剖析中断,使用 KilnterruptDispatchLBControl处理器,它支持现代处理器所提供的最后分支控制MSR (Last Branch Control MSR)o此寄存器使内核在跟踪模式下可以跟踪/保存分支指令;在中断过程中, 这一信息会被丢失,因为在常规的线程寄存器环境中,并没有存放此信息,所以,必须要加入 特殊的代码来保存此信息。
例如,HAL的性能中断和性能剖析中断使用了这一功能,而其他 的HAL中断例程则利用了 “无锁”分发代码,因为HAL并不要求内核同步其ISR。
另一个内核中断处理器是它用于那些要求保存浮点状态的中断。内 核模式代码通常不允许使用浮点(MMX、SSE、3DNow!)操作,因为这些浮点寄存器在环境 切换时并不被保存;然而,与此不同的是,ISR可能需要用到这些寄存器(比如显卡的ISR执 行一个快速绘制操作)。驱动程序在连接一个中断时,可以将FloatingSave参数设置为TRUE, 从而要求内核使用此浮点分发例程,浮点分发例程将会保存浮点寄存器。(然而,这会极大地 增加中断的延迟。)注意,浮点分发例程仅在32位系统上被支持。
9.Windows和实时处理过程
对时间期限的需求,无论是硬的还是软的,都体现了实时环境的特征。硬实时系统(例如 核电站控制系统)中有一些时间限制是系统必须要满足的,以避免诸如财产或者生命损失之 类的灾难性失败。在软实时系统(例如汽车的燃料节约优化系统)中,有一些时间限制尽管是 可以错过的,但及时性仍然是一个期望的特征。在实时系统中,计算机有传感器输入设备和 控制输出设备。实时计算机系统的设计者必须要清楚,从输入设备产生中断的时间点,到该 设备的驱动程序能够控制输出设备来响应此中断的时间点之间,在最差情形下其延迟该是多 少。在进行最差情形分析时,必须要考虑操作系统引入的延迟,以及应用程序和设备驱动程 序所强加的延迟。
因为Windows并不以任何一种可控的方式对设备IRQ进行优先处理,而且用户应用程序只 能在处理器的IRQL为被动级别的时候执行,所以,Windows往往并不适合用作实时操作系统。 最终决定“最差情形延迟”的是系统的设备和设备驱动程序,而非Windows。当实时系统的设 计者使用市场上的硬件产品时,这就成了一个问题。设计者难以确定市场上每一个设备的ISR 或者DPC在最差情形下需要多长时间。即使经过了测试,设计者也不能保证实际系统在特殊 情形下不会漏掉某个重要的时间期限。而且,系统的DPC和ISR可能引入的所有延迟的总和通 常会远超时间敏感系统的容忍度。
虽然许多类型的嵌入式系统(比如,打印机和车载计算机)有实时性需求,但是,Windows Embedded Standard 7并没有实时性特征。它只是Windows 7的一个版本,这个版本有可能生成 —个小印迹(footprint)的Windows7版本,适合于运行在资源受限的设备上。例如,一个没有 联网功能的设备将省略掉所有与网络有关的Windows?组件,包括网络管理工具,以及适配器 和协议栈设备驱动程序。