我正在尝试使用 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 寄存器(支持的最大标准级别)的输出中吗?
呼……我想就是这样。