1.VMCS的组成
有三部分:偏移0处是版本标识,偏移4处是中止指示,偏移8处是VMCS的数据域,其中第三部分才是我们要考虑的重点。它是被保存在内存中的。
2,为什么要引入VMCS
这完全是由于Intel VT_x来引起的,它主要被CPU进行操作,然后保存着VCPU的相关寄存器的信息和内容。可以这么理解,一个物理CPU通过VMCS能够获得每个虚拟CPU的各种信息。另外VT_x也提供了不少指令用于CPU去直接访问VMCS。
3,VMCS数据域的详细分析:
包含了6个域,客户机状态域,宿主机状态域,VM_ENTRY控制域,VM_EXECUTION控制域,VM_EXIT控制域,VM_EXIT信息域。
下面逐一分析:
客户机状态域,用户保存在非根模式下CPU的状态,当发生VM_Entry的时候,CPU自动将客户机的状态保存和加载到CPU中,即表示从VMM的根模式进入非根模式。
当发生VM_Exit的时候 ,CPU自动将CPU的状态保存回客户机状态域。
通俗的理解,客户机状态域就是VCPU的运行的状态值,退出需要保存,运行需要加载。而这些具体的状态在代码中的表示就是 CR0,CS SS,DS等寄存器。
宿主机状态域,理解前面的客户机状态域,这个就好办了。只是这里有点不同的是,发生VM_exit的时候是被恢复,但是在VM_ENTRY的时候却不用保存,这是因为宿主机的状态一般是不需要改变的。
VM_Entry控制域,是指CPU由根模式到非根模式。也即是CPU从VMM模式切换到客户机模式,在VMM发起之前,需要设置好VMCS相关域的内容,然后执行VM_entry指令。并且这个时候VMM可以通过修改VMCS中的域的信息,来给客户机注入一个虚拟中断。
VM_Exit控制域,是指CPU从非根模式切换到根模式,即从客户机模式切换到VMM模式。那么什么情况会引起这种模式的转换呢?包括之前的敏感指令,中断啊,或者对IO操作等可以引起这种转换。
VM_EXECUTION控制域,这个域控制着VCPU运行时的一些行为,如执行某些敏感指令是否会发生VM-Exit 。因此这个域的取值主要是取决于VMM对于相应敏感指令的虚拟化策略。