我正在编写一个音频设备驱动程序,需要实时处理设备中断。当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 状态,并且用户空间中没有服务可以提供通用 API 来执行此操作。
控制 C 状态的方法是从“更改高级电源设置”对话框中的“处理器电源管理”、通过注册表或通过 C API
PowerWriteACValueIndex
/PowerWriteDCValueIndex
。
最初的问题是除 C1 空闲状态之外的所有空闲状态下的延迟中断,因此我需要禁用 C2、C3 和更深的空闲状态。禁用所有空闲 C 状态(包括 C1)的问题是,CPU 使用率报告为100%,并且某些应用程序 (DAW) 会感到困惑。
解决方案是禁用除 C1 之外的所有空闲状态,这可以通过在处理器电源管理中设置以下值来完成:处理器空闲阈值缩放 -> 禁用缩放;
处理器空闲提升阈值 -> 100%;
处理器空闲降级阈值 -> 100%。
也许我会创建一个服务来实现这一点,它将使用
NULL
scheme