4

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

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

如果寄存器在技术上是读/写的,在 CPUID 指令的持续时间内将第 22 位重置为 0 是否安全,然后再将其恢复为原始设置?或者,如果设置不正确(即启用),我是否会搞砸?

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

呼……我想就是这样。

4

2 回答 2

5

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

我可以使用 CPUID 0000_0001h(ecx 标志,位 3)测试是否存在 LCMV 标志。假设它存在,它到底是做什么用的,为什么它对 CPUID 有这样的影响?

该标志的全名(参见第 3B B-17 卷)是“限制 CPUID MaxVal”,其效果为“当该位设置为 1 时,CPUID.00H 在 EAX[7:0] 中返回最大值3"。

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

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

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

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

如果寄存器在技术上是读/写的,在 CPUID 指令的持续时间内将位 22 重置为 0 是否安全,然后再将其恢复为原始设置?或者,如果设置不正确(即启用),我是否会搞砸?

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

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

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

于 2011-08-30T15:44:06.243 回答
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 选项以将 CPUIDs 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[bit 22]”。我怀疑他们决定在某个时候重命名它,以更明显地表明这是一个现在可以安全忽略的遗留问题。

于 2014-07-11T15:22:07.787 回答