gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 06:30:41 25 4
gpt4 key购买 nike

我正在尝试使用 CPUID,但有一些附加条件。根据sandpile.org's CPUID page ,CPUID 标准功能 0000_0004h 及以上仅在 MISC_ENABLE.LCMV 标志设置为 0 时才起作用。该标志是型号特定寄存器 (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 错误造成的。”如果由于这个原因专门禁用了一堆标准级别,这是否会反射(reflect)在 CPUID 级别 0000_000h 的 eax 寄存器(最大支持的标准级别)的输出中?

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

最佳答案

您需要下载Intel® 64 and IA-32 Architectures Software Developer’s Manuals因为它包含所有请求的信息。

I can test for the presence of the LCMV flag with CPUID 0000_0001h (ecx flags, bit 3). Assuming it is present though, what exactly is it for, and why does it have such an effect on CPUID?

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

Is MSR 1A0 a read/write register or read-only?

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

How is such a special-purpose register even read from/written to using assembly code?

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

If the register is technically read/write, is it safe to reset bit 22 to 0 for the duration of the CPUID instruction, before restoring it to its original setting? Or am I pretty much screwed if it's set incorrectly (i.e. enabled)?

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

Finally, sandpile uses the wording,"This level is only enabled if MISC_ENABLE.LCMV is set to 0. This is due to a Windows NT bug." If a bunch of standard levels are specifically disabled for this reason, will that be reflected in the output of CPUID level 0000_000h's eax register (maximum supported standard level)?

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

关于assembly - CPUID:为什么某些功能必须将 MISC_ENABLE.LCMV 设置为 0?可以暂时覆盖吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7239689/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com