被动级别 ISR

从 Windows 8 开始,内核模式驱动程序框架 (KMDF) 和用户模式驱动程序框架 (UMDF) 驱动程序可以选择注册其中断服务例程, (ISR) 被动级别运行。

有关 KMDF 和 UMDF 驱动程序的被动级别 ISR 的详细信息,请参阅以下主题:

如果外围设备使用常规用途 I/O (GPIO) 引脚将中断请求中继到处理器,则 Windows 中断抽象会方便此设备的驱动程序忽略此引脚所属的 GPIO 控制器的硬件特定详细信息。 当内核陷阱处理程序运行以响应来自设备的 GPIO 中继中断请求时,此处理程序会根据需要自动清除或屏蔽 GPIO 硬件寄存器中的中断。 此外,内核陷阱处理程序可以直接调用设备的 ISR,或计划此 ISR 在另一个线程中运行。

通常,GPIO 硬件寄存器是内存映射的,在这种情况下,内核陷阱处理程序可以直接在 DIRQL 中访问它们。 但是,外围设备的硬件寄存器可能不是内存映射的,在这种情况下,外围设备驱动程序必须使用 I/O 请求来访问它们。 如果是这样,外围设备驱动程序的 ISR 必须在 IRQL = PASSIVE_LEVEL运行,以便它可以使用 I/O 请求来静默中断或执行中断的初始服务。 被动级别 ISR 可以同步发送 I/O 请求,并在必要时阻止该请求,直到请求完成。

为了支持生成边缘触发的中断请求信号的外围设备的被动级别 ISR,内核陷阱处理程序清除 GPIO 引脚上的挂起中断,然后计划 ISR 在被动级别内核线程中运行。

为了支持生成级别触发的中断请求信号的外围设备的被动级别 ISR,内核陷阱处理程序会屏蔽 GPIO 引脚上的挂起中断,然后计划 ISR 在被动级别内核线程中运行。 ISR 负责清除外围设备中的中断请求。 ISR 返回后,内核线程将在 GPIO 引脚上取消屏蔽中断。

由于中断在 ISR 返回之前一直处于屏蔽状态,因此设备的被动级别 ISR 应仅执行中断的初始服务,然后返回以避免延迟其他设备的被动级别 ISR。 通常,驱动程序应将其他与中断相关的处理推迟到中断工作线程,该线程以低于 ISR 的优先级运行。