Passive-Level ISRs

从 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。