Lec 19: Virtual Machines
虚拟机概述
虚拟机: 对计算机的一种模拟, 使得模拟足够运行一个操作系统. 在硬件之上的最底层, 存在一个 VMM(Virtual Machine Monitor, 虚拟机监视器) 用于为客户操作系统模拟一组计算机, 或多或少取代了标准操作系统内核. 原本的用户空间现在有了上层的客户空间(Guest Space), 用于运行一个或多个客户操作系统内核; 下层是主机空间(Host Space), 用于运行虚拟机监视器 VMM. 客户空间又分为客户监管模式(Guest Supervisor Mode)和客户用户模式(Guest User Mode). VMM 模拟实际硬件的工作, 并对着两种模式进行模拟.
为什么使用虚拟机
- 在一个计算机上运行多个相互独立的操作系统
- 开发内核, 更容易调试
- 新增的 VMM 提供的抽象可以实现更多功能. 如快照, 镜像等
虚拟机的目标
提供一种对于物理服务的完全准确的模拟 不希望客户软件意识到其运行在虚拟机中 客户软件无法从虚拟机中逃逸
实现虚拟机
纯软件解析指令的方法
通过软件读取每条指令并模拟硬件状态. 概念上简单直观, 运行速度很慢.
Trap and Emulate
在 CPU 运行客户指令, 该方案使用更广泛, 速度更快. 将客户应用程序的指令加载到内存, 并使用宿主机硬件直接运行. 对于特权指令, 由于虚拟机运行在用户模式, 会触发 trap 进入到 VMM 中, 由 VMM 模拟这些指令 – Trap and Emulate.
- 注: 此处 VMM 运行在 Supervisor mode, 代替原本的操作系统作为宿主机内核, 拥有硬件的完整控制权.
虚拟状态信息
VMM 为每个客户操作系统维护一套虚拟状态信息: 包括特权寄存器(STVEC, SEPC 等), (虚拟机)运行的模式(supervisor mode, user mode), hartid(CPU 核编号)
页表
客户操作系统中的页表: 将客户虚拟内存地址(gva)映射到客户物理内存地址(gpa). 客户物理地址是由 VMM 给虚拟机分配的地址空间. VMM 为每个虚拟机维护一个映射表: 将客户物理内存地址(gpa)映射到真实物理地址(hpa). 当客户操作系统向 SATP 寄存器写入新的页表时, 在 trap handler 中, VMM 会创建一个影子页表(Shadow Page Table), 将 gva 映射到 hpa, 并且将该影子页表的地址写入 SATP. 客户操作系统内核认为自己使用的是一个正常的页表, 而硬件实际使用的即该影子页表.
外部设备
- 策略 1: 模拟真实的设备. 客户操作系统使用硬件时触发 trap, 由 VMM 进行真实外设的模拟. 每次与外设交互都会触发 trap, 低效, 但是让客户操作系统无法识别自身运行在虚拟机上的唯一方法.
- 策略 2: 提供虚拟设备. 在 VMM 中构建特殊的设备接口使得客户操作系统中的设备驱动与 VMM 内支持的设备高效交互. (客户操作系统中设计了一个专门对接 VMM 实现的虚拟设备的设备驱动, 这样客户操作系统也意识到自己是在与虚拟设备交互且在虚拟机上运行)
- 策略 3: 对于真实设备的 Pass-Through. 即硬件设备支持与 VMM 上运行的客户操作系统进行交互.
硬件对虚拟机的支持
原因
- 虚拟机应用广泛
- 使用 trap 的虚拟机方案性能不好
- Intel 的 x86 处理器的许多功能很难虚拟化
具体实现
- VMM 为每个客户操作系统保存的虚拟状态信息保存在硬件中而非软件中.
- 客户程序可以在不触发 trap 的情况下执行特权指令. 客户操作系统的软件可以直接执行特权指令来修改保存在硬件中的虚拟寄存器, 而非通过 trap 由 VMM 修改 VMM 保存的虚拟寄存器.
- 硬件通过对客户操作系统做额外操作防止其滥用寄存器并从虚拟机中逃逸.
Intel 将 Guest mode 称之为 non-root mode, Host mode 称之为 root mode. 虚拟寄存器在 non-root mode 下使用, 而真实寄存器在 root mode 下使用. - VMM 内存中, 通过结构体 VMCS(Virtual Machine Control Structure, 虚拟机控制结构) 与 VT-x 硬件交互. 将虚拟机的初始状态存于 VMCS 中.
- 对于页表的支持: 客户操作系统可以加载任何值到 CR3 寄存器(用于存放页表地址), 但需要配合 EPT(Extend Page Table, 扩展页表)来将客户操作系统物理地址(gpa)转换为主机物理地址(hpa). 硬件会为客户操作系统中的每个地址完成两次地址的翻译(gva->gpa, gpa->hpa). 同时 EPT 也限制了客户操作系统能够访问的主机物理地址空间.
- 每个 CPU 核都有独立的 VT-x 硬件(以支持虚拟机), 每个 CPU 核都有用于客户模式的虚拟寄存器和 EPT.
Dune 的应用
- Dune 是 Linux 中的一个可加载模块, 作为内核的一部分运行在内核模式(supervisor mode).
- Dune 使用 VT-x 机制可以运行一个进程切换到 Dune 模式.
- Dune 能够在硬件层面支持进程同时拥有 Guest Supervisor mode 和 Guest User mode 两种模式, 进程可以在 User mode 中运行未被信任的插件代码(相当于沙箱).
- 通过 Dune, 进程的垃圾回收速度可以变得更快. 通过虚拟 CR3 寄存器指向自己的页面来获取 PTE 的脏位(dirty flag).
|