VT系列二:检测是否支持虚拟化
2016-09-08 13:13
405 查看
本文只是学习此视频后的一些总结 不当之处还请指出
视频作者:小宝来了
视频连接:http://bbs.pediy.com/showthread.php?t=211973
约定:
本文中出现的名词
虚拟机 客户机 GUEST 都是被监控的操作系统或应用程序
宿主机 HOST Hypervisor都是指监控虚拟机的“原”操作系统
VMM:当客户机发生退出事件时,进入的就是VMM
VM:当客户机正常运行时就是VM
VMM监控VM
步骤在Intel手册35.1章
1.使用CPUID指令查看CPU信息
需要关注的是ECX(RCX)寄存器
这里只讲x86
返回的ecx是一个
typedefunion
{
struct
{
unsigned SSE3:1;
unsigned PCLMULQDQ:1;
unsigned DTES64:1;
unsigned MONITOR:1;
unsigned DS_CPL:1;
unsigned VMX:1;
unsigned SMX:1;
unsigned EIST:1;
unsigned TM2:1;
unsigned SSSE3:1;
unsigned Reserved:22;
};
}_CPUID_ECX;
我们需要判断其中VMX位是否为1 是支持VT 否则不支持
2.查看CR0 CR4控制寄存器
CR0寄存器的PE、PG、NE位必须为1
如果不为1 则是在BIOS中没有启用VT
CR4寄存器的VMXE位是否为1
如果为1则说明已经有VT存在了
用到的结构圷:
typedefunion
{
struct
{
unsigned PE:1;
unsigned MP:1;
unsigned EM:1;
unsigned TS:1;
unsigned ET:1;
unsigned NE:1;
unsigned Reserved_1:10;
unsigned WP:1;
unsigned Reserved_2:1;
unsigned AM:1;
unsigned Reserved_3:10;
unsigned NW:1;
unsigned CD:1;
unsigned PG:1;
//unsigned Reserved_64:32;
};
}_CR0;
typedef union
{
struct{
unsigned VME:1;
unsigned PVI:1;
unsigned TSD:1;
unsigned DE:1;
unsigned PSE:1;
unsigned PAE:1;
unsigned MCE:1;
unsigned PGE:1;
unsigned PCE:1;
unsigned OSFXSR:1;
unsigned PSXMMEXCPT:1;
unsigned UNKONOWN_1:1; //These are zero
unsigned UNKONOWN_2:1; //These are zero
unsigned VMXE:1; //It's zero in normal
unsigned Reserved:18; //These are zero
//unsigned Reserved_64:32;
};
}_CR4;
3.检查MSR寄存器(MSR_IA32_FEATURE_CONTROL)
MSR_IA32_FEATURE_CONTROL的lock位是否为1
如果不为1则VT指令没有开启无法使用某些VT指令
用到的结构如下:
typedefstruct _IA32_FEATURE_CONTROL_MSR
{
unsigned Lock :1; // Bit 0 is the lock bit - cannotbe modified once lock is set
unsigned Reserved1 :1; //Undefined
unsigned EnableVmxon :1; // Bit 2. Ifthis bit is clear, VMXON causes a general protection exception
unsigned Reserved2 :29; //Undefined
unsigned Reserved3 :32; //Undefined
} IA32_FEATURE_CONTROL_MSR;
代码如下:
#pragma once
#include <ntddk.h>
#include "vtsystem.h"
#include "vtasm.h"
BOOLEAN bCheckCpuSuppert()
{
//1.执行CPUID
ULONG uRet_Eax, uRet_Ebx, uRet_Ecx , uRet_Edx;
_CR0 cr0;
_CR4 cr4;
_CPUID_ECX uCpuId_Ecx;
IA32_FEATURE_CONTROL_MSR msr;
Asm_CPUID(1, &uRet_Eax, &uRet_Ebx, &uRet_Ecx, &uRet_Edx);
*((PULONG)&uCpuId_Ecx) = uRet_Ecx;
if (uCpuId_Ecx.VMX != 1)
{
DbgPrint("当前CPU不支持VT!\n");
return FALSE;
}
//2.CR0 CR4
cr0 = Asm_GetCr0Ex();
if (cr0.PE != 1 || cr0.PG != 1 || cr0.NE != 1)
{
DbgPrint("请在Bios里面设置VT选项!\n");
return FALSE;
}
cr4 = Asm_GetCr4Ex();
if (cr4.VMXE == 1)
{
DbgPrint("已经有VT啦!\n");
return FALSE;
}
//3.Msr
Asm_ReadMsrEx(MSR_IA32_FEATURE_CONTROL, (PMSR)&msr);
if (msr.Lock != 1)
{
DbgPrint("VT 指令没有锁定!\n");
return FALSE;
}
DbgPrint("当前CPU支持VT!\n");
return TRUE;
}
下一章将讲退出事件的分发
视频作者:小宝来了
视频连接:http://bbs.pediy.com/showthread.php?t=211973
约定:
本文中出现的名词
虚拟机 客户机 GUEST 都是被监控的操作系统或应用程序
宿主机 HOST Hypervisor都是指监控虚拟机的“原”操作系统
VMM:当客户机发生退出事件时,进入的就是VMM
VM:当客户机正常运行时就是VM
VMM监控VM
步骤在Intel手册35.1章
1.使用CPUID指令查看CPU信息
需要关注的是ECX(RCX)寄存器
这里只讲x86
返回的ecx是一个
typedefunion
{
struct
{
unsigned SSE3:1;
unsigned PCLMULQDQ:1;
unsigned DTES64:1;
unsigned MONITOR:1;
unsigned DS_CPL:1;
unsigned VMX:1;
unsigned SMX:1;
unsigned EIST:1;
unsigned TM2:1;
unsigned SSSE3:1;
unsigned Reserved:22;
};
}_CPUID_ECX;
我们需要判断其中VMX位是否为1 是支持VT 否则不支持
2.查看CR0 CR4控制寄存器
CR0寄存器的PE、PG、NE位必须为1
如果不为1 则是在BIOS中没有启用VT
CR4寄存器的VMXE位是否为1
如果为1则说明已经有VT存在了
用到的结构圷:
typedefunion
{
struct
{
unsigned PE:1;
unsigned MP:1;
unsigned EM:1;
unsigned TS:1;
unsigned ET:1;
unsigned NE:1;
unsigned Reserved_1:10;
unsigned WP:1;
unsigned Reserved_2:1;
unsigned AM:1;
unsigned Reserved_3:10;
unsigned NW:1;
unsigned CD:1;
unsigned PG:1;
//unsigned Reserved_64:32;
};
}_CR0;
typedef union
{
struct{
unsigned VME:1;
unsigned PVI:1;
unsigned TSD:1;
unsigned DE:1;
unsigned PSE:1;
unsigned PAE:1;
unsigned MCE:1;
unsigned PGE:1;
unsigned PCE:1;
unsigned OSFXSR:1;
unsigned PSXMMEXCPT:1;
unsigned UNKONOWN_1:1; //These are zero
unsigned UNKONOWN_2:1; //These are zero
unsigned VMXE:1; //It's zero in normal
unsigned Reserved:18; //These are zero
//unsigned Reserved_64:32;
};
}_CR4;
3.检查MSR寄存器(MSR_IA32_FEATURE_CONTROL)
MSR_IA32_FEATURE_CONTROL的lock位是否为1
如果不为1则VT指令没有开启无法使用某些VT指令
用到的结构如下:
typedefstruct _IA32_FEATURE_CONTROL_MSR
{
unsigned Lock :1; // Bit 0 is the lock bit - cannotbe modified once lock is set
unsigned Reserved1 :1; //Undefined
unsigned EnableVmxon :1; // Bit 2. Ifthis bit is clear, VMXON causes a general protection exception
unsigned Reserved2 :29; //Undefined
unsigned Reserved3 :32; //Undefined
} IA32_FEATURE_CONTROL_MSR;
代码如下:
#pragma once
#include <ntddk.h>
#include "vtsystem.h"
#include "vtasm.h"
BOOLEAN bCheckCpuSuppert()
{
//1.执行CPUID
ULONG uRet_Eax, uRet_Ebx, uRet_Ecx , uRet_Edx;
_CR0 cr0;
_CR4 cr4;
_CPUID_ECX uCpuId_Ecx;
IA32_FEATURE_CONTROL_MSR msr;
Asm_CPUID(1, &uRet_Eax, &uRet_Ebx, &uRet_Ecx, &uRet_Edx);
*((PULONG)&uCpuId_Ecx) = uRet_Ecx;
if (uCpuId_Ecx.VMX != 1)
{
DbgPrint("当前CPU不支持VT!\n");
return FALSE;
}
//2.CR0 CR4
cr0 = Asm_GetCr0Ex();
if (cr0.PE != 1 || cr0.PG != 1 || cr0.NE != 1)
{
DbgPrint("请在Bios里面设置VT选项!\n");
return FALSE;
}
cr4 = Asm_GetCr4Ex();
if (cr4.VMXE == 1)
{
DbgPrint("已经有VT啦!\n");
return FALSE;
}
//3.Msr
Asm_ReadMsrEx(MSR_IA32_FEATURE_CONTROL, (PMSR)&msr);
if (msr.Lock != 1)
{
DbgPrint("VT 指令没有锁定!\n");
return FALSE;
}
DbgPrint("当前CPU支持VT!\n");
return TRUE;
}
下一章将讲退出事件的分发
相关文章推荐
- 检测你的CPU是否支持虚拟化的工具
- 检测cpu是否支持虚拟化和二级地址转换
- 用SecurAble检测cpu是否支持Intel VT虚拟化技术的LOCKED ON,LOCKED OFF,YES,NO使用说明
- 用SecurAble检测cpu是否支持Intel VT虚拟化技术的LOCKED ON,LOCKED OFF,YES,NO使用说明
- 检测cpu是否支持虚拟化和二级地址转换【转】
- 检测CPU指令集及是否支持虚拟化
- 一款检测你的CPU是否支持虚拟化的工具:
- Linux环境下查看CPU是否支持VT虚拟化 - VT-X或VT-D
- 检测cpu是否支持VT
- 查看电脑CPU是否支持VT虚拟化的几个软件
- 检测CPU是否支持虚拟化
- 查看是否支持虚拟化技术
- 检测手机是否支持蓝牙功能
- 检测网站是否支持gzip的本地代码
- 快速检测你的系统是否支持Hyper-V
- 检测系统是否支持mmx
- 转:C/C++面试之算法系列--怎样快速检测出一个巨大的单链表中是否具备死链及其位置
- 判断cpu是否支持全虚拟化
- 检测用户浏览器是否支持CSS3的方法
- 检测服务器是否支持mysql