一文读懂虚拟化原理

1. 前言

虚拟化是现代计算机领域不可或缺的一种技术,它让公开的虚拟资源等于被虚拟化的底层物理资源,通常是使用多路复用、聚合和模拟中的一种或多种基本技术实现。等效性、安全性和性能是衡量虚拟化的三个重要标准。Gerald Popek和Robert Goldberg在1974年就确立了一个指令集架构(ISA)是否支持虚拟化的基本要求。直到今天,这个核心思想仍然理解计算机体系结构和支持虚拟机能力的基本原则。

2. 名词解释

在开始正文之前,先复习下几个虚拟化相关的重要名词。

2.1 虚拟机

英文是Virtual Machine,简称VM。虚拟机是对完整计算机环境的抽象,它将处理器、内存(memory)和I/O设备联合虚拟化,具有自己独立的处理能力、内存和通信通道。每个虚拟机的内部环境类似于计算机的硬件,都有自己的底层硬件副本,或者至少有自己的某些底层硬件副本,且可以运行自己的独立客户操作系统(Guest OS)及其应用程序(App),且与其它虚拟机和环境其余部分完全隔离,互不影响和感知。虚拟机的运行平台可以分为两类:虚拟机管理程序(Hypervisor)和机器模拟器(Machine Simulator)。这两个名词在下面介绍。

2.2 虚拟机管理程序

英文是Hypervisor,中文也叫超级监督者。Hypervisor是管理和运行虚拟机的专用系统软件。当多个虚拟机同时存在于同一个计算机系统上时,hypervisor对它们进行调度,使虚拟机之间进行多路复用来分配真实物理资源。Hypervisor让虚拟机直接在CPU上执行可以获得最大效率,理想情况下基本不影响性能开销。Hypervisor先配置好硬件环境(寄存器等),随后让虚拟机指令在CPU上执行。由于虚拟机指令序列必须在虚拟机的抽象中操作,因此执行更新或依赖系统状态的指令会引起Trap(捕获),hypervisor会处理这个Trap并模拟该指令的功能。Hypervisor设计的核心就是Trap-and-Emulate范式。

Hypervisor分为type-1和type-2两种类型。Type-1 hypervisor直接控制物理计算机的所有资源。相比之下,type-2 hypervisor要么作为现有主机操作系统(Host OS)的一部分运行,要么直接在现有Host OS之上运行,其实就是扩展Host OS的功能。常见的hypervisor如下图1所示。

图1 常见的hypervisor

最基本的hypervisor使用两种关键虚拟化技术:

  • 在虚拟机之间多路复用物理资源(在空间上,也可能在时间上);
  • 模拟其它一切需要的资源,特别是I/O总线和I/O设备;

由于Hypervisor允许虚拟CPU直接执行物理处理器的指令,这种调度技术被称为直接执行(Direct Execution)。当然,hypervisor要负责确保虚拟机的安全性。因此,hypervisor会确保虚拟机总是以更低的特权执行,这样虚拟CPU就不能直接执行特权指令等。只要Guest OS试图执行特权指令,虚拟机的直接执行就会导致Trap,然后就由hypervisor接管去模拟了。因此,围绕直接执行设计的hypervisor遵循trap-and-emulate范式,其中大部分执行开销是用于hypervisor代表虚拟机模拟trap指令的功能。

2.3 机器模拟器

英文是Machine Simulator。Machine Simulator通常使用普通的用户级应用程序实现,其目标是提供对虚拟架构的精确模拟,取决于模拟细节的级别,它通常会比本机速度慢x5到1000x不等。因为Machine simulators允许对复杂工作负载的详细研究,在计算机体系结构研究中起着重要作用。

实际上,Machine Simulator和Hypervisor之间的主要区别在于,前者模拟虚拟机的CPU指令集体系结构,而后者对CPU进行多路复用。CPU的多路复用是一个调度任务,与操作系统调度进程任务非常的类似。调度实体(这里是hypervisor)设置硬件环境(寄存器等),然后让被调度实体(虚拟机)以较低的特权等级直接在硬件上执行。Machine Simulator可以说是Full(soft) virtualization,Hypervisor可以说是Hardware virtualization(HVM, HV)。

除了Hypervisor和Machine Simulator,其实还有一种半虚拟化(paravirtualization)。它是由于早期处理器缺乏对虚拟化清晰的体系结构支持,因此出现了一系列解决运行与底层硬件相似或兼容相同虚拟机问题的方法。这种方法做出了不同的权衡,将简单性和整体效率置于与底层硬件的完全兼容性之上。

