一、 虚拟化技术概述
虚拟计算机的概念最早由IBM 公司在上世纪六七十年代提出, 并将其运用于VM/370 系统中以共享昂贵的大型机系统(Main Frame)。之后的发展起起伏伏,一度由于分时操作系统的出现而处于停滞状态。上世纪九十年代随着JAVA 虚拟机的推出,尤其是之后Vmware 公司和VMware vSphere 4.0 , Vmware Workstation7、Citrix虚拟化和微软Hyper-V虚拟化的推出,使对虚拟机技术的研究再次成为处理器设计人员、软件设计人员、服务器设计人员和网络安全设计人员的热门研究课题。
如下图 1 所示,虚拟化技术通过在现有平台(机器)上添加一层薄的虚拟机监控程序(Virtual Machine Monitor,简称VMM)软件而实现对系统的虚拟化,如虚拟处理器,虚拟内存管理器(MMU)和虚拟I/O 系统等。虚拟机监控程序又被称之为监管程序(Hypervisor)。从应用程序的角度看,程序运行在虚拟机上同运行在其对应的实体计算机上一样。虚拟机技术使得一台物理计算机可以生成多个不同的虚拟机分别运行多个不同或相同的操作系统。虚拟机技术通过将不同的应用运行在不同的虚拟机上,可以避免不同应用程序之间的互相干扰,例如一个应用的崩溃不会影响到其它的应用等。这种由虚拟机技术实现的各个应用之间的完全隔离在服务器领域具有尤其重要的意义,同时虚拟机技术也可以使得企业,高校或研究所可以在不必购置大量物理计算机的情况下实现大规模的计算机网络以从事生产及研究,例如网络及网络应用研究, 操作系统内核(Kernel)软件的开发和用户操作系统的开发等。
图 1: 虚拟化软件(VMM)使一个物理平台同时运行多个客户机操作系统
VMM 抽象的虚拟机的指令集(Instruction Set Architecture 简称ISA)可以等同于它运行的物理机器,也可以作些微修改。当虚拟的指令集与物理的指令集相同时,该虚拟机可以运行没有任何修改的操作系统;而当两者不完全相同时,客户机的操作系统就必须在源代码级或二进制代码级作相应修改。根据是否需要修改客户机操作系统的源代码,虚拟化技术又可以分为(1)泛虚拟化(Paravirtualization)和(2)完全虚拟化(Full-virtualization)。完全虚拟化由于不需要修改客户机操作系统,因此具有很好的兼容性和同时支持异种操作系统或不同版本操作系统的能力。相反泛虚拟化技术则通常具有比完全虚拟化技术更好的性能。
泛虚拟化技术在最早的IBM VM/370 上就已经使用,但它的使用仅仅是为了支持传统的操作系统,因此被限制在很小的范围。美国华盛顿大学计算机科学与工程系的Steven D. Gribble 领导的Denali 项目和英国剑桥大学计算机实验室的Ian Pratt 和KeirFraster 领导的Xen 项目组实现了X86/PC 上的泛虚拟化,使泛虚拟化技术重新成为最热门的虚拟化技术之一。随着Intel®公司在2005年初推出基于处理器硬件的虚拟化技术(Intel® Virtualization Technology 简称Intel®VT 技术),支持未经修改的操作系统的完全虚拟化技术同泛虚拟化技术一样成为当今虚拟化领域中的两个主要研究方向。
二、Xen 虚拟机
Xen 是一个基于开源(Open Source)代码的系统虚拟机,最初基于32 位X86 体系结构而设计开发,支持同时运行多至约100 个虚拟机。Xen 引入的管理接口(Hypercalls)和事件(Events)机制,以及预先定义的虚拟机和VMM 之间的共享内存数据交换机制都使得新的客户机体系架构(XEN 虚拟机架构)具有更高的总体性能,但同时也就注定了它必须修改客户机操作系统源代码。
Xen 将客户机称之为虚拟域(Domain),其中0 号虚拟域为服务域作为监控程序的扩展提供系统的管理服务。监控程序拥有部分硬件IO 资源如定时器设备、中断设备PIC/Local APIC/IO APIC 等,其他虚拟域也可以拥有部分的IO 资源如硬盘网卡等。拥有物理设备的虚拟域称为隔离设备驱动域(Isolated Driver Domain)或简称设备驱动域(Driver Domain)。普通虚拟域只有虚拟设备而不拥有直接的硬件设备资源访问权。XEN项目也将Hypervisor 称为XEN。
XEN本身主要基于开源的Linux 内核代码移植而来,同时运行其上的XenLinux 也从Linux 移植而来,意为支持XEN 架构的Linux。同样支持XEN 架构的free BSD 和WindowsXP 也能够在XEN 上运行。应用程序均(X86)不需任何修改就可以在XEN(X86)上运行,如Linux 应用程序可以在XenLinux 上运行而WindowsXP 应用程序可以在XenXP 上运行。
三、Xen 泛虚拟化体系结构
Xen 监管程序(hypervisor)运行在在最高优先级(Ring 0)上,泛虚拟化的客户域运行在较低的优先级上(Ring 1-3)。Xen/X86泛虚拟化域的内核运行在优先级1 上,而应用程序仍然运行在优先级3 上。Xen 服务虚拟域拥有对整个(或部分)物理系统资源的管理功能如块设备,显示和输入输出等。
Xen 支持泛虚拟化域和完全虚拟化域的同时运行,如图 2 所示。虚拟域0(即服务虚拟域)作为hypervisor 的扩充,直接拥有系统硬件输入输出设备(IO,DMA 等),也因此必须具有对这些设备响应的原生(Native)驱动程序。虚拟域0 提供对整个系统的管理平台,也是一个设备驱动域。虚拟域1是一个设备驱动域拥有部分物理设备,因此也需要Native 驱动程序以及向其它客户机提供后端设备驱动程序。虚拟域2是一个用户泛虚拟化域,它不具有物理硬件设备,相反通过虚拟设备(即前端设备驱动程序)向位于虚拟域0 的后端设备驱动程序申请服务而实现对设备的访问。另外未经修改的操作系统上也可以运行泛虚拟化的前端设备驱动程序以获取更高的性能。
图 2:Xen3.0 泛虚拟化体系结构
事件通道是Xen 用于虚拟域和VMM之间、虚拟域和虚拟域之间的一种异步事件通知机制。在32 位X86 架构下共有1024 个事件通道,共分8 组,每128 个通道一组。Xen架构上的物理中断(pIRQ) 、虚拟中断(vIRQ)、虚拟处理器间中断(vIPI)和虚拟域间通信(Inter Domain Communication 简称IDC)均通过事件通道实现。向事件通道发送消息会在每一个虚拟域的内部数据结构(evtchn_pending)中置位以便客户机处理。如果目标虚拟处理器正在运行则需要通过物理IPI 打断当前虚拟机的执行,以及时响应异步事件。
Xen 架构上的物理中断等同于原生系统上的中断,使拥有原生设备的Xen 虚拟域可以最大程度地利用原生操作系统(Linux)的设备驱动程序。事件通道机制使得hypervisor 在向客户机异步通知时可以一次承载多个异步事件(含物理中断),从而一次虚拟域hypervisor 之间的边界穿越可以使客户机批处理多个中断事件,大大提高了系统的总体性能。
泛虚拟域对虚拟中断和物理中断的处理完全一样,在Linux 中它们都由do_IRQ中断服务程序处理。同时将整个系统的中断数目相应增加到512 个,其中的前256 个为物理中断使用以保持与原生系统的相似性,后256 个为虚拟中断使用。
四、Hypervisor 服务(Hypercall)
Xen 虚拟域本身并不能直接访问本虚拟域以外的物理资源包括hypervisor 本身,但是虚拟域可以通过hypercalls 向监管程序申请各种服务。Hypercalls 就如同传统操作系统下的系统调用,监管程序通过它向各虚拟域提供各种服务如MMU 更新(do_mmu_update)、dom0 操(do_dom0_op)请求、虚拟处理器状态(do_vcpu_op)等等。在32 位X86 架构下hypercall 通过int 0x82陷阱(trap)指令实现,因为传统操作系统本身并不使用int 0x82(Linux 使用int 0x80 作为系统调用指令,int 0x82 并未使用)。Hypercall 的具体功能识别号由eax 表明,而其它参数则在ebx,ecx,edx,esi 和edi 中。为了减少虚拟域和hypervisor 之间的特权级别(ring)切换次数,Xen 提供对hypercall的批处理,即将几个hypercall 功能请求放在一个列表中由专门的do_multicall_call 请求完成。
只有特权级别为1 的代码(泛虚拟化域的kernel)才能向Xen 发送Hypercall 请求,以防止应用程序(特权级3)的错误调用导致对系统可能的破坏。因此只有运行在特权级1 的虚拟域操作系统内核才能申请hypercall。但是一些Xen 专用的特别程序如Xend 或xm 也需要有hypervisor 的服务来完成特殊的操作如生成一个新的虚拟域等,这在XenLinux 中是通过一个称为privcmd 的内核驱动程序实现。应用程序通过ioctl 向该驱动程序提出服务请求,运行在虚拟域内核(特权级1)的privcmd 驱动程序再将服务请求以hypercall 形式转向hypervisor 并由后者完成。
五、Xen 硬件虚拟机体系结构
泛虚拟化技术通过对客户机操作系统的修改,绕开了传统X86 体系结构的虚拟化漏洞,并以良好的性能赢得了在开源软件操作系统(如Linux)上的广泛关注,但是无法支持象Windows 这样的私有操作系统。硬件虚拟化技术在芯片硬件层面上弥补了X86体系结构的虚拟化漏洞,使hypervisor 对未经修改的操作系统的支持成为可能,如Intel®VT 和AMD SVM 技术。