一、云计算与虚拟化的关系

云计算作为一种新型资源分配和使用模式,为“移动为端,云为中心”的移动互联网业务体系打下了基础,起到了信息化社会发展的中坚作用。

云计算的一个核心思想是在服务器端提供几种的计算资源,同时这些计算资源要独立地服务于不同的用户,也就是在共享计算资源的同时,为每个用户提供隔离、安全、可信的工作环境。

云计算需要支持无数的应用请求,并保证存储和计算的性能。在云计算的SaaS、PaaS和IaaS三个层面中,IaaS承担着底层基础作用,而虚拟化技术又是IaaS技术的核心,它提供资源的多种颗粒度分配、动态可扩展和回收等手段。

二、虚拟化与虚拟机

       虚拟化技术的含义很广泛。将任何一种形式的资源抽象成另一种形式的技术都是虚拟化。在常用的操作系统中就存在某种意义上的“虚拟化技术”,例如虚拟内存空间和进程。如果把内存看作是一个设备,虚拟内存就是将物理内存虚拟成多个内存空间。虚拟内存的容量可以少于或多余物理内存。进程的概念实际是对于物理硬件执行环境的一个抽象,每一个进程都享有一个完整的硬件执行环境,并且与其他进程相隔离。

相对于进程级的虚拟化,虚拟机(VM)是另外一个层面的虚拟化,即系统虚拟化。与虚拟单个进程的执行环所不同,系统级虚拟化所抽象的环境是整个计算机,其抽象出的环境称为虚拟机,包括CPU、内存和I/O。在每个虚拟机都可以运行一个操作系统,在一台计算机上可以虚拟出多个虚拟机。

在虚拟环境中,虚拟机监控器(VMM)抢占了操作系统的位置,对下管理真实的物理硬件,对上层软件则呈现出虚拟的硬件平台。如下图,

云和虚拟化的区别 云和虚拟化的关系_云和虚拟化的区别

VMM对物理资源的虚拟主要包括:处理器虚拟化、内存虚拟化和I/O虚拟化。这篇文章主要介绍硬件辅助虚拟化的内容。

三、硬件辅助虚拟化

硬件辅助虚拟化就是在CPU、芯片组及I/O设备等硬件中加入专门针对虚拟化的支持。并且,硬件虚拟化相比软件虚拟化,可以彻底解决软件虚拟化实现中存在的下面一些问题。软件虚拟化实现非常复杂,比如内存虚拟化的“影子页表”。还有软件虚拟化实现的虚拟化性能不佳,比如I/O设备的虚拟化。

下面以Intel VT(Intel Virtualization Technology)为例,说明一下对硬件辅助虚拟化技术所提供的支持。

在CPU虚拟化方面,Intel VT 提供了VT-x(Intel Virtualization technology)技术;在内存虚拟化方面,Intel VT提供了EPT(Extended Page Table)技术;在I/O设备虚拟化方面,Intel VT提供了VT-d(Intel Virtualization Technology for Direct I/O)等技术。

以下主要讲解下硬件虚拟化中的CPU虚拟化和内存虚拟化两部分。

1、CPU虚拟化

下图是Intel VT技术实现的VMM的典型结构。上面是虚拟机,下面是VMM层。

云和虚拟化的区别 云和虚拟化的关系_云计算_02

每一个VM(虚拟机)都可以独立地使用物理平台的资源,比如处理器,内存,I/O等。Intel VT-x有两种操作模式,根操作模式(VMX Root Operation),VMM运行所处的模式;非根模式(VMX Non-Root Operation),VM(虚拟机)运行所处的模式。每种模式都有特权级0~3,VMM可以处于根模式的特权级0或特权级3下,VM也可以处于非根模式的特权级0或特权级3下。

非根模式下,VM执行敏感指令(操作虚拟机的指令)会导致CPU从非根模式进入根模式的VMM,被称为VM Exit。VMM处理完敏感指令,从根模式返回非根模式,被称为VM Entry,如图:

云和虚拟化的区别 云和虚拟化的关系_虚拟化_03

VT-X引入了VMCS(Virtual-Machine Control Structure,虚拟机控制结构体),该结构是一个4Kb对齐且大小不超过4KB的内存块,格式如下:

云和虚拟化的区别 云和虚拟化的关系_虚拟化_04

偏移0处存放VMCS的版本标识,表示VMCS数据格式的版本号;

偏移4处存放中止标识,VM Exit执行不成功时产生VMX中止,CPU会把中止的原因存储在这里。

偏移8处存放VMCS的数据域,该数据域的格式与具体CPU的型号有关。

VMCS在使用时需要与物理CPU绑定。在任意时刻,VMCS与物理CPU是一对一的绑定关系,但在不同时刻,VMCS可以绑定到不同的CPU,即和一个CPU解绑,并重绑定到另一个CPU上,这个过程称为“迁移“”。使用指令VMPTRLD完成VMCS与物理CPU绑定,指令VMCLEAR用于VMCS与物理CPU解绑定。可以给一个VM配置多个VCPU,并通过调度器让它们共享一个物理CPU分时执行或分散到多个物理CPU同时执行。

CPU在发生VM Exit和VM Entry时,会自动更新和查询VMCS。Intel提供专门的指令来配置VMCS,如VMWrite和VMRead用于读写VMCS保存的虚拟寄存器等信息。

2、内存虚拟化

内存虚拟化是实现地址空间的虚拟化,内存虚拟化通过两次地址转换来支持地址空间的虚拟化。VM的虚拟地址GVA转换为VM的物理地址GPA,再转换为VMM的物理地址HPA。其中,GVA到GPA的转换由VM内的操作系统完成,通常依靠VMCS中VM的CR3完成;GPA到HPA的转换依靠VMM的EPT(Extended Page Table)完成。

CPU查询VMCS里的CR3寄存器,CR3寄存器存放的是GPA,需要通过EPT页表找到对应的HPA。首先CPU会查看EPT TLB,如果在缓存中没有找到对应的HPA,CPU 会继续在EPT内查找,仍然没有找到,CPU抛出EPT Violation异常交由VMM来处理。CPU从VM non-Root Operation模式切换到VM Root Operation,即触发一次VM Exit。找到GPA对应的HPA,则从VM Root Operation模式切换会VM non-Root Operation模式,即VM Entry。

以4级页表为例,CPU完成一次地址转换的过程如下:

云和虚拟化的区别 云和虚拟化的关系_虚拟化_05

一个GPA地址被分成5部分,L4,L3,L2,L1,L0。每一部分作为一个索引,Index4,Index3,Index2,Index1,Offset。从EPTP取出PML4 Table的基地址,加上Index4*4找到PML4 Entry;并取出PML4 Entry中存放的PDP Table的基地址,加上Index3*4找到PDP Entry;取出PDP Entry中存放的PD Table的基地址,加上Index2*4找到PD Entry;取出PD Entry中存放的PT Table的基地址,加上Index1*4找到物理页帧号PFN;PFN 加上Offset就是最终的物理内存。

参考资料《系统虚拟化——原理与实现》

              《虚拟化技术原理与实现》

              《Intel手册卷3》

              《虚拟化与云计算》

              《Windows Internals Seventh Edition Part 2》