Intel VT学习笔记(二) 支持检测

本文阅读 2 分钟
首页 驱动开发 正文

支持检测

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;
}
本文来自投稿,不代表本站立场,如若转载,请注明出处:
Intel VT学习笔记(一) 基础知识
« 上一篇 09-08
PHP获取用户IP地址
下一篇 » 11-23