ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

VMX,SVM编程指北——梦开始的地方 VMX ON

2021-11-04 22:01:06  阅读:247  来源: 互联网

标签:指北 __ SVM CPU vmcs VMX processor VMCS


先上一张图,简单认识一下涉及到的几种状态。
image
控制端称为Virtual-Machine Monitor(VMM);被控端称为Guest;当然还有Guset中的Guest这种情况,于是有了L1 Guest,L2 Guest。
CPU根据你提供的 virtual-machine control structure (VMCS)进行相关的控制,一个VMM可以包括多个VMCS,从数据结构上看一个VMCS对应一个Virtual logical processor。

看图可知,你要先 VMXON 之后才能执行其它的各种VMX Operation,这是梦开始的地方,当然也有失眠的。

1,检查 CR0.PE 和 CR0.PG 是否等于 1 (Windows和Linux 默认就是等于1的)

点击查看代码
#define CR0_PE (1 << 0)
#define CR0_PG (1 << 31)
cr0 = __readcr0(); //(CR0.PE = 1, CR0.PG = 1)
if (!(cr0 & CR0_PE))
{
	//fail
}
if (!(cr0 & CR0_PG))
{
	//fail
}

2,设置 CR4.VMXE 为 1;如果该值为 0,执行VMXON是会触发异常"invaild-opcode"

点击查看代码
#define CR4_VMXE ( 1 << 13)

cr4 = __readcr4();
cr4 |= CR4_VMXE;

__writecr4(cr4);

3,根据IA32_VMX_BASIC MSR确认VMCS region的长度以及标识(identifier);readmsr返回值为64bit,0-31 bits是标识符(Identifier),32-44 bits是VMCS所需的长度(vmcs size)。
这里分配的内存要4KB对齐,且为常驻non-pageable,即不可因分页机制而被换出;

点击查看代码
#define IA32_VMX_BASIC_MSR 0x480

msrBasicInfo = __readmsr(IA32_VMX_BASIC_MSR);
low32 = msrBasicInfo & 0x00000000ffffffff;
high32 = (msrBasicInfo & 0xffffffff00000000) >> 32;

revisionIdentifier = low32;
vmcs_size = high32 & 0x1fff; //44:32

vmcs = AllocMemory( 4_Kbyte_aligned(vmcs_size));//non-pageable memory
RtlZeroMemory(vmcs, vmcs_size);
vmcs->u32.revision_identifier = revisionIdentifier;

4,执行VMXON。注意需要使用vmcs对应的物理地址(Physical Address)。如果一切正确 这个CPU将进入 VMX root operation,此后可以使用其它的vmx_xx指令。

点击查看代码
vmcsPhysical = GetPhysicalAddress(vmcs);

__vmx_on(vmcsPhysical);

5,关于编程方面的提示:
A,你应该注意到了,这些寄存器和指令都是对应 the logical processor的,即以上的所有代码 包括上一篇介绍的,都应该在同一个logical processor上运行。而当前的CPU都是多核,Windows和Linux都是多任务的,所以在写驱动代码时,需注意格外注意。
- 在processor 1上执行 __vm_on 然后在 processor 2上执行 __vmx_off,显然是错的
- 以上强调的内容与一个VMCS和一个logical processor是否绑定终身,是两回事。
B,对于多颗CPU的场景,注意NUMA影响内存访问快慢的问题。

标签:指北,__,SVM,CPU,vmcs,VMX,processor,VMCS
来源: https://www.cnblogs.com/FE-FR-SH/p/to_vmxon.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有