提问人:Svetoslav Ilkov Enchev 提问时间:1/24/2018 最后编辑:Svetoslav Ilkov Enchev 更新时间:2/2/2018 访问量:4617
Windows:从内核模式驱动程序禁用 CPU 空闲 C 状态
Windows: Disabling CPU idle C-states from kernel-mode driver
问:
我正在编写一个音频设备驱动程序,它需要实时处理设备中断。当 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 状态。(参考:https://learn.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。
答:
事实证明,没有一种受支持的方法可以从内核空间禁用空闲的 C 状态,并且用户空间中没有服务来提供通用 API 来执行此操作。
控制 C 状态的方法是从“更改高级电源设置”对话框中的“处理器电源管理”、注册表或通过 C API /。PowerWriteACValueIndex
PowerWriteDCValueIndex
最初的问题是除 C1 空闲状态外的所有空闲状态都延迟中断,因此我需要禁用 C2、C3 和更深层次的空闲状态。禁用所有空闲 C 状态(包括 C1)(如示例代码 PowerWriteACValueIndex(, , , , ))所示)的问题是 CPU 使用率报告为 100%,并且某些应用程序 (DAW) 会感到困惑。NULL
scheme
&GUID_PROCESSOR_SETTINGS_SUBGROUP
&GUID_PROCESSOR_IDLE_DISABLE
DISABLED
解决方案是禁用除 C1 之外的所有空闲状态,这可以通过在处理器电源管理中设置以下值来完成:
- 处理器空闲阈值缩放 -> 禁用缩放;
- 处理器空闲提升阈值 -> 100%;
- 处理器空闲降级阈值 -> 100%。
也许我会创建一个服务来做到这一点,它将使用 / API。PowerWriteACValueIndex
PowerWriteDCValueIndex
评论