(1)英特尔虚拟化技术专为虚拟机监视器(vmm)提供的全新特权空间,可支持未经修改的操作系统和应用在专门为它们设计的环境中运行,从而简化硬件调用。
(2)通过硬件底层指令集来支持虚拟机监视器(vmm)与已安装guest os(虚拟机上的操作系统)之间的切换,使得虚拟化技术更加简单、高效、可靠。
(3)虚拟机监视器(vmm)和已安装的guest os(虚拟机上的操作系统)的处理器状态信息保留在专用内存地址空间中,这样可以缩短各个操作系统访问硬件之间的间隔时间,同时提高了各个虚拟机上的操作系统之间的安全隔离性。
虚拟化有两种实施方式:传统的纯软件虚拟化方式和更新的硬件辅助虚拟化方式。在保护模式下,x86处理器一共有4个不同优先级,术语称为ring,从ring 0-ring3。ring 0的优先级最高,ring 3最低。ring 0用于操作系统内核, ring 1和ring 2用于操作系统服务,ring 3用于应用程序。
位于ring 0特权空间的操作系统可以优先访问各种硬件资源。传统的虚拟化技术是在ring 0 中运行一个称为虚拟机监视器(vmm)的软件中间层,以负责控制和排列各个分区访问硬件资源的优先顺序。它要求在软件堆栈的较高层运行操作系统——通常是在ring 1或者与系统应用共用ring 3。
由于传统的纯软件实现方式在测试、验证和维护每款新操作系统和相关补丁方面,付出了大量的时间和资金, 同时二进制码翻译需要消耗处理器的很多计算资源。纯软件虚拟化运行时的开销会造成系统运行速度较慢,有数据表明其引起的系统性能下降可能达5%-20%。
vt的目的是在尽可能最小化程序员痛苦的同时尽可能多的增加“virtualization holes”(虚拟化孔)。这种解决方案中,vt-x针对x86而vt-i针对itanium,分别引入了一种新的模式针对不同的cpu.这里我们主要来看看vt-x,实际上vt-i的功能与vt-x有很多相同的地方。
这种新的模式被称为vmx,并且引入了一个虚拟化机监控器vmm运行于其中。它被设定在r0级别下,你可以认为是r-1级或者看成是在环的旁边运行。主机操作系统和所有的程序在vmx模式中运行,与此同时vmm运行在vmx根模式中。
任何一个运行在vmx模式下的操作系统,都拥有所有运行于非vt系统中的一般操作系统的功能和特性。它也处在r0级别中,与平常一样有权利处理每一件事情,而且并不知道有什么东西正在它的旁边运行。当情况得到授权,cpu进入vmx根模式,vmm就可以切换到其他一个运行在另一vmx实例的操作系统。这些切换被称做vm登录和vm退出。
vt技术所表现出来的不可思议的地方就在于它将从vmx模式到vmx根模式(或从vmx根模式到vmx模式)的登录和退出处理易于操作。一旦主机操作系统被涉及到,那它一定是独自处在自己的世界里的,你必须保存虚拟化世界的完整状态并当你返回时重新载入它。虽然在vt里还有很多事物要去处理,但它被设计为一项任务,所以客观地说它实际是一个简单而并不费力的进程。
虚拟化技术大概可以分为以下四类:
硬件仿真
完全虚拟化
半虚拟化
操作系统级的虚拟化
硬件仿真:最复杂的虚拟化实现技术就是硬件仿真,在这种方法中,可以在宿主系统上创建一个硬件 vm 来仿真所想要的硬件。使用硬件仿真的主要问题是速度会非常慢,因为每条指令都必须在底层硬件上进行仿真。但是使用硬件仿真,您可以在一个 arm 处理器主机上运行为 powerpc设计的操作系统,而不需要任何修改。硬件仿真的产品有bochs和qemu。
操作系统级的虚拟化:这种技术在操作系统本身之上实现服务器的虚拟化。这种方法支持单个操作系统,并可以将独立的服务器相互简单地隔离开来。比如virtuozzo。好像应用不是很多?
而市面上主要的产品都是完全虚拟化或者半虚拟化的。
完全虚拟化(full virtualization):这种模型使用一个虚拟机,它在客户操作系统和原始硬件之间进行协调。"协调"在这里是一个关键,因为 vmm 在客户操作系统和裸硬件之间提供协调。特定受保护的指令必须被捕获下来并在 hypervisor 中进行处理,因为这些底层硬件并不由操作系统所拥有,而是由操作系统通过 hypervisor 共享。虽然完全虚拟化的速度比硬件仿真的速度要快,但是其性能要低于裸硬件,因为中间经过了 hypervisor 的协调过程。完全虚拟化的最大优点是操作系统无需任何修改就可以直接运行。惟一的限制是操作系统必须要支持底层硬件。
完全虚拟化又分为传统的和硬件辅助的。传统的完全虚拟化,虚拟机运行在操作系统之上,虚拟机管理程序本身运行在cpu的ring 0,虚拟的guest os则运行在ring 1(为了避免guest os破坏host os,guest os必须运行 在低于ring 0的权限)。但是这样一来guest的兼容性会受到影响,并且原来guest os要在ring 0上执行的指令都必须经过hypervisor翻译才能运行,速度会有所下降。而硬件辅助的完全虚拟化需要cpu硬件支持,有intel的vt和amd的 amd-v两种技术,只有支持这两种技术的cpu才可以使用。硬件辅助的虚拟化把虚拟机管理程序本身放到比ring 0还低的模式运行(比如ring -1),而把guest os放到ring 0,这样兼容性得到了提高,不过因为第一代硬件虚拟技术(vt和amd-v)实现上还不够成熟,所以效率上并不比传统的完全虚拟化更高(只能是某几方面高某几方面低)。传统的完全虚拟化技术已经发展了多年,其开发比较复杂,以前的技术一般都是为x86开发的,对于x64不好用,x64上有了vt和 amd-v之后,估计厂商已经不愿意再花力量为x64开发传统的虚拟机了,所以想要运行64位的guest os,都需要vt或amd-v的支持()。
半虚拟化(para virtualization):半虚拟化可以提供极高的性能,它与完全虚拟化有一些类似。这种方法使用了一个 hypervisor 来实现对底层硬件的共享访问,还将与虚拟化有关的代码集成到了操作系统本身中。与硬件辅助的完全虚拟化有一点相似是hypervisor运行在ring -1,而guest os运行在ring 0上。但是半虚拟化有一个缺点是必须修改客户操作系统,因为半虚拟化为了提高效率,必须要让guest os本身意识到自己运行在虚拟机上,所以在guest os的内核中需要有方法来与hypervisor进行协调,这个缺点很大的影响了半虚拟化技术的普及,因为linux等系统可以修改,而其它不能修改的系统就不能用了。