在早期没有虚拟化体系结构支持的平台上,paravirtualization需要更改与底层硬件不兼容的Guest OS。在具有Full virtualization支持的体系结构的当前使用中,通过平台特定的扩展,paravirtualization仍然用于增强HWM,通常在设备驱动程序中实现,例如管理协作内存或实现高性能前端设备。

2.4 虚拟机监控器

英文是Virtual Machine Monitor,简称VMM。VMM是hypervisor中专门用于CPU和内存虚拟化的部分。不过有些文献中,VMM和hypervisor是一样。在Type-1 hypervisor中,VMM直接在裸机上运行,type-2 hypervisor中,VMM运行在Host OS之下。Type-1和type-2的hypervisor中,VMM都需要创建虚拟机。

Type-1环境中,裸机上的VMM必须执行系统的调度和实际的资源分配,因此,type-1 VMM需要编写额外的资源调度和分配代码。Type-2环境中,Host OS调度所有的系统资源,Host OS像调度进程一样调度hypervisor,尽管这种模式需要依赖繁琐的Kernel模式来执行虚拟机,但好处就是可移植性强、代码改动量少。

VMM的基本结构如图2所示,每个Processing Element(PE)包括了CPU和物理内存。PE连接到I/O总线上,并附带两个I/O设备:磁盘和网络接口卡。该图也是服务器部署的典型代表。PC的话可能还包括键盘、鼠标、串行接口和USB等附加设备。移动平台可能还需要GPS、加速度计和收音机等。图中有三个虚拟机,每个虚拟机都有自己的虚拟硬件、自己的Guest OS和自己的应用程序。Hypervisor直接运行在真实硬件上,且控制着实际的物理资源。

图2 VMM的基本架构

2.5 内存

英文是Memory。内存有很多种类定义,不过大致分为两种类型:Virtual memory(虚拟内存)和Physical memory(物理内存),虚拟内存通过分段或分页的组合转换为物理内存。

虚拟内存通常就是处理器执行指令时所使用的地址空间。除了极少数例外,所有指向内存位置的寄存器和指令地址都包含一个虚拟地址。在分段体系结构中,虚拟地址空间是由基址和偏移限制决定的。基址会被添加到虚拟地址中,偏移限制会用于检查以进行保护地址是否越界。在分页体系结构中,虚拟地址空间由内存管理单元(MMU)在逐页的基础上确定,其映射由页表或软件TLB miss处理程序定义。有些体系结构(如x86-32)将分段与分页结合起来,虚拟地址首先(通过分段)转换成线性地址,然后(通过分页)转换成物理地址。

物理内存就是处理器的内存层次结构访问所使用的地址空间,通常由DRAM提供支持。在非虚拟化的计算机系统中,物理地址空间通常由硬件资源决定,并由处理器的内存控制器定义。在虚拟计算机系统中,hypervisor定义虚拟机可用物理内存大小。从技术上讲,对虚拟机可见的抽象应该称为“virtual physical memory”(虚拟物理内存)。然而,为了避免与虚拟内存混淆,它通常被称谓guest-physical memory。为了进一步避免歧义,底层资源被称为host-physical memory。不过要注意,一些早期的虚拟化论文使用了不同的术语,特别是分别使用physical memory和machine memory来指代guest-physical memory和host-physical memory。

3. 虚拟化模型

1974年,Gerald Popek和Robert Goldberg在Communications of the ACM上发表了一篇名为“Formal Requirements for Virtualizable Third-Generation Architectures”的论文,其中定义决定了一个给定的指令集架构(ISA)是否可以被一个使用多路复用的VMM虚拟化。对于任何满足定义假设的体系结构,任何可以直接在硬件上运行的操作系统也可以在虚拟机中运行,而无需修改操作系统代码。这项工作的动机是解决新架构可能阻碍VMM构建,让架构师在设计时就考虑这个问题。直到今天,这个定理仍然是理解计算机体系结构与其支持虚拟机的能力之间的基本关系的起点。具体地说,该定理决定了仅依赖于直接执行的VMM是否能够支持任意Guest OS。

