取决于 MSR 的最大 CPUID 标准叶/CPUID 功能?

Posted

技术标签:

【中文标题】取决于 MSR 的最大 CPUID 标准叶/CPUID 功能?【英文标题】:Max CPUID standard leaf / CPUID-features dependent on MSRs? 【发布时间】:2021-10-29 13:38:20 【问题描述】:

最大 CPUID 标准叶是否可以更改,即内核是否可以重新配置它以启用额外的 CPUID 值?

是否存在依赖于某些 MSR 配置的 CPUID 功能位?

【问题讨论】:

【参考方案1】:

最大 CPUID 标准叶是否可以更改,即内核是否可以重新配置它以启用额外的 CPUID 值?

一般来说,没有(报告的最大标准叶是字面最大值),但是...

很久以前,如果 CPU 报告“过高”最大值,Windows NT 内核就会出现错误并崩溃。 CPUID 值(在发布内核时没有检测到,因为当时 CPU 没有报告那么多);所以为了解决这个问题,英特尔说“软件是软的,硬件是硬的,让我们在接下来的 20 多年里为硬件添加一个 hack,这样微软就不需要写一个 2 分钟的补丁”。最终结果是 IA32_MISC_ENABLE MSR (MSR 0x1A0) 位 22 处的“限制 CPUID MAXVAL”标志;哪个(如果设置)将导致 CPUID 报告最大值。值 3(而不是真正的更高的最大值)。

对于其他 80x86 CPU 制造商(AMD、VIA、Cyrix、NexGen、..),他们并没有弄乱最大值。标准 CPUID 叶子本身(并创建了自己的区域 - 例如 AMD 使用的“0x80000000+叶子”,并在可能的地方复制了英特尔的标准叶子);但是它们中的很多都允许修改诸如 CPU 供应商字符串或 CPU 品牌字符串或 CPU 功能标志之类的内容,因此您不能太信任它们(例如,修改引导加载程序以使旧的 AMD Athlon 芯片报告并不难“Core i9 8765 @ 6 GHz”并出售计算机第二手)。

【讨论】:

【参考方案2】:

有几个 CPUID 结果会受到操作系统设置的控制寄存器或 MSR 的影响。

leaf (subleaf) register[bit] controlled by
7 (0) ECX[4] OSPKE CR4.PKE
9 EAX[31:0] IA32_PLATFORM_DCA_CAP
D (0) EBX[31:0] XCR0
D (1) EBX[31:0] XCR0 and IA32_XSS
80000001 EDX[11] SYSCALL/SYSRET IA32_EFER.LMA

【讨论】:

以上是关于取决于 MSR 的最大 CPUID 标准叶/CPUID 功能?的主要内容,如果未能解决你的问题,请参考以下文章

CPUID 指令

如何调用 CPUID 叶 7 和子叶 0?

CPUID 输出取决于操作顺序

CPUID — CPU Identification

x86 cpuid指令 | CPUID - CPU Identification

从 CPUID 获取 CPU Step Code