-
Notifications
You must be signed in to change notification settings - Fork 18
1. Hypervisor 基本概念
虚拟化技术,即在一台真实的计算机上创建一台虚拟的计算机,并能运行适用于虚拟计算机的软件,实现更好的隔离性。例如,在运行 Windows 系统的计算机上通过 Virtual Box 运行 Ubuntu 系统,在 x86 计算机上通过 QEMU 运行 ARM 版的 Linux。Hypervisor 的另一名称 VMM (Virtual Machine Monitor),意思就是对虚拟机进行管理。
当被虚拟出来的计算机指令集和真实计算机一样时。可通过该指令集提供的硬件虚拟化技术得到加速。根据 Popek 与 Goldberg 虚拟化要求,要实现硬件虚拟化,需要处理器在执行控制系统资源的敏感指令时能够被打断,从而将控制权交给 hypervisor;而其他非敏感指令能直接在该处理器上执行,使得效率得到保证。一般情况下,CPU 执行敏感指令时是不会被打断的,此时可认为是处于 Host 模式;当执行敏感指令会被打断时,CPU 位于一个特殊模式,可认为是 Guest 模式。从 Host 模式进入 Guest 模式需要用特殊方式开启,一般称为 VM Entry;处于 Guest 模式的 CPU 被打断后会回到 Host 模式,一般称为 VM Exit (类似发生中断)。
对于 x86 处理器来说,由于 Intel VMX 和 AMD SVM 技术的引入,使得其能够被硬件虚拟化。RVM 就是利用了 Intel VMX 技术实现的硬件虚拟化。
如下图所示,hypervisor 可以分为两类:
- Type-1,或 bare-metal hypervisor:Hypervisor 直接管理硬件资源和上层 Guest OS,不需要底层 OS 的支持,不过从功能上看此时的 hypervisor 也相当于一个小型 OS,只不过没有用户态。例如 Xen 就是这种形式。
- Type-2,或 hosted hypervisor:由传统的 OS 管理硬件资源,hypervisor 是它的一个用户程序,而其上的 Guest OS 一般是一个进程。例如 VMware Workstation、Virtual Box、QEMU 等常见的虚拟机软件。
目前,RVM 运行在 zCore 或 rCore 之上,因此是一个 Type-2 的 hypervisor。不过,RVM 与这些 OS 的耦合性较低,可以不需要底层 OS 的支持,能方便地将其改造为 Type-1 的 hypervisor。这里 给出了一个初步的尝试,这个 UEFI 应用在启动后处于 bare-metal 状态,通过 RVM API 创建了一个简单的虚拟机,并运行了一段调用 hypercall 的 Guest 代码。
下面给出了之后章节可能出现的重要名词的汇总:
- Host:真实物理计算机,上面运行着 hypervisor (Type-1) 或一个 OS (Type-2),即 Host OS。
- Guest:由 hyperviosr 虚拟出来的计算机,上面也可运行一个 OS,即 Guest OS。在一台物理机上可同时创建多个 Guest,以同时运行多个 Guest OS。
- vCPU:由 hyperviosr 虚拟出来的 vCPU,类似多核系统,一个 Guest 可以有多个 vCPU,每个 vCPU 可看做一个线程,由 Host OS 进行调度与执行。
- Hypervisor:虚拟机管理器,运行在 Host 机器上,可虚拟出多个 Guest 机器,并对 Guest 和 vCPU 进行管理。Type-1 的 hypervisor 类似 OS,直接控制硬件资源;Type-2 的 hypervisor 一般是一个用户态的应用程序,例如 QEMU,不过如果要使用硬件虚拟化,CPU 必须处于特权模式,因此 hypervisor 不能完全运行在用户态,还有一部分需要运行在内核态,例如 Linux KVM,还有 RVM,它们都是内核的一部分,需要配套的用户态的程序才能正常使用。
- VM Entry/VM Exit:在硬件虚拟化中,由 Host 模式进入 Guest 模式即为 VM Entry;在 Guest 模式运行过程中,会因为某些原因返回到 Host 模式,即为 VM Exit。
- Hypercall:类似系统调用 (syscall),是一条特殊的指令,在 Guest 模式里执行该指令会发生 VM Exit,进入 Host 模式。