我们先来看看KVM中的一些名词。


KVM

    全称Kernel-based Virtual Machine,即基于kernel的虚拟机


VMM

    Virtual Machine Monitor,虚拟机监控器,在KVM虚拟化环境中,即KVM内核。


VM

    Virtual Machine,虚拟机,即Guest机。


全虚拟化

    Guest OS无需做任何改动即可运行。有两种实现方式:软件辅助实现和硬件辅助实现。


软件辅助实现的全虚拟化

    一般采用优先级压缩(Ring Compression)和二进制翻译(Binary Translation)实现。由于一些特权指令必须运行于特权级Ring0,如LGDT,通常OS kernel运行Ring0中,这样虚拟化环境中,VMM就没有Ring可用了。优先级压缩大致原理为:使VMM运行于Ring0,Guest OS kernel运行于Ring1,而Guest OS user运行于Ring3。优先级压缩能正确处理大部分的特权指令,但是由于x86架构存在虚拟化漏洞(部分敏感指令不能被捕获),采用二进制翻译方法来处理这些虚拟化漏洞:VMM扫描并修改Guest的二进制代码,将无法捕获的敏感指令转换为支持虚拟化的指令。


硬件辅助实现的全虚拟化

    依赖硬件虚拟化特性(比如Intel VT-x),基本思想是:在硬件架构上加入了足够的虚拟化功能,使其可以截获Guest OS中所有敏感指令,并进行模拟。


半虚拟化

    Guest OS需要进行修改,对不能“陷入”的敏感指令进行替换,以解决敏感指令的捕获问题。


VT-x

    Intel为CPU虚拟化提供了VT-x(Intel Virtualization for x86)技术(AMD SVM也提供了类似的功能),VT-x引入了一套新的工作模式,即VMX(Virtual Machine eXtension),该模式下的CPU具有两种操作模式:根模式(VMX root operation)和非根模式(VMX non-root operation)。每种操作模式下,都有独立的Ring0-Ring3。

    [VMM运行于根模式,对KVM虚拟化环境来说,即KVM主机运行于根模式,主机中的kernel运行于根模式中的Ring0,主机中用户态程序(比如Qemu-kvm)运行于根模式中的Ring3。
    Guest运行于非根模式,Guest中的kernel运行于非根模式中的Ring0,Guest中的用户态程序运行于非根模式中的Ring3。
此外,VT-x还引入了一组新的指令,包括VMLAUNCH/VMRESUME(用于发起VM-Entry)、VMREAD/VMWRITE(用于配置VMCS)等。]


■VM-Exit/VM-Entry

    在VT-x环境中,非根模式下(即Guest中),执行敏感指令触发的“陷入”称为VM-Exit。VM-Exit发生时,CPU自动从非根模式切换到根模式下,然后就可以由VMM对触发VM-Exit的敏感指令做进一步处理或模拟。
与VM-Exit对应的是VM-Entry,此操作由VMM发起,通常是VMM调度某个Guest(或VCPU)运行时引起,此时CPU自动由根模式切换为非根模式。


VMCS

    在VT-x环境中,引入了VMCS(Virtual Machine Control Structure,虚拟机控制结构),以便更好的支持CPU虚拟化。VMCS用于保存虚拟CPU需要的相关状态,比如:CPU在根模式和非根模式下的寄存器的值、VM-Exit的原因等,当CPU发生VM-Exit和VM-Entry时,会自动查询和更新VMCS,VMM也可以通过配置VMCS控制CPU的行为。


本文非原创,尊重他人劳动成果,转载自:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=14528823&id=4133164

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