系统机制之中断分发 深入解析windows操作系统 学习笔记(4)
2023-04-08 来源:文库网
尽管如此,有一些第三方厂商为Windows提供了实时内核。这些厂商使用的办法是,将实 时内核嵌在一个自定义的HAL中,并且将Windows当作实时操作系统中的一个任务来运行。这 一运行Windows的任务正好可作为系统的用户界面,而且该任务的优先级比其他负责管理此 设备的任务要低。
将一个ISR与某个特定级别的中断关联起来,这一操作称为连接中断对象,而将一个ISR 与-个IDT项断开关联,则称为断开中断对象。这些操作是通过调用内核函数 loConnectlnterruptEx和loDiscoanectlnterruptEx来完成的,正是这两个操作,使得设备驱动程序 可以在加载到系统中的时候“打开”一个ISR,而如果驱动程序被卸载,则可以”关闭”该ISR。
使用中断对象来注册ISR,可以避免设备驱动程序直接操纵中断硬件(在不同的处理器体 系架构间中断硬件会有所不同),也可以不必知道任何有关IDT的细节。这一内核特性有助于 创建可移植的设备驱动程序,因为它使得开发人员无须使用汇编语言来编码,也无须在设备 驱动程序中反映处理器的差异。
中断对象还提供了其他一些好处。通过使用中断对象,内核可以将该ISR的执行过程与设 备驱动程序中其他可能与ISR共享数据的部分同步(有关设备驱动程序如何响应中断的更多信 息,参见本书下册第8章)。
而且,中断对象使内核很容易为任何中断级别调用多个ISR。如果多个设备驱动程序创建 了中断对象,并且将它们连接到同一个IDT项上,那么,当指定的中断线上发生中断时,中断 分发器会调用每一个例程。这种能力使得内核很容易支持”菊花链”配置,即几个设备共享同 样的中断线。当某个ISR通过给中断分发器返回一个状态,声明自己拥有该中断时,这条链就 被打断。
如果共享同一中断的多个设备同时请求服务,那么,有些设备,由于其1SR尚未被服务到, 一旦中断分发器降低了IRQL,它们将再次中断系统。只有当所有想要使用同一中断的设备驱 动程序向内核表示它们可以共享该中断时,这种链式结构才被允许;如果它们未能向内核做 出这种表态,则即插即用管理器会重新组织它们的中断分配方案,以确保尊重每一个设备的 共享需求。如果中断向量被共享,中断对象会调用KiChainedDispatch,该函数会依次调用每一 个已注册的中断对象的ISR,直至它们中的某个中断对象声明拥有该中断,或者所有的ISR都 已经被执行过为止。在前面的.〃决示例输出中(在”实验:査看IDT”部分),向量0xa2被连接 到了几个链式的中断对象上。在该实验所运行的系统上,碰巧有一个集成的7合1读卡器,它 组合了SD (Secure Digital ) CF (CompactFlash)、MMC (MultiMedia Card)和其他类型的读 卡器,每种读卡器都有各自的中断。
因为厂商把它们包装在一个设备中,所以,这些中断共享 同一个向量也是合理的。
10.基于线的中断与基于消息信号的中断
共享的中断通常是高中断延迟的来源,也可能引起稳定性问题。它们往往并不是期望的 行为,而是一台计算机因为物理中断线数量有限而导致的副作用。例如,在前面的7合1读卡 器例子中,一个更好的方案是,每个设备都有它自己的中断,每个驱动程序管理不同的中断, 它们知道这些中断来自于哪个设备。然而,仅仅单个设备就要消耗掉4根IRQ线,会导致IRQ线 很快被用光。而且,每个PCI设备只能连接一根IRQ线,所以读卡器本来就不能使用超过一根 IRQ 线。
通过IRQ线来产生中断的其他问题还有,不正确地管理IRQ信号可能会导致机器上发生中 断风暴或者其他种类的死锁,因为只有当ISR确认了 IRQ信号以后才会驱动该信号“高”或”低”。 (而且,中断控制器通常也必须接收一个EOI信号。)如果由于出现错误,而导致这两者都没 有发生,那么系统可能永久地处于一种被破坏的状态,更进一步中断可能被屏蔽,或两者兼 而有之。最后,在多处理器环境中基于线的中断也会带来更差的可伸缩性。在许多情况下,在 即插即用管理器针对一个中断而选中的所有可能的处理器中,到底哪个处理器被中断,硬件 有最终的决定权,留给设备驱动程序能做的事情很少。
所有这些问题的一个解决方案是,在PCI22标准中率先引入的一种新的中断机制,称为基 于消息信号的中断(MSL message-signaled interrupt )<,尽管这仍然是该标准的一个可选组件, 在客户机器上很少能找得到,但是,越来越多的服务器和工作站实现了MSI支持,并且所有最 新的Windows版本完全支持MSI。在MSI模型中,一个设备通过往一个特定的内存地址写数据 的做法,来向它的驱动程序递交消息。这一写操作会引发一个中断,然后Windows调用ISR, 把消息的内容(值)和该消息被递交的地址传递给ISR。设备也可以递交多个消息(可多达32) 到该内存地址上,根据事件来递交不同的载荷部分。
将一个ISR与某个特定级别的中断关联起来,这一操作称为连接中断对象,而将一个ISR 与-个IDT项断开关联,则称为断开中断对象。这些操作是通过调用内核函数 loConnectlnterruptEx和loDiscoanectlnterruptEx来完成的,正是这两个操作,使得设备驱动程序 可以在加载到系统中的时候“打开”一个ISR,而如果驱动程序被卸载,则可以”关闭”该ISR。
使用中断对象来注册ISR,可以避免设备驱动程序直接操纵中断硬件(在不同的处理器体 系架构间中断硬件会有所不同),也可以不必知道任何有关IDT的细节。这一内核特性有助于 创建可移植的设备驱动程序,因为它使得开发人员无须使用汇编语言来编码,也无须在设备 驱动程序中反映处理器的差异。
中断对象还提供了其他一些好处。通过使用中断对象,内核可以将该ISR的执行过程与设 备驱动程序中其他可能与ISR共享数据的部分同步(有关设备驱动程序如何响应中断的更多信 息,参见本书下册第8章)。
而且,中断对象使内核很容易为任何中断级别调用多个ISR。如果多个设备驱动程序创建 了中断对象,并且将它们连接到同一个IDT项上,那么,当指定的中断线上发生中断时,中断 分发器会调用每一个例程。这种能力使得内核很容易支持”菊花链”配置,即几个设备共享同 样的中断线。当某个ISR通过给中断分发器返回一个状态,声明自己拥有该中断时,这条链就 被打断。
如果共享同一中断的多个设备同时请求服务,那么,有些设备,由于其1SR尚未被服务到, 一旦中断分发器降低了IRQL,它们将再次中断系统。只有当所有想要使用同一中断的设备驱 动程序向内核表示它们可以共享该中断时,这种链式结构才被允许;如果它们未能向内核做 出这种表态,则即插即用管理器会重新组织它们的中断分配方案,以确保尊重每一个设备的 共享需求。如果中断向量被共享,中断对象会调用KiChainedDispatch,该函数会依次调用每一 个已注册的中断对象的ISR,直至它们中的某个中断对象声明拥有该中断,或者所有的ISR都 已经被执行过为止。在前面的.〃决示例输出中(在”实验:査看IDT”部分),向量0xa2被连接 到了几个链式的中断对象上。在该实验所运行的系统上,碰巧有一个集成的7合1读卡器,它 组合了SD (Secure Digital ) CF (CompactFlash)、MMC (MultiMedia Card)和其他类型的读 卡器,每种读卡器都有各自的中断。
因为厂商把它们包装在一个设备中,所以,这些中断共享 同一个向量也是合理的。
10.基于线的中断与基于消息信号的中断
共享的中断通常是高中断延迟的来源,也可能引起稳定性问题。它们往往并不是期望的 行为,而是一台计算机因为物理中断线数量有限而导致的副作用。例如,在前面的7合1读卡 器例子中,一个更好的方案是,每个设备都有它自己的中断,每个驱动程序管理不同的中断, 它们知道这些中断来自于哪个设备。然而,仅仅单个设备就要消耗掉4根IRQ线,会导致IRQ线 很快被用光。而且,每个PCI设备只能连接一根IRQ线,所以读卡器本来就不能使用超过一根 IRQ 线。
通过IRQ线来产生中断的其他问题还有,不正确地管理IRQ信号可能会导致机器上发生中 断风暴或者其他种类的死锁,因为只有当ISR确认了 IRQ信号以后才会驱动该信号“高”或”低”。 (而且,中断控制器通常也必须接收一个EOI信号。)如果由于出现错误,而导致这两者都没 有发生,那么系统可能永久地处于一种被破坏的状态,更进一步中断可能被屏蔽,或两者兼 而有之。最后,在多处理器环境中基于线的中断也会带来更差的可伸缩性。在许多情况下,在 即插即用管理器针对一个中断而选中的所有可能的处理器中,到底哪个处理器被中断,硬件 有最终的决定权,留给设备驱动程序能做的事情很少。
所有这些问题的一个解决方案是,在PCI22标准中率先引入的一种新的中断机制,称为基 于消息信号的中断(MSL message-signaled interrupt )<,尽管这仍然是该标准的一个可选组件, 在客户机器上很少能找得到,但是,越来越多的服务器和工作站实现了MSI支持,并且所有最 新的Windows版本完全支持MSI。在MSI模型中,一个设备通过往一个特定的内存地址写数据 的做法,来向它的驱动程序递交消息。这一写操作会引发一个中断,然后Windows调用ISR, 把消息的内容(值)和该消息被递交的地址传递给ISR。设备也可以递交多个消息(可多达32) 到该内存地址上,根据事件来递交不同的载荷部分。