这个定理假设有一个标准的计算机体系结构的处理器,处理器有两种执行模式:用户级(user-level)和主管级(supervisor),且支持虚拟内存。特别是,操作系统可以将硬件配置为相互隔离地运行多个任意的应用程序。为了证明,文章定义了一个简单的模型,该模型具有以下特点:

  • 计算机有一个拥有两个执行级别的处理器:主管模式(supervisor mode)和用户模式(user mode)。
  • 虚拟内存是通过分段(而不是分页)实现的,它使用基址B和限制L的单个段(B和L也称作relocation-bound register pair)。分段定义[B, B+L]范围的线性地址空间为有效地虚拟地址[0, L]。由于不采用分页,线性地址直接以1:1的比例映射到物理地址。对于所有内存访问,在supervisor和user模式下都是用虚拟内存。
  • 物理内存是连续的,从地址0开始,物理内存大小(SZ)在处理器复位时是已知的。
  • 处理器的系统状态称为处理器状态字(processor status word, PSW),由元组(M, B, L, PC)组成。
    • 执行级别(execution level):M={s,u};
    • 段寄存器(segment register):(B, L);
    • 当前程序计数器(program counter, PC),虚拟地址;
  • Trap architecture规定首先将PSW内容保存到内存中的一个已知位置(MEM[0]),然后将来自内存中另一个已知位置(MEM[1])的值加载到PSW中。Trap architecture机制用于在系统调用或执行指令时出现异常后进入。
  • ISA包括至少一条指令或指令序列,该指令或指令序列可以将元组(M, B, L, PC)从内存的一个位置加载到硬件PSW中。用于在系统调用或Trap处理完成后,恢复到用户模式下执行。
  • 为了简化讨论,忽略I/O和中断。

我们首先考虑这种体系结构的操作系统是什么样的(在没有VMM的情况下)。

  1. Kernel将在supervisor模式(M=s)下运行,而应用程序将始终在user模式(M=u)下运行;
  2. 在初始化过程中,kernel首先设置Trap入口点:MEM[0]←(M:s,B:0,L:SZ,PC:trap_en);
  3. Kernel将为每个应用程序分配一个连续的物理内存范围;
  4. 要启动或恢复存储在物理内存[B, B+L]中的应用程序和当前正在执行指令PC,操作系统只需要把(M:u, B, L, PC)加载到PSW中;
  5. 在Trap入口点(PC=trap_en),kernel首先解码存储在MEM[1].PC中的指令,确定产生Trap的原因,然后采取适当的行动;

这个体系结构比较理想化,特别是缺少寄存器,但与现今所熟悉的体系结构本质上没有什么不同。对于这样的架构,Popek和Goldberg提出了以下正式的研究问题。

给一台满足这个基本体系结构模型的计算机,在这个模型的精确条件下可以构造VMM,使VMM:

  • 可以执行一个或多个虚拟机;
  • 可以始终完全控制machine;
  • 支持为相同的体系结构设计任意的、未经修改的或潜在的恶意操作系统;
  • 在最坏的情况下,速度只有较小的下降;

这个问题的答案决定了是否可以为特定的体系结构构造VMM,从而得到的虚拟机可以是真实机器的高效、独立的副本。当条件满足时,定理必须确保符合以下三个标准:

  • Equivalence:虚拟机本质上与底层处理器相同,即计算机体系结构的副本。在虚拟机中运行的任何程序,即任何Guest OS和应用程序组合,都应该表现出与直接在底层硬件上运行的程序相同的行为,除了可能出现的例外情况,比如由时间依赖关系或资源可用性(如物理内存大小)引起的差异。
  • Safety:VMM必须始终完全控制硬件,且不对虚拟机内部运行的软件做任何假设。虚拟机与底层硬件是隔离的,它的操作就像在一台独立的计算机上运行一样。此外,不同的虚拟机之间必须相互隔离。
  • Performance:效率要求意味着,与直接在底层硬件上运行相比,在虚拟化环境中程序的执行速度即使最坏的情况下也只会有轻微的下降。

4. 虚拟化定理

基于上述虚拟化模型,Gerald Popek和Robert Goldberg提出了以下定义:对于任何计算机,如果该计算机的敏感指令集(sensitive instructions)是特权指令集(privileged instructions)的子集,则可以构造虚拟机监视器(virtual machine monitor, VMM),也称hypervisor。

Popek和Goldberg研究的问题的答案取决于ISA指令的分类。如果一条指令可以更新系统状态,那么他就是控制敏感指令(control-sensitive);如果一条指令的语义依赖于系统状态中设置的实际值,那么它就是行为敏感指令(behavior-sensitive);否则,就是无害指令(innocuous instruction)。如果一条指令只能在supervisor模式下执行,并且尝试从user模式下执行时会产生Trap,那么它具有特权(privileged)。当所有control-sensitive和behavior-sensitive指令都具有特权时,则可以构造VMM。如:

control-sensitive || behavior-sensitive ≤ privileged

图3(a)描述了三种主要形式的内存之间的关系:host-physical memory, guest-physical memory和virtual memory。图3也表述了在三种不同情况下,处理器的PSW,以及执行级别M和relocation-bound pair(B, L)是如何配置的。

(a) host-physical memory, guest-physical memory和virtual memory

(b) 执行应用程序、Guest OS和VMM时的硬件配置

图3 VMM的构造

