1.
CPU
虚拟化
根据原来的设计,
x86
上的操作系统需要直接运行在裸机上,因此默认拥有和控制所有的硬件。如图
4
所示,
x86
架构提供了四种特权级别
Ring 0
、
1
、
2
和
3
,通过这四种级别来控制和管理对硬件的访问。通常,用户级的应用一般运行在
Ring 3
级别,操作系统需要直接访问内存和硬件,需要在
Ring 0
执行它的特权指令。为了虚拟
x86
架构,需要在操作系统下面运行虚拟化层,由虚拟化层来创建和管理虚拟机,进行共享资源分配。而有些敏感指令不能很好的进行虚拟化,它们在
Ring 0
以外级别执行时,会出现不同的结果。如何在运行时捕获和翻译这些敏感指令成为
x86
虚拟化的一大挑战,使得
x86
架构虚拟化最初是不可能的。
图
4. x86
架构虚拟化前的特权级别
VMware
在
1998
年成功克服了这个难点,开发出了
BT
技术,从而将操作系统移到
Ring 3
的用户模式运行,而
VMM
运行在
Ring 0
级别实现隔离和性能提升。尽管
VMware
通过
BT
技术实现的全虚拟化已经成为默认的业界标准,超过
2
万家的
VMware
用户都在这种技术的支持下可靠、高效运行,但整个业界还没有统一定义的行业标准,因此每家公司都在自由发挥,来试图解决这个技术难点,不同的方案都有自己的优势和劣势。
到今天为止,有三种典型的技术来解决
x86
虚拟化的难题:
通过
BT
实现的全虚拟化
操作系统帮助下的虚拟化,也叫半虚拟化
硬件帮助的虚拟化
a.
技术
1 �C
通过
BT
实现的全虚拟化
VMware
可以通过
BT
和直接执行技术的结合来实现任何
x86
操作系统的虚拟化。如图
5
所示,
BT
可以翻译核心指令来代替那些不能虚拟化的指令,通过翻译后的指令直接访问虚拟硬件。同时,所有用户级指令还是可以直接在
CPU
上执行来确保虚拟化的性能。每个
VMM
为每个虚拟机提供完整的硬件支持服务,包括虚拟
BIOS
、虚拟设备和虚拟内存管理。
图
5. BT
实现
x86
架构虚拟化
BT
和直接执行技术的结合实现了全虚拟化,此时客户操作系统可以通过虚拟化层从物理硬件上完全抽取出来,客户操作系统感知不到是否发生了虚拟化,完全不需要进行修改。全虚拟化是迄今为止唯一不需要硬件或操作系统协助来进行敏感和特权指令虚拟化的技术,
Hypervisor
可以翻译所有的操作系统特权指令,并保存在缓存里备用,而用户级的指令完全可以全速直接执行。
全虚拟化提供了最好的虚拟机隔离和安全性,简化了客户操作系统迁移和移植能力。
VMware ESX Server
就是通过全虚拟化技术来实现的最好案例。
b.
技术
2 �C
半虚拟化
该文中我们将
Para-Virtualization
翻译为半虚拟化。
Para
是来自希腊语的英语前缀,意指“和”、“在边上”、“一道”等。因此,“半虚拟化”指得是客户操作系统和
hypervisor
之间的通讯如何提高性能和有效性。如图
6
所示,半虚拟化需要修改操作系统内核,替换掉不能虚拟化的指令,通过超级调用(
hypercall
)直接和底层的虚拟化层
hypervisor
来通讯,
hypervisor
同时也提供了超级调用接口来满足其他关键内核操作,比如内存管理、中断和时间保持。
图
6.
操作系统协助的
x86
架构虚拟化
半虚拟化和全虚拟化不同,全虚拟化不需要修改上面的操作系统,敏感的操作系统指令直接通过
BT
进行处理。半虚拟化的价值在于降低了虚拟化的损耗,但是半虚拟化的性能优势很大程度上依赖于运行的负载。由于半虚拟化不支持未修改的操作系统
(
例如:
Windows 2000/XP)
,它的兼容性和可移植性差。在实际的生产环境中,半虚拟化也会导致操作系统支持和维护的艰难,因为半虚拟化往往要深入修改操作系统内核。开源的
Xen
项目是半虚拟化的代表,它可以通过修改
Linux
的内核来实现
CPU
和内存的虚拟化,通过定制的操作系统驱动来实现
I/O
的虚拟化。
为了实现全虚拟化,需要构建复杂的
BT
技术,这往往比直接修改客户操作系统来启用半虚拟化更艰难。
VMware
实际上已经在产品中使用了半虚拟化的一些技术,来构建
VMware Tools
和优化虚拟设备驱动。
VMware tools
服务为
VMM Hypervisor
提供了
一个后门服务,用来同步时间、记录日志和客户操作系统关机等。
Vmxnet
是半虚拟化的
I/O
设备驱动程序,它可以和
hypervisor
共享数据结构。这些半虚拟化技术的应用改善了设备的兼容能力,提高了数据吞吐速率,降低了
CPU
利用率。需要重点澄清的是:
VMware tools
服务和
vmxnet
设备驱动并不是
CPU
半虚拟化解决方案,它们紧紧对客户操作系统进行了微小的、非关键的修改,并不需要修改客户操作系统内核。
面向未来,
VMware
也在帮助开发虚拟化版的
Linux
来支持半虚拟化技术的进步,更进一步的细节,我们将在后面进行探讨。
c.
技术
3 �C
硬件辅助虚拟化
硬件厂商面对虚拟化都相当热情,他们都投入了大量的精力来开发新的特性来简化虚拟化技术的应用。第一代的虚拟化增强包括
Intel Virtualization Technology (VT-x)
和
AMD
的
AMD-V
,这两种技术都为
CPU
增加了新的执行模式
root
模式,可以让
VMM
运行在
root
模式下,而
root
模式位于
Ring 0
的下面。如图
7
所示,特权和敏感指令自动在
hypervisor
上执行,从而无需
BT
或半虚拟化技术。客户操作系统的状态保存在
VT-x
(
Virtual Machine Control Structure
,虚拟机控制结构)中或
AMD-v(Virtual Machine Control Block
,虚拟机控制块
)
。支持
Intel VT
和
AMD-V
的
CPU
从
2006
年开始推向市场,因此只有新的系统包含了这些硬件辅助的虚拟化功能。
图
7.
硬件辅助的
x86
架构虚拟化
由于
hypervisor
到客户操作系统转换的损耗和严格的编程模式要求,第一代的硬件辅助虚拟化性能并不理想,
VMware
的
BT
技术很多时候性能更好。第一代硬件辅助虚拟化为编程留了很小的空间,降低了软件的灵活性,增加了
hypervisor
到客户操作系统转换的损耗,正式基于此,
VMware
仅仅在很少的情况下利用了第一代的硬件辅助虚拟化,比如,在
Intel
平台上支持
64
位操作系统的时候,
VMware
使用了
Intel
的
VT-x
。
2.
内存虚拟化
除了
CPU
虚拟化,下一个关键是内存虚拟化,通过内存虚拟化共享物理系统内存,动态分配给虚拟机。虚拟机的内存虚拟化很象现在的操作系统支持的虚拟内存方式,应用程序看到邻近的内存地址空间,这个地址空间无需和下面的物理机器内存直接对应,操作系统保持着虚拟页到物理页的映射。现在所有的
x86 CPU
都包括了一个称为内存管理的模块
MMU
(
Memory Management Unit
)和
TLB(Translation Lookaside Buffer)
,通过
MMU
和
TLB
来优化虚拟内存的性能。
图
8.
内存虚拟化
为了在一台机器上运行多个虚拟机,需要增加一个新的内存虚拟化层,也就是说,必须虚拟
MMU
来支持客户操作系统。客户操作系统继续控制虚拟地址到客户内存物理地址的映射,但是客户操作系统不能直接访问实际机器内存。
VMM
负责映射客户物理内存到实际机器内存,它通过影子页表来加速映射。如图
8
所示,
VMM
使用
TLB
硬件来映射虚拟内存直接到机器内存,从而避免了每次访问进行两次翻译。当客户操作系统更改了虚拟内存到物理内存的映射表,
VMM
也会更新影子页表来启动直接查询。
MMU
虚拟化引入了虚拟化损耗,第二代的硬件辅助虚拟化将支持内存的虚拟化辅助,从而大大降低因此而带来的虚拟化损耗,让内存虚拟化更高效。
3.
设备和
I/O
虚拟化
最后一个模块是设备和
I/O
虚拟化,也就是如何管理和路由物理设备和虚拟设备之间的
I/O
请求。
图
9.
设备和
I/O
虚拟化
基于软件的
I/O
虚拟化和管理为设备管理带来了新的特性和功能,让设备的管理更容易。就拿网络为例,通过虚拟网卡和交换机可以在一台物理机上不同虚拟机之间建立虚拟网络,而这不会在物理网络上产生任何的流量;网卡
teaming
允许多个物理网卡绑定成一个虚拟机网卡,提供了很好的容错能力,同时保持了同一
MAC
地址。
I/O
虚拟化的关键是保持虚拟化优势的同时,尽量降低虚拟化给
CPU
造成的负担。
Hypervisor
虚拟化物理硬件,为每台虚拟机提供一套标准的虚拟设备,如图
9
所示。这些虚拟设备高效模拟常见的物理硬件,将虚拟机的请求发送到物理硬件。该硬件标准化的过程也让虚拟机标准化,让虚拟机更容易在各种平台上自由移动,而无需关心下面实际的物理硬件类型。
4.
目前几种
x86
虚拟化技术对比总结
VMware
目前利用了以上三种的虚拟化技术,或者用在生产上,或者用在开发实验室,在性能和功能之间找到平衡。下表是三种虚拟路线的总结比较,可以看到它们的优劣,从而可以取长补短,对三种虚拟化路线进行科学选择。
|
利用
BT
的全虚拟化
|
硬件辅助虚拟化
|
操作系统协助
/
半虚拟化
|
实现技术
|
BT
和直接执行
|
遇到特权指令转到
root
模式执行
|
Hypercall
|
客户操作系统修改
/
兼容性
|
无需修改客户操作系统,最佳兼容性
|
无需修改客户操作系统,最佳兼容性
|
客户操作系统需要修改来支持
hypercall
,因此它不能运行在物理硬件本身或其他的
hypervisor
,兼容性差,不支持
Windows
|
性能
|
好
|
一般
目前很多情况下比
BT
性能差,随着时间推移会逐步改善
|
某些情况下好
|
应用厂商
|
VMware/Microsoft/Parallels
|
VMware/Microsoft/Parallels/Xen
|
VMware/Xen
|
客户操作系统独立于
hypervisor?
|
是
|
是
|
XenLinux
只能运行在
Xen
的
hypervisor
上
VMI-Linux
可以支持各种
hypervisor
|
阅读该文的其他部分:
-
解读三种虚拟化之路连载一:x86虚拟化概述
-
解读三种虚拟化之路连载二:虚拟化实现
-