Windows:从内核模式驱动程序禁用CPU空闲C状态

Sve*_*hev 11 c windows device-driver cpu-speed

我正在编写一个音频设备驱动程序,需要实时处理设备中断.当CPU进入C3状态时,中断会延迟,从而导致驱动程序出现问题.有没有办法让驱动程序告诉操作系统不要进入空闲的C状态?

我发现可以从用户空间禁用空闲C状态:

const DWORD DISABLED = 1;
const DWORD ENABLED = 0;
GUID *scheme;
PowerGetActiveScheme(NULL, &scheme);
PowerWriteACValueIndex(NULL, scheme, &GUID_PROCESSOR_SETTINGS_SUBGROUP, &GUID_PROCESSOR_IDLE_DISABLE, DISABLED);
PowerSetActiveScheme(NULL, scheme);
Run Code Online (Sandbox Code Playgroud)

但是,它是一个全局设置,可以被用户或其他应用程序覆盖(例如,当用户更改电源计划时).

我需要的是像PoRegisterSystemState,但不是S和P状态,而是C状态.(参考:https://docs.microsoft.com/en-us/windows-hardware/drivers/kernel/preventing-system-power-state-changes)

有没有办法实现这个目标?

=====

事实证明,没有一种支持的方法可以从内核空间禁用空闲C状态,并且用户空间中没有服务提供通用API来执行此操作.控制C状态的方法来自"更改高级电源设置"对话框中的"处理器电源管理",通过注册表或通过C API PowerWriteACValueIndex/PowerWriteDCValueIndex.

最初的问题是除了C1空闲状态之外的所有延迟中断,所以我需要禁用C2,C3和更深的空闲状态.禁用所有空闲C状态(包括C1(如示例代码PowerWriteACValueIndex(NULL,scheme,&GUID_PROCESSOR_SETTINGS_SUBGROUP,&GUID_PROCESSOR_IDLE_DISABLE,DISABLED)中所示)的问题是CPU使用率报告为100%,并且某些应用程序(DAW)获得困惑.

我的问题的解决方案是禁用除C1空闲状态之外的所有状态,这可以通过在处理器电源管理中设置以下值来完成: - 处理器空闲阈值缩放 - >禁用缩放; - 处理器空闲提升阈值 - > 100%; - 处理器空闲降级阈值 - > 100%.

也许我会创建一个只使用PowerWriteACValueIndex/PowerWriteDCValueIndex API的服务.

A.R*_*R.M 0

斯维托斯拉夫·伊尔科夫·恩切夫的回答

事实证明,没有一种受支持的方法可以从内核空间禁用空闲 C 状态,并且用户空间中没有服务可以提供通用 API 来执行此操作。

控制 C 状态的方法是从“更改高级电源设置”对话框中的“处理器电源管理”,通过注册表或通过 C API PowerWriteACValueIndex/PowerWriteDCValueIndex .

最初的问题是除 C1 空闲状态之外的所有空闲状态下的延迟中断,因此我需要禁用 C2、C3 和更深的空闲状态。禁用所有空闲 C 状态(包括 C1)的问题(如示例代码 PowerWriteACValueIndex( NULL, scheme, &GUID_PROCESSOR_SETTINGS_SUBGROUP, &GUID_PROCESSOR_IDLE_DISABLE,DISABLED ) 所示)的问题是 CPU 使用率报告为 100%,并且某些应用程序 (DAW) 会感到困惑。

解决方案是禁用除 C​​1 之外的所有空闲状态,这可以通过在处理器电源管理中设置以下值来完成:

  • 处理器空闲阈值缩放 -> 禁用缩放;
  • 处理器空闲提升阈值 -> 100%;
  • 处理器空闲降级阈值 -> 100%。

也许我会创建一个服务来做到这一点,它将使用PowerWriteACValueIndex/ PowerWriteDCValueIndexAPI。