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

问题描述 投票:0回答:1

我正在编写一个音频设备驱动程序,需要实时处理设备中断。当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);

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

我需要的是类似

PoRegisterSystemState
的东西,但不是针对S和P状态,而是针对C状态。

参考:Microsoft Learn — 防止系统电源状态更改

有什么办法可以实现这个目标吗?

c windows device-driver cpu-speed
1个回答
0
投票

Svetoslav Ilkov Enchev的回答:

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

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

PowerWriteACValueIndex
/
PowerWriteDCValueIndex

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

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

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

也许我会创建一个服务来实现这一点,它将使用

NULL
    /
  • scheme
  • API。
© www.soinside.com 2019 - 2024. All rights reserved.