等待/唤醒操作概述

操作系统的唤醒机制的工作方式如下图所示。

说明 irp-mn-wait-wake 处理概述的示意图。

  1. 当系统和设备处于工作状态时,设备的电源策略所有者确定应启用其设备 (“武装”) 唤醒。 电源策略所有者请求将带有次要 IRP_MN_WAIT_WAKE代码的电源 IRP (PoRequestPowerIrp) 发送到其 PDO,以通知其设备堆栈中的所有驱动程序。 在请求中,策略所有者指定的回调例程 (与 IoCompletion 例程) 不同。

  2. 电源管理器通过 I/O 管理器将 IRP 发送到设备堆栈的顶部。

  3. 驱动程序设置 IoCompletion 例程并向下传递 IRP,直到它到达总线驱动程序。

  4. 如果可以,总线驱动程序在物理设备上启用唤醒,并将 IRP 标记为挂起。 如有必要,它还请求其父级的等待/唤醒 IRP。

  5. 稍后会发出外部唤醒信号。

  6. 总线驱动程序完成 IRP_MN_WAIT_WAKE

  7. I/O 管理器调用 IoCompletion 例程,这些例程设置为驱动程序将 IRP 向下传递堆栈。

  8. I/O 管理器在请求 IRP 时调用由策略所有者设置的回调例程。

IRP_MN_WAIT_WAKE请求不会更改设备或系统的电源状态。 它只是在设备上启用唤醒,以便稍后如果设备进入适当的睡眠状态,外部信号将导致设备 (,并且系统可能) 唤醒。

当唤醒信号到达时,无论设备是唤醒系统还是仅唤醒自身,驱动程序的行为都是相同的。 如果设备已启用唤醒,并且系统处于睡眠状态,设备可以从中唤醒它,则设备将唤醒系统。 如果设备已启用唤醒,并且系统处于工作状态,则只有设备会唤醒。

由于计算机和设备在设计上有所不同,特别是在电源平面方面,因此支持的系统和设备电源状态(因此支持等待/唤醒的状态)在所有硬件配置上都不相同。 因此,拥有设备电源策略的任何驱动程序和每个总线驱动程序都必须仔细注意运行它的单个配置的功能。 有关详细信息,请参阅 确定设备是否可以唤醒系统

有关等待/唤醒操作的更多详细信息,请参阅 通过设备树了解等待/唤醒 IRP 的路径等待/唤醒 IRP 完成概述