1.cpuid 指令:
EFLAGS寄存器中的ID标志(位21)表示对CPUID指令的支持。如果一个软件程序可以设置和清除这个标志,那么执行该程序的处理器支持CPUID指令。这条指令在非64位模式和64位模式下操作相同。
CPUID在EAX、EBX、ECX和EDX寄存器中返回处理器识别和特征信息。

__cpuid 函数在 #include <intrin.h>
intel提供了非常方便的头文件
传入数组,功能号为1
就能得到相关的信息,我们这里只关注返回后,ecx的第5个位,这里为了简单就做了下与操作。(后面如果有深入VT的额外课程,会使用其他功能号的位,intel手册上cpuid指令有祥细的说明,可将这些定义为结构体,注释起来方便使用,一劳永逸)
返回值是真就代表支持VMX.

2.__rdmsr 指令 -- 从特定型号寄存器读取
cpu 有很多特殊寄存器 统称为MSR
MSR_IA32_FEATURE_CONTROL -- 地址是0x3A.(手册上第四卷有祥细的说明)
指令同样也在intel提供的头文件里。
第0位说明:
锁定位(R/WO):(1 = 锁定)。设置后,锁定此 MSR 不被写入;写入此位将导致GP(0)。
注意:一旦设置了锁定位,就无法修改此寄存器的内容。
因此,在配置对英特尔虚拟化技术的支持之后,以及在将控制权转移到选项 ROM 或操作系统之前,必须设置锁定位。因此,一旦设置了锁定位,当 PWRGOOD 未取消断言时,整个IA32_FEATURE_CONTROL内容将在整个 RESET 中保留。