VMCS
VMCS是一个数据结构,用于保存虚拟机VCPU寄存器状态的一段内存,这个内存是分配的普通内存。同时intel有一系列的指令来操作这段内存。
static void vmcs_load(struct vmcs *vmcs) { u64 phys_addr = __pa(vmcs); u8 error; if (static_branch_unlikely(&enable_evmcs)) return evmcs_load(phys_addr);
/* VMPTRLD 加载一个VMCS结构体指针作为当前操作对象 */ asm volatile (__ex(ASM_VMX_VMPTRLD_RAX) "; setna %0" : "=qm"(error) : "a"(&phys_addr), "m"(phys_addr) : "cc", "memory"); if (error) printk(KERN_ERR "kvm: vmptrld %p/%llx failed\n", vmcs, phys_addr); }
static __always_inline void __vmcs_writel(unsigned long field, unsigned long value) { u8 error; /* 写VMCS某一个域,它的操作对象应该是上面已经加载为操作对象的VMCS */ asm volatile (__ex(ASM_VMX_VMWRITE_RAX_RDX) "; setna %0" : "=q"(error) : "a"(value), "d"(field) : "cc"); if (unlikely(error)) vmwrite_error(field, value); }
那么这些域里面都有些什么呢? 是CPU的寄存器吗?
答:每个硬件虚拟的CPU都有一个表示其状态以及控制其特性的结构,VT-x技术的叫做VMCS。该结构包含3个部分:版本标志、VMX退出原因、数据区。而数据区则包含大量与CPU状态和控制相关的信息,包括虚拟机状态保存区(各种寄存器)、宿主机状态保存区、虚拟机运行控制域、VMEntry行为控制域、VMExit行为控制域、VMExit信息域。
为什么intel会设计一系列的指令来操作这段内存呢?
答:不管怎么样,我们都需要分配一个内存来保存这些信息,然后让CPU run vm的时候知道这个信息。这些接口其实也不是必须的,软件完全可以自己去控制那一段内存,只是用统一的接口更方便一点。但不管怎么说,我们必须有手段把这段内存告诉guest,并且让CPU在run vm的时候加载这些信息。
vmx_vcpu_run中是否保存cpu的一些寄存器?
答:CPU的寄存器分为两种。 一种是通用功能寄存器,它被保存和加载了吗?
另外一种是MSR,这些寄存器有bitmap来控制拦截,如果不拦截的话,那么是需要重新保存和加载的。

浙公网安备 33010602011771号