CPUID:为什么某些功能必须将 MISC_ENABLE.LCMV 设置为 0?可以暂时覆盖吗?

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

我正在尝试使用 CPUID,但有一些附加条件。根据 sandpile.org 的 CPUID 页面,只有当 MISC_ENABLE.LCMV 标志设置为 0 时,CPUID 标准函数 0000_0004h 及以上才会工作。该标志是模型特定寄存器 (MSR) 1A0 的第 22 位。显然,这个限制是由于 Windows NT 中的一个错误造成的(感谢 Microsoft 让事情变得更容易;))。

我可以测试 CPUID 0000_0001h(ecx 标志,位 3)的 LCMV 标志是否存在。假设它存在,它到底有什么用,为什么它对 CPUID 产生如此大的影响? MSR 1A0 是读/写寄存器还是只读寄存器?这样一个特殊用途的寄存器如何使用汇编代码读取/写入?

如果寄存器在技术上是读/写的,那么在将其恢复到原始设置之前,在 CPUID 指令的持续时间内将位 22 重置为 0 是否安全?或者如果它设置不正确(即启用),我就完蛋了?

最后,sandpile 使用这样的措辞:“仅当 MISC_ENABLE.LCMV 设置为 0 时才启用此级别。这是由于 Windows NT 错误造成的。”如果由于这个原因专门禁用了一堆标准级别,这会反映在 CPUID 级别 0000_000h 的 eax 寄存器的输出中(支持的最大标准级别)吗?

唷...我想就是这样了。

assembly x86 x86-64 cpuid msr
2个回答
5
投票

您需要下载英特尔® 64 和 IA-32 架构软件开发人员手册,因为它包含所有所需的信息。

我可以测试 CPUID 0000_0001h(ecx 标志,位 3)的 LCMV 标志是否存在。假设它存在,它到底有什么用,为什么会对 CPUID 产生如此大的影响?

该标志的全名(参见Vol.3B B-17)是“Limit CPUID MaxVal”,其作用为“当该位设置为 1 时,CPUID.00H 返回 EAX[7: 0] 3 英寸。

MSR 1A0 是读/写寄存器还是只读寄存器?

根据英特尔手册读取/写入(有一个警告,请继续阅读)。

如何使用汇编代码读取/写入这样一个特殊用途的寄存器?

您可以使用

RDMSR
(第 2B 卷 4-301)进行阅读,并使用
WRMSR
(第 2B 卷 4-505 卷)进行编写,但请注意,它们要求您在实模式或特权级别 0(也称为内核模式)下运行).

如果寄存器在技术上是读/写的,那么在将其恢复到原始设置之前,在 CPUID 指令的持续时间内将位 22 重置为 0 是否安全?或者如果它设置不正确(即启用),我就完蛋了?

它实际上应该只在有缺陷的操作系统上设置,并且您不应该清除它。如果您正在编写自己的内核,请务必继续并清除它,正如您自己所说,它仅适用于有缺陷的 NT 版本和类似情况。

最后,sandpile 使用这样的措辞:“仅当 MISC_ENABLE.LCMV 设置为 0 时才启用此级别。这是由于 Windows NT 错误造成的。”如果由于这个原因专门禁用了一堆标准级别,这会反映在 CPUID 级别 0000_000h 的 eax 寄存器的输出中(支持的最大标准级别)吗?

是的,它是专门设计来强制它在这种情况下返回3的(见上面的描述)。


3
投票

对于上面给出的非常全面的答案,我只有一点补充。 (我本来可以将其添加为评论,但我还无法添加评论。)一位英特尔工程师在 https://software.intel.com/en-us/forums/ 提供了有关该问题的更多历史详细信息topic/306523?language=en#comment-1590394 从那里引用并进行了细微的格式/拼写修复:

某些 BIOS 版本具有菜单设置,允许用户限制下次重新引导后 CPUID 将支持的最大值(或叶索引)。 BIOS 提供此选项的唯一目的是允许最终用户解决 Microsoft Windows* NT 4.0 安装问题,因为 Windows NT 4.0 的安装程序存在错误,如果 CPUID 报告其支持较高的值,则会出现蓝屏大于 3。仅在安装 Windows NT 4.0 时才需要启用 BIOS 选项以将 CPUID EAX 最大值限制为 3。在所有其他情况下,BIOS 应配置为不限制 CPUID EAX 最大值。

当 CPUID 被限制为不支持高于 3 的叶子时,在 Intel Pentium 4 及更高版本的处理器上,叶子 3 也不被支持,因此请求 CPUID 报告叶子 4 将从叶子 2 上的 CPUID 接收数据(最高叶子指数)。当软件使用无效的 EAX 输入值(即叶子索引)执行 CPUID 时,CPUID 将报告其在当前运行时配置下支持的最高叶子。

此外,在当前(2014 年 6 月)版本的英特尔® 64 和 IA-32 架构软件开发人员手册中,所涉及的 MSR 标志称为“IA32_MISC_ENABLE.BOOT_NT4[位 22]”。我怀疑他们决定在某个时候重命名它,以使其更明显地表明这是一个现在可以安全忽略的遗留问题。

© www.soinside.com 2019 - 2024. All rights reserved.