从上图可以看出,Guest OS是运行在用户态上,当执行到特权指令时,会陷入到 VMM 模拟执行(陷入-模拟)。从这个角度上来说,完全虚拟化是指当Guest OS运行到特权指令时,VMM将特权指令”翻译“成陷入指令,这个”翻译“过程对系统性能有损耗。而半虚拟化是指事先修改 Guest OS 的代码,避免Guest OS执行特权执行的过程,因此它的性能接近于物理机。
4、主要虚拟化流派
了解了完全虚拟化和半虚拟化的本质之后,下来再来看看主要的虚拟化流派。
基于二进制翻译的全虚拟化:其主要思想是在执行时将 VM 上执行的 Guest OS 之指令,翻译成 x86 ISA 的一个子集,其中的特权指令被替换成陷入指令;翻译过程与指令执行交叉进行,不含特权指令的用户态程序可以不经翻译直接执行,该技术为 VMWare Workstation,VMWare ESX Server 早期版本,Virtual PC 以及 QEMU 所采用。
基于扫描和修补的全虚拟化:VMM 会在 VM 运行每块指令之前对其扫描,查找敏感指令;补丁指令块会在 VMM 中动态生成,通常每一个需要修补的指令会对应一块补丁指令;特权指令被替换成一个外跳转,从 VM 跳转到 VMM,在 VMM 中执行动态生成的补丁指令块;当补丁指令块执行完后,执行流再跳转回 VM 的下一条指令处继续执行;Oracle的 Virtualbox 即采用该技术。
OS协助的半虚拟化:通过修改 Guest OS 的代码,将含有敏感指令的操作,替换为对 VMM 的超调用 (Hypercall,类似 OS 的系统调用,可将控制权转移到 VMM);该技术的优势在于 VM 的性能能接近于物理机,缺点在于需要修改 Guest OS;该技术因 Xen 项目而广为人知。
硬件协助的虚拟化:引入新的处理器运行模式和新的指令,使得 VMM 和 Guest OS 运行于不同的模式下,Guest OS 运行于受控模式,原来的一些特权指令在受控模式下全部会陷入 VMM,这样就解决了部分非特权的敏感指令的陷入 — 模拟难题,而且模式切换时上下文的保存恢复由硬件来完成,这样就大大提高了陷入 — 模拟时上下文切换的效率。该技术的引入使 x86 可以很容易地实现完全虚拟化。故皆被几乎所有之前分歧流派各方所采用,如: KVM-x86,新版 VMWareESX Server 3,Xen 3.0。
5、VMM模型(Virtual Machine Monitor)
1)宿主模型(OS-hosted VMM)
VMM 通过调用 Host OS 的服务来获得资源,实现 CPU,内存和 I/O 设备的虚拟化,VMM 创建出 VM 后,通常将 VM 作为 Host OS 的一个进程参与调度;VMM 模块负责 CPU 和内存虚拟化,由 ULM 请求 Host OS 设备驱动,实现 I/O 设备的虚拟化。
优点:可以充分利用现有 OS 的设备驱动,VMM 无需自己实现大量的设备驱动,轻松实现 I/O 设备的虚拟化。
缺点:资源受 Host OS 控制,VMM 需调用 Host OS 的服务来获取资源进行虚拟化,其效率和功能会受到一定影响。
采用该结构的 VMM 有:VMware Workstation, VMWare Server (GSX), Virtual PC,Virtual Server, KVM(早期)
3)混合模型((Hybrid VMM)
该结构是上述两种模式的混合体,VMM 依然位于最底层,拥有所有物理资源,但 VMM 会主动让出大部分 I/O 设备的控制权,将它们交由一个运行在特权 VM 上的特权 OS 来控制。VMM 只负责 CPU 和内存的虚拟化,I/O 设备的虚拟化由 VMM 和特权 OS 共同完成.
优点:可利用现有 OS 的 I/O 设备驱动;VMM 直接控制 CPU 和内存等物理资源,虚拟化效率较高;若对特权 OS 的权限控制得当,虚拟机的安全性只依赖于 VMM。
缺点:因特权 OS 运行于 VM 上,当需要特权 OS 提供服务时,VMM 需要切换到特权 OS,这里面就产生上下文切换的开销。
采用该结构的 VMM 有:Xen, SUN Logical Domain35