1. Overview
本指导描述ARMv8-A AArch64的虚拟化支持。所覆盖的内容包括stage2转换,虚拟化异常和trapping。
本文档包括一些基本的虚拟化理论作为introduction,并给出hypervisor使用这些特性的例子。它不包括一些特定hypervisor的操作,或试图解释从零开始如何写自己的hypervisor。这两项都不在本指导范围内。
在知道的结尾,你可以检查相关知识。你将学习到两种类型的hypervisor,以及它们怎么样映射到arm异常级别。你将有能力解释trap的操作和它们怎么样用于模拟操作。你将能够列出一个hypersvisor将产生哪种虚拟化异常以及描述他们的机制。
1.1 在开始之前
我们假设你已经对虚拟化有一个基本的理解,包括虚拟机是什么,和hypervisor的角色。熟悉内存管理中的异常模型和内存转换。
2. 虚拟化的介绍
这里我们将介绍一些工业化的hypervisor以及虚拟化理论。如果你已经对这些概念很熟悉,你也可以跳过这些内容。
我们使用术语hypervisor来表示用于创建,管理和调度虚拟机的一系列软件。
2.1 为什么虚拟化重要
虚拟化是一个广泛使用的技术,支持几乎所有现代云计算和企业基础架构。开发者使用虚拟化来在单个机器上跑多个操作系统(OS),并在不影响主要的计算环境下测试软件。
虚拟化对服务器系统非常重要,对虚拟化的支持是大多数服务器处理器的要求。这是因为虚拟化给出一些想要的特性给数据中心,包括:
(1)隔离:虚拟化提供了单个物理系统中不同虚拟机之间的隔离。隔离允许在多个分布式计算系统上共享一个物理系统。比如,两个竞争者可以共享数据中心的相同物理机器,而不用访问相互的数据。
(2)高可用性:虚拟机允许在物理机之间无缝透明的迁移工作负载。该技术通常用于从要求维护和替代的出错硬件环境迁移工作负载。
(3)工作负载均衡:为了优化数据中心的硬件和功耗,尽可能使用硬件平台是非常重要的。这可以通过虚拟化的迁移或托管合适的工作负载到物理机上来完成。这意味着物理机尽可能被使用。这也提供了更好的功耗预算以及更好的性能。
(4)基础服务:VM可用来为应用提供基础服务并干预机器的其他部分。比如,一些应用包括传统应用或软件在开发。运行这些软件在虚拟机中可以防止bug或软件的恶意部分影响物理机上的其他应用或数据。
2.2 独立和托管的hypervisor
hypervisor可以分为两大类:独立的或Type1 hypervisor,和托管的或Type2 hypervisor。
我们首先看下托管的或Type2 hypervisor。在Type2 hypervisor配置中,host OS完全控制硬件平台和它的所有资源,包括CPU和物理内存。下面图描述了一个Type2 hypervisor:
如果你之前用过像Virtual Box 或VMWare Workstation等软件,这就是这种hypervisor。Host OS安装在平台上并且hypervisor运行在host OS中,利用已经存在的功能来管理硬件。hypervisor可控制虚拟机,虚拟机本身也运行OS,我们称它为guest OS。
下面我们在看下Type1 hypervisor:
你可以看到在这种hypervisor中没有host OS。hypervisor直接跑在硬件上,对硬件平台和资源(包括CPU和物理内存)有完全的控制。像托管的hypervisor一样,独立的hypervisor也控制虚拟机。虚拟机可以运行一个或多个guest OS。
在ARM上使用最广泛的开源的hypervisor为XEN(独立的,Type1)和KVM(托管的,Type2)。我们将使用这些hypervisor来描述一些点。但是,也有其他可用的hypervisor,包括开源的和闭源的。
2.3 全虚拟化和半虚拟化
VM经典的定义为一组分开的,隔离的计算环境,但他们无法从真实的物理机上区分。即使在ARM系统上完全模拟真实机器,通常这也不是一件有效率的事。因此,这种模拟并不经常做。比如,模拟一个真实的网卡是很慢的,因为guest OS发起的每个对模拟寄存器的访问必须在软件上由hypervisor处理。这种处理远比在物理设备上直接访问寄存器更昂贵(花时间更多)。
为了优化性能,一个通常替代的方案为修改guest OS。让guest OS意识到它是运行在VM上,通过提供为高性能的虚拟设备(hypervisor模拟,guest OS访问),guest OS可以获取高的性能,即使是IO。
严格来讲,完全虚拟化模拟了一个真实的物理机。XEN推广了半虚拟化,它的guest OS部分被修改来运行在一个虚拟硬件环境而不是真实物理环境。这个修改是为了改进性能。
现在对于大多数支持硬件虚拟化的架构,包括ARM,guest OS大多数不需要修改。Guest OS认为它运行在真实的硬件上,出来IO外设驱动如块设备和网络,它们使用半虚拟化设备和设备驱动。这种半虚拟化的IO设备为VIRTIO和XEN PV Bus。
2.4 虚拟机和虚拟CPU
理解VM和vCPU的差异非常重要。VM包含一个或多个vCPU,如下图所示:
当我们查看本指导的其他文档时,VM和vCPU的差异就很重要。比如,内存的页可能分配给一个虚拟机,因此VM中所有vCPU都可以访问。但是,一个虚拟中断目标为一个特定的vCPU,只能在该vCPU上处理。
NOTE: 严格来讲,我们应该提vPE,而不是vCPU。记住一个PE是一个实现ARM架构的更通用的属于。本指导用vCPU代替vPE是因为vCPU对大多数人更熟悉。但是,在架构文档中,使用vPE。
3. Arch64的虚拟化
运行在EL2或更高异常级别有一些对虚拟化访问控制的权限:
- stage2转换;
- EL1/0指令和寄存器访问的陷入trap
- 虚拟异常的产生;
在非安全和安全状态的异常级别如下所示:
在这个图中,安全EL2为灰色。这是因为在安全状态下支持EL2并不是一直都可用的。这将在安全虚拟化章节讨论。
这个架构支持的特性有:
- 安全虚拟化;
- Type2 hypervisor;
- Nested虚拟化。