从 Windows 10 开始,电源管理框架(PoFx)使驱动程序能够为设备中的单个组件定义一组或多组可单独调整的性能状态。 驱动程序可以使用性能状态来限制组件的工作负荷,以提供足够的性能以满足其当前需求。
性能状态概述
在 Windows 8 和 Windows 8.1 中,PoFx 提供空闲状态(F 状态),以便在输入特定 F 状态时通过电源和时钟轨限制来节省组件级电源。 当组件处于空闲状态(非 F0)时,此模型可节省电源,但不提供任何机制来优化电源使用,或者在组件处于活动状态时根据性能需求对其进行均衡。 即使某个组件处于活动状态(在 F0 中)并提供请求服务,但它可能不需要设备的完整性能。 例如,图形卡可能只需要更新一个闪烁的光标,这可能不需要全部性能。
可变性能状态通过允许驱动程序调节设备组件的性能,来提供足够的性能以满足其当前需求,从而解决此问题。 在 Windows 8 和 Windows 8.1 中,如果组件支持性能状态,则每个驱动程序必须实现驱动程序内部的专有性能状态选择算法,如果需要,请以专有方式通知平台扩展插件(PEP)。 PEP 是一个软件组件,用于执行特定于芯片(SoC)模块上特定处理器或系统生产线的电源管理任务。 特定于驱动程序的专有性能状态解决方案有与 PEP 紧密耦合的缺点,因此无法轻松调试。
从 Windows 10 开始,PoFx 提供用于性能状态管理的 API。 此 API 有两个主要目标:
- 它为设备驱动程序提供了一种标准方法,用于通知 PEP 性能状态的变化,以便 PEP 能够作出适当的行动。
- 它为驱动程序提供了一种标准方法,用于通知 OS 性能状态更改,以便在 Windows 性能分析器(WPA)中记录和分析,而无需为每个驱动程序自定义插件。
Component-Level 性能状态的 PoFX API 简介
PoFx 使设备能够为每个组件定义以下类型的性能状态:
- 频率单位(以 Hz 为单位)、带宽(以比特每秒为单位)或不透明索引号中一组离散状态的数量。
- 最小值和最大值之间的状态连续分布。
性能状态组织成集,并按组件注册。 性能状态集合中的状态必须单调递增。 大多数驱动程序应为每个组件定义一组性能状态。 例如,驱动程序可以定义一组性能状态来控制组件的时钟频率。 但是,某些驱动程序可能需要定义多个性能状态集来控制组件性能状态的多个维度。 例如,驱动程序可以定义两组性能状态来控制时钟频率和总线带宽。
若要注册设备组件以便通过 PoFx 进行性能状态管理,驱动程序遵循以下常规步骤:
驱动程序注册要由 PoFx 管理的设备组件。 有关详细信息,请参阅 Component-Level 电源管理。
驱动程序通过调用 PoFxRegisterComponentPerfStates 注册对性能状态的支持。 作为注册调用的一部分,驱动程序可以自行定义给定组件的性能状态,也可以延迟平台扩展插件(PEP)来定义它们。
设备驱动程序或 PEP 必须了解性能状态,包括每个组件的性能状态集数、性能状态类型(离散状态或基于范围),以及实际性能状态的值和计数的详细信息。 如果 PEP 不支持性能状态,驱动程序仍可能向 PoFx 注册性能状态支持,并通知 OS 性能状态更改,以便在 Windows 性能分析器(WPA)中记录和分析。
在两种情况下,成功完成 PoFxRegisterComponentPerfStates 后,驱动程序都有一个 PO_FX_COMPONENT_PERF_INFO 结构,其中包含已注册的性能状态集。
当驱动程序确定组件应更改性能状态时,它会调用 PoFxIssueComponentPerfStateChange 或 PoFxIssueComponentPerfStateChangeMultiple。 PoFx 在性能状态更改完成后调用驱动程序提供的 ComponentPerfStateCallback 例程。
驱动程序通过 ComponentPerfStateCallback 例程获知 PEP 是否成功或拒绝了性能状态更改。 如果 PEP 成功更改,驱动程序会执行从其角度更改性能状态所需的任何工作。 如果 PEP 拒绝更改,驱动程序可以选择不执行任何作,或者使用相同或备用性能状态再次重试请求。