注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

写着玩

Bob

 
 
 

日志

 
 
 
 

陷阱调度--4  

2009-07-26 23:56:31|  分类: Win32 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

http://hi.baidu.com/l_wait/blog/item/103d812f99fc063c1e30895f.html

中断物件

       内核提供的一种可移植机制——叫做中断物件的内核控件——允许设备驱动为它们的设备注册ISRs。中断物件中包含了内核将一个设备ISR与特定中断级别关联在一起的全部信息,包括ISR的地址,设备中断的IRQL,以及在内核IDT中该ISR所在的项。当一个中断物件被初始化后,从一个中断处理模版KiInterruptTemplate复制一小段汇编语言指令到dispatch code。当有中断发生,dispatch code即被执行。

      中断物件的驻留码调用真正的中断调度程序,典型的是内核例程KiInterruptDispatch或者KiChainedDispatch,向它们中的一个传递一个中断物件的指针。KiInterruptDispatch是供只有一个中断物件注册的中断向量使用的例程。而KiChainedDispatch是供被多个中断物件分享的中断向量使用的例程。中断物件包含了调度例程需要定位和调用的由设备驱动所提供的ISR的地址。中断物件还存储了中断的IRQL,所以KiInterruptDispatch或者KiChainedDispatch能够在调用ISR之前提升IRQL,再在ISR返回后降低IRQL。需要这样做的原因是在初期调度时无法给中断物件传递指针(或者其他相关参数),因为初期调度是由硬件完成的。在一个多处理器系统中,内核为每个CPU分配并初始化一个中断物件,激活该CPU的本地APIC以接收特定的中断。

//EXPERIMENT: Examining Interrupt Internals

Windiws和实时处理

    实时环境的特征是有硬件的或者软件的底线要求。硬件实时系统(比如一个核电站控制系统)的底线是要避免像生命财产损失之类的灾难性故障。软件实时系统的底线是系统可以有所疏漏,但仍要是及时的。在实时系统中,计算机配有传感输入设备和控制输出设备。作为一个实时计算机系统的设计者,必须了解在最坏情况下从一个输入设备产生一个中断到设备驱动控制输出设备作出反应的延时。最坏情况分析必须考虑到操作系统引入的延迟以及应用程序和设备所造成的延迟。

    由于Windows没有以任何可控的方式为设备IRQs排序,并且用户级的应用程序只在处理器的IRQL处于无源级别时才被执行,所以Windows并不适合用作实时系统。系统的设备和设备驱动——而非Windows——最终决定了最坏情况下的延迟。当实时系统的设计者使用了现成的硬件时,前述因素就构成了一个问题。设计者很难判断每一个现成设备的ISR或者DPC(deferred procedure call)在最坏情况下的耗时。即使经过了测试,设计者还是不能保证运转中的系统在出现了特殊情况时一定能够满足所有重要的最低要求。此外,一个系统的DPCs和ISRs可能引入的所有延迟之和常常超出一个有时间要求的系统的容许量。

      虽然很多类型的嵌入式系统(比如打印机和车载电脑)有实时性要求,但是Windows XP Embedded没有实时性特质。它只是一版Windows XP系统,它是使用Microsoft从VenturCom处获得的系统设计技术生产的适宜运行在有限资源设备上的小号Windows XP。例如,一个不用联网的设备就可以省略所有与网络相关的Windows XP组件,包括网络管理工具和适配器以及协议堆栈设备驱动。

      此外,还有第三方销售商为Windows提供实时内核。他们使用的方法是,将实时内核嵌入到一个定制的HAL中,然后让Windows变成一个在实时系统中运行的任务。运行Windows的任务扮演了用户界面的角色,而且较那些负责设备管理的任务而言具有较低的优先级。   

    将一个ISR和特定的中断级别关联在一起叫做连接一个中断物件,将一个ISR和一个IDT项分开叫做断开一个中断物件。这些操作是通过调用内核函数IoConnectInterrupt和IoDisconnectInterrupt完成的,这让设备驱动能够在被装载到系统之后“打开”一个ISR,而在被卸载之后“关上”那个ISR。

    使用中断物件去注册一个ISR避免了设备驱动直接去弄中断硬件(不同的处理器体系结构在这上是有差异的),也不用去了解IDT的底细。这个内核特色对于生产可移植的设备驱动是有帮助的,因为它免去了用汇编语言写代码的麻烦,而且设备驱动也不用去考虑处理器差异了。

    中断物件还有其他好处。使用中断物件可以让ISR的执行过程以及与ISR分享数据的设备驱动的其他部分同步。

    此外,中断物件还允许内核为任意一个中断级别调用多个ISR。如果有多个设备驱动创建中断物件并且将它们与同一个IDT项连接,那么在指定的中断引脚有中断发生时,中断调度程序就会调用所有例程。这个能力使得内核能够支持“菊花链”配置,这种配置是让多个设备分享一个中断引脚。当一个ISR返回某个状态给中断调度程序以主张其独占中断的权力时信号传递的通路就会断开。如果在同一时间有多个设备分享中断请求服务,而这些设备未被它们的ISRs所识别,就会在中断调度程序降低IRQL之后再次发出中断。 只有当所有的设备都想要使用同一个中断并且向内核表明它们能够分享一个中断,链接才被允许;反之,即插即用管理器就会重新分配它们的中断以确保每一个都能满足要求。如果共享中断向量,中断物件就调用KiChainedDispatch,而后者再逐个调用每个注册的中断物件的ISRs,直到其中一个主张该中断,或者遍历完一遍。

  评论这张
 
阅读(322)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017