1,回顾
首先回顾下没有Intel -VT的支持的时候如何用软件虚拟化CPU. 之前有三种方法支持CPU的模拟的,解释执行,扫描修补,二进制翻译。具体内容可以参考之前的文章。
其实,软件模拟的时候,最重要的就是对敏感指令的模拟,要使敏感指令能陷入进去,就必须要能把所有的敏感指令都能陷入。而在某些架构中呢,有的指令是不能被陷入的,所以硬件虚拟化出现了,我可以理解这是社会需求么,想起一句话,社会的需要比十所大学产生的生产力更加的巨大。
2,硬件虚拟化中的CPU
先说CPU虚拟化的流程:
1,首先明确每个客户机中的CPU是以VCPU的形式存在的,所以客户机CPU的创建就是创建一个VCPU的一个结构体,同时并分配内存。
2,然后再进一步的将VCPU进行初始化,通常包括如下内容:分配CPU标识符,初始化寄存器组,初始化VCPU的状态信息。
3,现在VCPU已经被创建好了,然后我们该设置每个CPU的相应的控制域了。包括之前提到的客户机状态域,宿主机状态域等等,其实也就是给VMCS填充数据。
4,创建好了,然后就可以运行了。这里,运行的时候主要关注的就是上下文切换了。
这里就是主要的难点,其实也就是硬件虚拟化的精髓。
上下文切换:
先说从VMM切换到客户机吧,首先VMM保存自己的上下文,这里主要保存的是VMCS不保存的寄存器信息,然后将保存在VCPU中的数据加载到物理的CPU上,然后VMM执行VMRESUME/VMLAUNCH等指令触发VMEntry,此时CPU自动将VCPU上下文中的VMCS加载到物理CPU,切换到非根模式。这里切换成功。
然后我们再来说如何切换回来吧,那么我们什么时候需要切换回来呢? 我的印象中只有敏感指令和对IO进行操作,其实还有发生物理中断等等。
这里将陷入的指令做个小结:访问特权资源,对CR MSR寄存器的访问属于这类;客户机执行指令引发异常,如缺页中断;物理中断或者客户机的虚拟设备发生中断。
继续切换,这里发生VMExit后,CPU自动切换一部分上下文,然后在根模式下执行VM_Exit的原因,并分发到对应的物理模块。
3,硬件虚拟化的优势
可能你这里会有疑问,这和软件虚拟化的意思完全一样呀,不急,下面介绍硬件虚拟化特有的优化:
主要有两种:无条件优化:对以往软件在虚拟化下必须陷入到VMM中的敏感指令,可以通过VT技术在客户机中直接运行。
然后VMM还可以通过修改VMCS中的VM_Execution控制域,可以配置某些敏感指令是否发生VM_Exit而陷入到VMM中,相当于人工干预一样。
具体我们举例来说明:
好吧,不举例了。其实最常用的一点就是通过修改VMCS中的控制域来人工干预。这个挺好。