windows驱动开发-电源状态(一)

在windows设备驱动开发中,随着笔记本电脑的普及,低功耗要求的增加,设备电源状态越来越重要,和之前不一样,在以前,驱动仅仅只处理PNP的电源状态而已,现在需要处理非常多的电源状态和请求。

系统电源状态

系统电源状态将系统的功耗描述为一个整体。 操作系统支持六种系统电源状态,从 S0 (完全打开) 到 S5 (关机) 。 每种状态的区分的特征如下:

  • 电源消耗:计算机使用的功率是多少?
  • 软件恢复:操作系统从什么时间重启?
  • 硬件延迟:计算机恢复工作状态需要多长时间?
  • 系统硬件上下文 (易失性处理器寄存器、内存缓存和 RAM) 的内容:保留多少系统硬件上下文? 操作系统必须重新启动才能返回到工作状态?

状态 S0 是工作状态。 状态 S1、S2、S3 和 S4 为睡眠状态,其中计算机由于功耗降低而关闭,但保留足够的上下文以在不重启操作系统的情况下返回到工作状态。 状态 S5 是关闭或关闭状态。

当系统从关闭状态 (S5) 或任何睡眠状态 (S1-S4) 转换到 S0) 的工作状态 (时,系统将处于睡眠状态,并且当它从工作状态过渡到任何睡眠状态或关闭状态时,它将处于睡眠状态。 下图显示了可能的系统电源状态转换。

系统无法直接从另一个进入一种睡眠状态:在进入任何睡眠状态之前,它必须始终进入工作状态。 例如,系统无法从状态 S2 转换到 S4,也不能从状态 S4 转换到 S2。 它必须首先返回到 S0,然后才能进入下一个睡眠状态。 这是因为处于中间睡眠状态的系统已丢失某些操作上下文,因此它必须返回到工作状态才能还原该上下文,然后才能进行其他状态转换。

设备电源状态

设备电源状态描述计算机中设备电源状态,独立于计算机中的其他设备。 设备电源状态命名为 D0、D1、D2 和 D3。 D0 是完全打开状态,D1、D2 和 D3 是低功耗状态。 状态号与功耗成反比:编号较高的状态使用较少的功率。 从 Windows 8 开始,D3 状态分为两个子状态:D3hot 和 D3cold。

设备电源状态的特征如下:

  • 功耗:设备使用多少功率?
  • 设备上下文:设备在此状态下保留多少操作上下文?
  • 设备驱动程序行为:设备的驱动程序必须执行哪些操作才能将设备还原到完全运行状态?
  • 还原时间:将设备还原到完全运行状态需要多长时间? 大多数类型的设备的还原时间适中,从一个设备类到另一个设备类几乎没有区别。 只有少数类型的设备(如 GPU)具有非常大的硬件上下文,还原时间要长很多。
  • 唤醒功能:设备是否可以请求从此状态唤醒? 通常,如果设备可以从给定的电源状态 (例如 D2)请求唤醒,则设备也可以从任何更高功率的状态 (D1) 请求唤醒。

电源状态的确切定义特定于设备。 并非所有设备都定义所有状态;许多设备仅定义 D0 和 D3 状态。

设备的电源状态不需要与 系统电源状态匹配。 例如,某些设备可能处于关闭 (D3) 状态,即使系统处于 系统工作状态 (S0) 。

设备的电源状态似乎与设备父总线的电源状态无关。 例如,当父主机控制器处于 D3 状态时,USB 设备可能处于 D2 (选择性挂起) 状态。 这两种状态似乎不一致,只是因为在 USB 和总线上 Dx 状态的定义不同, (通常为 USB 主机控制器连接到的 PCI 或 PCI Express) 。

请注意,某些设备能够在单个设备电源状态下使用多种不同的低功耗模式。 如果此类设备的驱动程序可以在不更改设备电源状态的情况下自动将设备从一种模式切换到另一种模式,则此类设备可以使用这些模式。 但是,一般情况下,如果两种模式之间没有用户可察觉的差异,则设备应仅使用最低功率模式。 如果低功率模式(如低速模式)对性能产生负面影响,或者对设备驱动程序以外的软件不透明,则硬件不应自动使用它。

驱动程序或电源管理器可以请求设备电源状态转换,并且所有驱动程序都必须准备好处理请求此类转换的 IRP。

与系统一样,设备可以从工作状态 (D0) 转换为 (D1、D2 或 D3) 的任何低功耗状态,以及从任何低功率状态转换为工作状态。

可以看下面的表格:

D0状态

在 D0 设备电源状态下,设备完全打开并正常运行。 在此状态下,设备驱动程序可以与设备交互以执行 I/O 操作,并且设备可以生成中断。 如果设备具有映射到内存或 I/O 地址空间的硬件寄存器,则驱动程序可以访问这些寄存器。

从Windows 8开始,设备驱动程序可以将被动级别中断服务例程 (ISR) 连接到来自设备的中断。 无论设备是否在 D0 中,设备都可以生成中断。 当处于低功率 Dx 状态时,设备可以生成一个中断,该中断充当触发器,使设备返回到 D0。 ISR 计划在设备进入 D0 后在 IRQL = PASSIVE_LEVEL 运行。 在早期版本的 Windows(包括 Windows 7)中,当设备处于 D0 以外的设备电源状态时,不得生成中断。

仅当设备驱动程序作为设备的电源策略所有者通过调用 PoRequestPowerIrp 例程启动转换时,才能从 D0 转换到低功耗 Dx 状态。 当电源管理器通过发送电源 IRP (IRP_MN_SET_POWER) 响应此调用时,设备驱动程序、总线驱动程序和平台固件通过 Windows ACPI 驱动程序 (Acpi.sys) 协作处理此 IRP 以更改设备的电源状态。

设备硬件通常监视一组内部事件,这些事件可以生成运行时中断或唤醒信号,具体取决于设备的配置方式。 驱动程序实现一个代码路径来响应中断,另一个代码路径用于响应唤醒事件。 如果中断代码路径不需要处理唤醒事件,并且唤醒代码路径不需要处理中断,则可以简化驱动程序代码。 作为最佳做法,驱动程序应将设备配置为仅在设备处于 D0 时生成中断,并且仅在设备处于低功率 Dx 状态时才生成唤醒信号。 驱动程序将设备配置为在设备退出 D0 之前生成唤醒信号,并将设备配置为在设备进入 D0 后生成中断。

D3状态

D3 是低功率设备低功率状态。 所有设备都必须支持此状态。

从 Windows 8 开始,操作系统将 D3 细分为两个单独的不同子状态 D3Hot 和 D3cold。 早期版本的 Windows 定义 D3 状态,但不定义 D3hot 和 D3cold 子状态。

尽管 Windows 8 之前的 Windows 版本未显式定义 D3hot 和 D3cold 子统计信息 D3,但这些子状态在这些早期版本的 Windows 中隐式存在。 如果设备显式处于 D3 状态,并且计算机处于 S0 系统电源状态,则设备隐式处于 D3hot 子状态。 在 D3hot 中,设备连接到电源(尽管设备可能配置为绘制低电流),并且可以检测到总线上是否存在设备。 如果设备显式处于 D3 状态,并且计算机处于低功率 Sx 状态(非 S0 状态),则设备隐式处于 D3cold 子状态。 在此隐式 D3cold 子状态中,设备可能会收到一个棘手的当前状态,但设备与计算机会有效关闭,直到发生唤醒事件。

从 Windows 8 开始,设备可以在计算机保持 S0 状态时进入和离开 D3cold 子状态。 若要支持此新行为,必须将 D3hot 和 D3cold 显式定义为 D3 的非重复子状态。

D3hot 是设备可以直接从 D0 输入的 D3 的子状态。 设备在设备驱动程序的软件控制下从 D0 转换为 D3hot。 在 D3hot 中,可以在连接到的总线上检测到设备。 设备处于 D3hot 子状态时,总线必须保持 D0 状态。 从 D3hot,设备可以返回到 D0 或输入 D3cold, 只能从 D3hot 输入 D3cold。

D3cold 是 D3 的子状态,设备在物理上连接到总线,但无法检测到总线上的设备,在 D3cold 中,以下一项或两者均属实:

  • 设备连接到的总线处于低功率状态。
  • 设备处于低功率状态,当总线驱动程序尝试在总线上检测到其状态时,设备不会做出响应。

从 D3hot 到 D3cold 的转换没有设备驱动程序交互。 相反设备驱动程序指示它在启动从 D0 到 D3hot 的转换之前是否为 D3cold 转换做好准备, 随后才可能会发生从 D3hot 到 D3cold 的转换,具体取决于所有条件是否都适合启用此转换。

例如, 使用同一电源的所有设备都在 D3hot 中,并已准备好进行 D3cold 转换。 当这些设备中的最后一个输入 D3hot 时,父总线驱动程序或 ACPI 的Filter驱动程序会关闭这些设备的电源,也就是说设备进入 D3cold。

D3cold 中的设备只能通过输入 D0 离开此子状态。 从 D3cold 到 D3hot 没有直接转换。

当计算机处于 S0 状态并且设备进入 D3hot 子状态时,设备驱动程序通常无法提前确定设备的下一次转换是 D3cold 还是 D0, 一个例外是计算机准备离开 S0 状态。 在这种情况下,下一个转换是 D3cold。

如果处于低功率 Dx 状态的设备可以触发到处于 S0 状态的计算机的唤醒信号,则当计算机处于 S0 时,无需将设备保留在 D0 中。 如果计算机位于 S0 中,并且设备处于 D0 但处于空闲状态,驱动程序可以配置设备以触发唤醒信号,然后启动设备从 D0 到此低功率 Dx 状态的转换。

相关推荐
2202_754421545 小时前
一个计算频率的模块
驱动开发·fpga开发
系统之家装机大师5 小时前
Win11 22H2/23H2系统11月可选更新KB5046732发布!
windows·电脑
系统之家装机大师5 小时前
微软发布Win11 24H2系统11月可选更新KB5046740!
windows·电脑
戎梓漩7 小时前
windows下安装curl,并集成到visual studio
ide·windows·visual studio
蓝田~9 小时前
观察者模式和订阅模式
windows·观察者模式
梓仁沐白16 小时前
ubuntu+windows双系统切换后蓝牙设备无法连接
windows·ubuntu
九鼎科技-Leo20 小时前
什么是 WPF 中的依赖属性?有什么作用?
windows·c#·.net·wpf
Yang.991 天前
基于Windows系统用C++做一个点名工具
c++·windows·sql·visual studio code·sqlite3
我不瘦但很逗1 天前
Windows下使用DBeaver连接云数据库(MySQL)
数据库·windows
ashane13141 天前
Java list
java·windows·list