2.1 处理器虚拟化实现技术
处理器虚拟化是VMM中最重要的部分,因为访问内存或者I/O的指令本身就是敏感指令(客户机的特权指令),所以内存虚拟化和I/O虚拟化都依赖于处理器虚拟化。
在x86体系结构中,处理器有4个运行级别,分别是Ring0、Ring1、Ring2和Ring3。其中,Ring0级别拥有最高的权限,可以执行任何指令而没有限制。运行级别从Ring0到Ring3依次递减。操作系统内核态代码运行在Ring0级别,因为它需要直接控制和修改CPU状态,类似于这样的操作需要在Ring0级别的特权指令才能完成,而应用程序一般运行在Ring3级别。
在x86体系结构中实现虚拟化,需要在客户机操作系统以下加入虚拟化层,来实现物理资源的共享。因此,这个虚拟化层应该运行在Ring0级别,而客户机操作系统只能运行在Ring0以上的级别。但是,客户机操作系统中的特权指令,如果不运行在Ring0级别,将会有不同的语义,产生不同的效果,或者根本不起作用,这是处理器结构在虚拟化设计上存在的缺陷,这些缺陷会直接导致虚拟化漏洞。为了弥补这种漏洞,在硬件还未提供足够的支持之前,基于软件的虚拟化技术就已经先给出了两种可行的解决方案:全虚拟化和半虚拟化。全虚拟化可以采用二进制代码动态翻译技术(Dynamic Binary Translation)来解决客户机的特权指令问题,这种方法的优点在于代码的转换工作是动态完成的,无须修改客户机操作系统,因而可以支持多种操作系统。而半虚拟化通过修改客户机操作系统来解决虚拟机执行特权指令的问题,被虚拟化平台托管的客户机操作系统需要修改其操作系统,将所有敏感指令替换为对底层虚拟化平台的超级调用。在半虚拟化中,客户机操作系统和虚拟化平台必须兼容,否则虚拟机无法有效操作宿主机。x86系统结构下处理器虚拟化如图2-1所示。
图2-1 x86系统结构下的处理器虚拟化
虽然可以通过处理器软件虚拟化技术来实现VMM,但都增加了系统复杂性和性能开销。如果使用硬件辅助虚拟化技术,也就是在CPU中加入专门针对虚拟化的支持,可以使得系统软件更加容易、高效地实现虚拟化。目前,Intel公司和AMD公司分别推出了硬件辅助虚拟化技术Intel VT和AMD SVM,下面将进行重点讲解。