从低功耗状态快速启动

若要从低功耗状态实现快速启动,叶节点设备的驱动程序应处理 S0 电源 IRP (即 S0 系统电源状态 的 IRP_MN_SET_POWER IRP) 。 设备层次结构中叶节点的设备没有子设备。 由于叶节点设备不依赖于子设备,因此设备的功能驱动程序可以将设备重新初始化为后台任务,以避免对操作系统或其他驱动程序造成不必要的延迟。 相比之下,总线驱动程序的依赖项需要额外的同步逻辑来协调开机序列与其子设备。

使用以下步骤实现从低功耗状态快速启动叶节点设备:

  1. 为 S0 电源 IRP 设置完成例程。

  2. 将 S0 电源 IRP 向下发送设备堆栈。

  3. 立即完成 S0 电源 IRP,而不是等到 D0 电源 IRP 完成。 当 S0 power IRP 的完成例程运行时,请执行以下操作:

    1. 请求 D0 电源 IRP (,即 D0 设备电源状态 ) IRP_MN_SET_POWER IRP。

    2. 将STATUS_SUCCESS返回到 S0 电源 IRP 的完成例程。

  4. 驱动程序应将接收的任何 I/O 请求排队,但应延迟处理其中任何请求,直到处理完 D0 power IRP。

  5. 当 D0 电源 IRP 的完成例程运行时,初始化设备,但将此例程限制为使设备可供使用所需的例程。

  6. 完成上述步骤后,驱动程序可以开始处理 I/O 请求,包括可能已排队的任何 I/O 请求。

注意 上述步骤不适用于处理除 PowerSystemWorking (S0) 以外的任何电源状态的电源 IRP。 这些步骤特别适用于处理电源 IRP,以便从低功耗状态转换到开机 (S0) 状态。

在所有设备完成其 S0 电源 IRP 后,系统启动完成。 系统启动完成后,不需要这些设备完成其 D0 电源 IRP 或完全正常运行。 内核电源管理器具有有限的一组 IRP 调度队列,必须使用这些队列通知系统中的所有设备返回到 S0 状态。 无法快速完成其 S0 电源 IRP 的驱动程序会阻止其他设备的驱动程序接收其 S0 电源 IRP。 因此,设计不佳的驱动程序会导致应同时执行的驱动程序操作以串行方式执行,从而损害整体系统启动性能。

驱动程序完成其 S0 电源 IRP 后,它可能会收到来自已打开设备句柄的应用程序的 I/O 请求。 驱动程序绝不能使这些 I/O 请求失败,因为这样做可能会导致应用程序停止响应并生成超时错误消息。 相反,驱动程序必须将 I/O 请求排队,直到设备准备好处理它们。

总线驱动程序可以使用类似于刚才为叶节点设备的驱动程序描述的技术,实现从低功耗状态快速启动。 总线驱动程序必须满足其他要求,即确保来自子设备进入 D0 状态的任何请求都标记为挂起,在总线设备进入 D0 状态之前,总线驱动程序不会完成。

例如,当 USB 集线器的总线驱动程序收到 S0 电源 IRP 时,驱动程序会请求 D0 电源 IRP,并在收到请求的 D0 电源 IRP 后完成 S0 电源 IRP。 但是,在 S0 电源 IRP 完成后,中心的子设备可能会开始接收其 S0 电源 IRP 并请求 D0 电源 IRP。 总线驱动程序应阻止子设备进入 D0,直到中心设备进入 D0。 因此,总线驱动程序应将子设备中的所有 D0 电源 IRP 标记为挂起,并等待完成这些 IRP,直到总线驱动程序处理完集线器的 D0 电源 IRP 并且中心设备完全初始化。

有关电源 IRP 的详细信息,请参阅以下主题:

处理系统电源状态的 IRP_MN_SET_POWER

处理设备电源状态的 IRP_MN_SET_POWER