编写设备驱动程序

处理有问题的中断

驱动程序必须标识有问题的中断,因为不断声明中断会严重影响系统性能,几乎一定会使单处理器计算机产生延迟。

有时,驱动程序可能很难将特定中断标识为无效。对于网络驱动程序,如果指示接收中断,但没有新缓冲区可用,则无需执行任何操作。当此情况为孤立事件时,这并不是一个问题,因为另一个例程(如读取服务)可能已完成实际工作。

另一方面,出现连续中断但不需要驱动程序处理任何工作,这表示一个有问题的中断行。因此,平台允许在执行防御性操作之前发生许多明显无效的中断。

当显示有工作需要处理时,挂起的设备可能无法更新其缓冲区描述符。驱动程序应阻止此类重复请求。

在某些情况下,平台特定总线驱动程序可能能够识别一直未请求的中断,并且可以禁用违例设备。但是,这依赖于驱动程序识别有效中断并返回相应值的能力。除非驱动程序检测到设备合法声明了中断,否则驱动程序应返回 DDI_INTR_UNCLAIMED 结果。仅当设备实际要求驱动程序执行一些有用的工作时,中断才是合法的。

其他更偶然的中断的合法性更难认证。预期中断标志是评估中断是否有效的有用工具。请考虑一个中断,如描述符释放,如果先前已分配设备的所有描述符,则可生成该中断。如果驱动程序检测到它已从卡中获取最后一个描述符,便可以设置一个预期中断标志。如果传送关联的中断时未设置此标志,则该中断为可疑中断。

有些提示性中断可能无法预测,例如指示介质已断开连接或帧同步已丢失的中断。检测此类中断是否有问题的最简单方法是:第一次出现中断时屏蔽此特定源,直到下一个轮询周期。

如果在禁用期间再次发生中断,则该中断无效。有些设备具有即使掩码寄存器已禁用关联源并且不可能引起中断时仍可读取的中断状态位。您可以设计更适合的、特定于设备的算法。

应避免对中断状态位进行无限循环。如果传送开始时设置的状态位都不要求任何实际工作,请中断此类循环。