VT技术(二)检测CPU支持

简介: 1.CPUID指令检测在进入VMX Opreation之前必须要检测CPU是否支持VMX技术,可以通过CPUID指令进行查询,在执行CPUID指令之后,返回值存入EAX,EBX,ECX,EDX中,查看ECX.VMX[5]位是否为1,否则不支持VMX技术,关于CPUID指令的介绍可以参考Intel白皮书卷二第三章第三节 Instruction-CPUID Identification详细介绍了CPUID的参数

1.检测CPU是否支持VT
1.CPUID指令检测
在进入VMX Opreation之前必须要检测CPU是否支持VMX技术,可以通过CPUID指令进行查询,在执行CPUID指令之后,返回值存入EAX,EBX,ECX,EDX中,查看ECX.VMX[5]位是否为1,否则不支持VMX技术,关于CPUID指令的介绍可以参考Intel白皮书卷二第三章第三节 Instruction-CPUID Identification详细介绍了CPUID的参数

34bb2287ab6dc6b58a59a44efa163c4f_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

简单概述一下CPUID的常用参数
1.输入代码为0x0时
收到的结果用来获取厂商标识字符串信息

2.输入代码为0x1时
当输入参数为01H时,在返回值EAX寄存器中就可以获得处理器的 DisplayFamily_DisplayModel,DisplayFamily_DisplayModel 信息通常用以识别特定的处理器。

第六位不为1时,说明该cpu支持VT技术

执行cpuid指令之后会更改eax,ebx,ecx,edx寄存器的值

3.输入代码为0x80000002时
当输入参数为0x80000002H,0x80000003H,0x80000004H时用来获取处理器品牌字符串

4.输入参数为0x80000008H
当输入参数为0x80000008H时,获取物理地址大小信息和虚拟地址信息大小。

2.代码实现(执行CPUID不需要Ring0)
放一个Visual Studio的内建函数的查询方式,

因为Visual Studio x64不支持内嵌汇编

mov eax,1
cpuid
执行上述指令之后查看ECX第五位[从0开始数]是否被置1,如果为1表示支持该VT

代码方式实现

BOOLEAN Check_CPUID() {
int Ecx[4];
__cpuid(Ecx,1);
return (Ecx[2] >> 5) & 1; //Ecx 第六位是否为1
}
2.MSR寄存器检测(需要Ring0权限)
VMXON由IA32_FEATURE_CONTROL控制,查询MSR(0x3a) IA32_FEATURE_CONTROL MSR字段

第0位为锁:如果该位被清零,VMXON进入保护异常,无法使用VMXON进入VMX Opreation 需要在BIOS中修改并打开VT

当进入VMX Opreation时需要分配一个自然对齐的4KB内存来控制VMX,这个区域被称为VMXON 区域(VMX Region)

BOOLEAN Check_MSR() {
int64 VMX_Control_feild = readmsr(MSR_IA32_FEATURE_CONTROL);
return (VMX_Control_feild % 2);
}
取余2用于验证奇偶数,奇树的第零位自然会为1,C语言中非0为True

3.CR寄存器检测
1.CR寄存器介绍
CR0:控制处理器操作模式和状态的系统控制标志

CR1:保留不用

CR2:含有导致页错误的線性位址

CR3:含有页目录表物理内存基地址,因此该寄存器也被称为页目录基地址寄存器PDBR

CR4:它介绍在计算机处理器中负责控制各种功能,可以控制访问特权级、模式等

详情可以移步该链接:

https://blog.csdn.net/qq_37414405/article/details/84487591

x86_32的CR为32bit。X86_64下为64bit,其中低32bit与x86_32的CR保持一致,高32bit没有定义,作保留使用,除了bit 4其他所有位都是可读可写的。

2.CR0检测
CR0寄存器需要满足PG位、PE位、NE位等于1,也就是说需要开启分页机制的保护模式,X87 FPU数字异常的处理模式需要使用native模式

3.CR4检测
在进入VMX Opreation之前,通过设置CR4来启用VMX,然后可以执行VMXON指令,在进入VMXON之后,该位不可变动,直到执行VMXOFF退出VMX Opreation。Cr4.VMXE[bit:13]该位负责上述控制

写成代码

BOOLEAN VT_Enable() {
_CR0 cr0 = (_CR0)readcr0();
_CR4 cr4 = (_CR4)
readcr4();
if (cr0->PE==1 &&cr0->NE==1&&cr0->PG == 1)
{
if (cr4->VMXE==1) //VMX Lock
{
return TRUE;
}
}
return FALSE;
}
代码会上传到Github

https://github.com/yifaang/VTDemo

相关文章
|
算法 编译器
【计算机架构】响应时间和吞吐量 | 相对性能 | 计算 CPU 时间 | 指令技术与 CPI | T=CC/CR, CC=IC*CPI
【计算机架构】响应时间和吞吐量 | 相对性能 | 计算 CPU 时间 | 指令技术与 CPI | T=CC/CR, CC=IC*CPI
1122 1
|
1月前
|
缓存 运维 监控
CPU被打满/CPU 100%:高效应对策略与技术干货分享
【10月更文挑战第3天】在信息技术高速发展的今天,无论是开发人员、运维人员还是数据分析师,都可能遇到CPU被打满(即CPU使用率达到100%)的情况。这不仅会影响系统的响应速度,严重时甚至会导致服务中断。本文将从诊断、分析与解决三个方面,详细介绍处理CPU 100%问题的技术干货。
86 3
|
1月前
|
安全 编译器 异构计算
在CPU设计中,为了提高能效比并减少能源消耗,采用了多种节能技术
【10月更文挑战第2天】在CPU设计中,为了提高能效比并减少能源消耗,采用了多种节能技术
48 4
|
1月前
|
安全 编译器 异构计算
现代CPU的节能技术
【10月更文挑战第2天】现代CPU的节能技术
34 3
|
2月前
|
KVM 虚拟化
KVM的热添加技术之CPU
这篇文章介绍了如何在KVM虚拟机中热添加CPU资源,包括查看当前CPU配置、修改CPU核心数、永久性修改CPU配置以及注意事项等操作步骤。
76 1
KVM的热添加技术之CPU
|
5月前
|
监控 Java API
使用Java检测当前CPU负载状态的技术博客
使用Java检测当前CPU负载状态的技术博客
87 0
|
6月前
|
异构计算
振南技术干货集:CPU,你省省心吧!(2)
振南技术干货集:CPU,你省省心吧!(2)
|
存储 Linux Docker
跨cpu架构部署容器技术点:怎样修改Linux 的内核版本
在使用Docker 进行跨平台部署之后,我们还可以尝试进行跨架构部署。 从X86 架构上移植到 aarch64 上。
256 0
|
6月前
|
Linux Windows
如何检测cpu是否支持avx2
【4月更文挑战第16天】如何检测cpu是否支持avx2
3057 0
|
NoSQL Shell Linux
跨cpu架构部署容器技术点:怎么将容器启动时的1号进程挂载到systemctl
--privileged=true:是Docker中的一个参数,用于授予容器的特权权限。当一个容器被设置为特权容器时,它将拥有与主机操作系统相同的权限,可以执行一些高级操作,如访问主机设备、加载内核模块等。
92 0

热门文章

最新文章