Intel手册指出需要检查CPUID.01:EDX[5]来查看RDMSR和WRMSR指令是否可用。如果使用 CPUID,我已经发现特定 MSR 的特定位(在我的例子中为 IA32_EFER.NXE)受支持,那么它是否自动意味着 RDMSR 和 WRMSR 也受支持。按理来说应该是这样,但我没看到有明确说明。
我认为这是一个安全的假设,MSR 存在特征位意味着
rdmsr
和 wrmsr
,因此这些指令的 CPUID 特征位。
我只能想象模拟的 Deathstation 9000 x86 CPU 故意存在这样的陷阱,而且它不会偶然发生。 支持 NX 的真实 CPU 也足够新,具有 MSR。 在真实的 CPU 上,您甚至可以做出像 SSE4.1 暗示 SSSE3 这样的假设,因为 Intel 编号的 SIMD 扩展已经是增量的。 (我说“编号”是为了排除像 AVX-512 VP2INTERSECT 这样的东西,它不建立在任何其他的基础上,并且实际上已经从一些具有后来的 AVX-512 功能的 CPU 中消失了。)
没有任何 MSR 的 CPU 不会为没有 MSR 的功能设置 CPUID 功能位。