启用到 D3cold 的转换

所有版本的 Windows 都允许设备处于 D3cold 状态,而计算机处于睡眠状态 (处于系统低功率状态之一,即 S1 到 S4) 。 在计算机退出 S0 之前,函数驱动程序、总线驱动程序和筛选器驱动程序协同工作,将设备移动到 D3hot。 当计算机进入低功耗 Sx 状态时,此转换具有将设备从 D3hot 移动到 D3cold 的副作用。

从 Windows 8 开始,当计算机保留在 S0 中时,设备可以进入和退出 D3cold。 作为设备的电源策略所有者 (PPO) 的驱动程序可以启用和禁用这些到 D3cold 的转换。 驱动程序不应允许其设备进入 D3cold,除非设备可以根据需要从 D3cold 唤醒,然后在转换为 D0 后恢复正常操作。

当设备进入 D3 时,它最初会进入 D3 的 D3hot 子状态。 从 D3hot,设备可以输入 D0 或 D3cold。 为了响应唤醒事件或 I/O 请求,设备从 D3hot 输入 D0。 否则,设备可能保留在 D3hot 中,或者可能从 D3hot 移动到 D3cold。 有关这些转换的详细信息,请参阅设备电源状态中的 设备电源状态图。

驱动程序不会启动设备从 D3hot 到 D3cold 的转换。 相反,当与该设备共享公共电源的所有其他设备都在 D3hot 中并准备进入 D3cold 时,会发生此转换。 当最后一个设备进入 D3hot 时,基础总线驱动程序和系统固件会删除电源,并且设备会一致进入 D3cold。

设备的 PPO 驱动程序告知操作系统是否启用设备从 D3hot 到 D3cold 的转换。 驱动程序可以在安装设备的 INF 文件中提供此信息,或者驱动程序可以在运行时调用 SetD3ColdSupport 例程,以动态启用或禁用设备到 D3cold 的转换。 有关详细信息,请参阅 使用 GUID_D3COLD_SUPPORT_INTERFACE 驱动程序接口

通过允许设备进入 D3cold,驱动程序可以保证以下行为:

  • 当计算机保留在 S0 中时,设备可以容忍从 D3hot 转换到 D3cold。
  • 当设备从 D3cold 返回到 D0 时,它将正常工作。

无法满足任一要求的设备在进入 D3cold 后可能不可用,直到计算机重启或进入睡眠状态。 如果设备必须能够从它进入的任何低功率 Dx 状态发出唤醒事件信号,则不得启用 D3cold 条目,除非驱动程序确定设备的唤醒信号将在 D3cold 中工作。

将设备置于 D3cold 中并不一定意味着设备的所有电源都已被移除;这意味着,仅允许通过总线与设备通信的电源已消失。 设备可能仍能够消耗足够的电源来向处理器发出唤醒事件信号。 例如,卡 (NIC) 其main电源被删除的以太网网络接口可能会从以太网电缆中取电。

由于 D3cold 是一种无法使用总线与设备通信的状态,因此驱动程序无法将其设备直接放入 D3cold。 相反,驱动程序首先调用 PoRequestPowerIrp 例程来请求 D3 电源 IRP, (目标状态为 PowerDeviceD3IRP_MN_SET_POWER请求,) 将设备从 D0 移动到 D3hot。 进入 D3hot 后,设备可能或可能不会从 D3hot 移动到 D3cold。 仅当取消总线的电源时,设备才会进入 D3cold,这发生在父总线驱动程序关闭总线或系统固件关闭硬件平台的某个部分的电源时。