Armv8-A虚拟化手册(1)

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:

Armv8-A虚拟化手册(1)

        如果你之前用过像Virtual Box 或VMWare Workstation等软件,这就是这种hypervisor。Host OS安装在平台上并且hypervisor运行在host OS中,利用已经存在的功能来管理硬件。hypervisor可控制虚拟机,虚拟机本身也运行OS,我们称它为guest OS。

        下面我们在看下Type1 hypervisor:

Armv8-A虚拟化手册(1)

         你可以看到在这种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,如下图所示:

Armv8-A虚拟化手册(1)

        当我们查看本指导的其他文档时,VM和vCPU的差异就很重要。比如,内存的页可能分配给一个虚拟机,因此VM中所有vCPU都可以访问。但是,一个虚拟中断目标为一个特定的vCPU,只能在该vCPU上处理。

NOTE: 严格来讲,我们应该提vPE,而不是vCPU。记住一个PE是一个实现ARM架构的更通用的属于。本指导用vCPU代替vPE是因为vCPU对大多数人更熟悉。但是,在架构文档中,使用vPE。

3. Arch64的虚拟化

        运行在EL2或更高异常级别有一些对虚拟化访问控制的权限:

  1. stage2转换;
  2. EL1/0指令和寄存器访问的陷入trap
  3. 虚拟异常的产生;

        在非安全和安全状态的异常级别如下所示:

Armv8-A虚拟化手册(1)

        在这个图中,安全EL2为灰色。这是因为在安全状态下支持EL2并不是一直都可用的。这将在安全虚拟化章节讨论。

这个架构支持的特性有:

  1. 安全虚拟化;
  2. Type2 hypervisor;
  3. Nested虚拟化。

上一篇:单例模式


下一篇:虚拟机逃逸漏洞(CVE-2017-4901)的研究以及复现