如果满足定理的条件,则VMM的操作如下:

  1. VMM是唯一实际运行在supervisor模式下的软件。VMM为自己的代码和数据结构保留了一部分物理内存,这些内存永远不会映射到任何虚拟机的任何虚拟地址空间。
  2. VMM在host-physical地址空间中为每个虚拟机连续分配guest-physical memory,每个虚拟机都有固定的内存大小。这些参数如图3中的addr0和memsize。
  3. VMM在内存中保存每个虚拟机的系统状态的副本:vPSW。与硬件类似,vPSW由虚拟机的执行层、段寄存器(B, L)和PC组成。
  4. 虚拟机通过从内存加载元组(M’, B’, L’, PC’)恢复PSW 来执行:
    1. M’←u:虚拟机始终以用户模式执行;
    2. B’←addr0+vPSW.B:将guest-physical偏移量添加到虚拟机的段基址中;
    3. L’←min(vPSW.L, vPSW.memsize-vPSW.B):一般情况下,是直接使用虚拟机的段限制。然而,恶意Guest OS可能会尝试允许其应用程序读取超出guest-physical memory末端的内容。这样min()是放置了这种情况,以确保安全性;
    4. PC’←vPSW.PC:恢复虚拟机的执行;
  5. 在每次Trap时,VMM更新PC值(vPSW.PC←PSW.PC)。vPSW的其它域段即使在任意长的直接执行周期之后也不需要更新。实际上,任何可以更新PSW的B/L/M的指令都是control-sensitive的。VMM假定所有control-sensitive的指令都是privileged,并依赖于虚拟机始终使用PSW.M==u来执行。
  6. VMM模拟引起Trap的指令。如果guest OS正在运行(vPSW.M==u),VMM首先对指令进行解码,然后根据ISA模拟特权指令的语义。例如,根据Guest OS设置的新值,VMM通过更新vPSW.B和vPSW.L来模拟更改segment register pair。在成功模拟后,VMM增加PC(vPSW.PC++),然后根据步骤4恢复虚拟机的执行。
  7. 然而,VMM可能得出结论,根据ISA,指令的模拟实际上是一个Trap。例如,考虑虚拟机处于user模式的情况(vPSW.M==u),恶意应用程序试图发出特权指令,或者如果应用程序访问内存超出了Guest OS在段描述符(B)中设置的限制。根据架构,VMM会模拟Trap,即:
    1. MEM[addr0]←vPSW:根据体系结构将虚拟机的vPSW存储到Guest-physical memory的第一个字;
    2. vPSW←MEM[addr0+1]根据体系结构将Guest-physical memory中的第二个字复制到vPSW中。根据Guest OS设置的配置更新虚拟机的状态;
    3. 按照步骤4恢复执行;
  8. 如果满足定理的假设,所有更新系统状态的指令(程序计数器除外)是control-sensitive,且具有privileged。在user模式下执行这些指令将会造成Trap。它将包括任何改变定义虚拟地址空间的base-bound registers指令、或在user和supervisor模式之间转换的指令。VMM根据体系结构规范模拟这些指令。
  9. 如果这个假设得到满足,那么任何behavior-sensitive指令都将拥有特权,在user模式下执行将会导致Trap。VMM也会模拟这些指令,例如,考虑一条指令需要读取执行层(PSW.M)或段基址(PSW.B),这种指令的行为直接依赖于处理器状态的实际值,而处理器状态的实际值会在虚拟化过程中发生变化。这些指令必须具有特权,以确保正确的值返回给程序。

5. 递归虚拟化

实际上,满足定理标准的理想化架构也可以支持递归虚拟机。在这个场景中,虚拟机可以在Guest-supervisor模式下运行VMM,而不是在操作系统模式下运行VMM。当然,VMM可以运行多个虚拟机、它们的Guest OS和各自的应用程序。在递归虚拟化中,VMM本身必须在虚拟机中运行。

6. 总结

本文旨在用最简单的方式描述虚拟化的本质和基本实现框架,任何复杂的虚拟机都是基于此基本原理上增补功能来的。只要大家心里有个虚拟机原理框架,我相信学习任何虚拟机都能很快入手,摆脱只见树木,不见森林的状态。

本文从名词解释,在使用一个基本简单的模型,引出了Popek和Goldberg研究的虚拟化定理,根据这个定理,可比较快判断一个处理器体系结构是否好支持Hypervisor。Hypervisor实际上也是一个OS,两者都必须确保保持控制,并且必须正确配置硬件以实现其目标。不同之处在于,OS运行应用程序,而hypervisor运行整个虚拟机(包括Guest OS和应用程序)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

谷公子的藏经阁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值