支持检测
1.cpuid指令的返回值
2.IA32_FEATURE_CONTROL MSR
3.Cr0 & Cr4
CPUID
1)将EAX置1
2)执行__cpuid指令
3)查看ecx的下标第5位是否为1(1表示支持,0表示不支持)/// <summary> /// 检测CPU是否支持VT-x /// </summary> /// <returns>支持返回TRUE 不支持返回FALSE</returns> BOOLEAN VmxIsSupportVTCPUID( ) { CPUID CpuIdInfo = { 0 }; __cpuid((int*)&CpuIdInfo, 1); // ecx.vmx第5位如果为1支持VT if ((CpuIdInfo.ecx & (1 << 5)) == 0) { DPRINT("处理器不支持VT-x!"); return FALSE; } return TRUE; }
IA32_FEATURE_CONTROL MSR
MSR(Model Specific Register)是x86架构中的概念,指的是在x86架构处理器中,一系列用于控制CPU运行、功能开关、调试、跟踪程序执行、监测CPU性能等方面的寄存器,IA32_FEATURE_CONTROL MSR位于地址3AH位置。
IA32_FEATURE_CONTROL MSR的第0位为锁定位,如果为0,即使cpu支持VT,也无法启用,此时,尝试在虚拟机设置中勾选VT时,会显示「此主机支持Intel VT-x,但Intel VT-x处于禁用状态」。/// <summary> /// 检测BIOS是否开启VT-x /// </summary> /// <returns>开启返回TRUE 未开启返回FALSE</returns> BOOLEAN VmxIsSupportVTBIOS( ) { IA32_FEATURE_CONTROL_MSR FeatureControlMsr = { 0 }; FeatureControlMsr.All = __readmsr(MSR_IA32_FEATURE_CONTROL); if (FeatureControlMsr.Fields.Lock == FALSE) { NTSTATUS Status = ExecuteForEachProcessor(SetLockBitForEachProcessor, NULL); if (!NT_SUCCESS(Status)) { DPRINT("多核心执行例程失败!"); return FALSE; } }
if (FeatureControlMsr.Fields.Lock == FALSE)
{
FeatureControlMsr.Fields.Lock = TRUE;
FeatureControlMsr.Fields.EnableVmxon = TRUE;
__writemsr(MSR_IA32_FEATURE_CONTROL, FeatureControlMsr.All);
}
else if (FeatureControlMsr.Fields.EnableVmxon == FALSE)
{
DPRINT("CPU:%d BIOS中VMX未开启!", CPU_IDX);
return FALSE;
}
return TRUE;
}
# Cr0 & Cr4
> 进入VT模式前,需要保证Cr0的PE位、PG位和NE位为1,即保证系统开启了保护模式和页保护模式,且启用了x87 协处理器错误的内部报告机制;Cr4的VMXE位(第13位)是用户可控的,表示系统是否进入VT模式,进入VT模式前需要手动置1,否则会触发保护异常,且退出VT模式前无法更改该标志位。
```C
/// <summary>
/// 检测VT-x是否已经开启
/// </summary>
/// <returns>已经开启返回TRUE 未开启返回FALSE</returns>
BOOLEAN
VmxIsSupportVTCr4(
)
{
CR4_REG Cr4;
Cr4.All = __readcr4();
if (Cr4.Fields.VMXE == TRUE)
{
DPRINT("VT-x已经开启!");
return FALSE;
}
return TRUE;
}
暂无评论