计算虚拟化通常包含三方面的内容:
- CPU 虚拟化:有序多个 VM 共享 CPU 资源,需要对 VM 中的敏感指令进行截获并模拟执行。
- 内存虚拟化:由于多个 VM 共享同一物理内存,需要相互隔离。
- I/O 虚拟化:由于多个 VM 共享一个物理设备,通过分时多路技术进行复用。
注:VM 指虚拟机
CPU 虚拟化概述
CPU的结构
X86 体系架构为了能让上层的软件(操作系统、应用程序)能够访问硬件,提供了四个 CPU 特权级别,Ring0 最高,Ring3 最低(只有最高的权限才能访问硬件,二应用程序代码运行在 Ring3 上)。
如果某个应用程序要访问硬件和内存,比如访问设备,写文件(核心指令)等,那么就要执行相关的系统调用,CPU 的运行级别从 Ring3 到 Ring0 的切换(越权),完成操作后再切换返回到 Ring3 。这里完成了用户态和内核态的转换。

早期虚拟化
VMM 本质上是个 Host OS ,运行在 Ring 0 上,Guest OS 运行在 Ring 1 上,再往上是相应层次的应用程序运行在 Ring2 和 Ring3 上。
当 Guest OS 或上层应用在执行相关的特权指令时,就会发生越权访问,触发异常,此时 VMM 就截获这个指令,然后模拟这个指令,返回给 Guest OS 。
半虚拟化
上述的截获指令再模拟的方式性能较比,怎么才能提高性能?
讲特权指令封装为函数调用的方式(API),让 VMM 执行,这样可提高相当程度的性能。
这种方式(半虚拟化技术)并不通用,要去改 Guest OS 的代码,只能看作是一种定制。为了能够通过,又能提高性能,只能在硬件上做文章。后来,以 Intel 的VT-x 和 AMD 的AMD-V 为主的硬件辅助,被提选出来。
CPU硬件辅助虚拟化
CPU 硬件辅助虚拟化在 Ring 模式的基础上引用了一种新的模式,VMX 模式。它包含根操作模式和非根操作模式。
通常情况下,Guest OS 的核心指令可直接下达到计算机系统硬件执行,而不经过 VMM ,如果执行到特殊指令,系统才会切换到 VMM,让 VMM 去执行指令。
内存虚拟化概述
背景:早期的计算机内存,只有物理内存,并且空间极其有限,每个应用或进程在使用的时候都需要小心,不能覆盖到别的内存区。
概念:抽象物理内存,并对其虚拟化,保证每个进程都被赋予一块连续的,超大的虚拟内存空间,进程可毫无顾忌的使用内存,不用担心申请内存会和别的进程冲突,因为底层有机制帮忙处理这种冲突,能够将虚拟地址根据一个页表映射成相应的物理指。
内存特点
前提:为了确认唯一标识,处理器会采用统一编址的方式将物理内存映射为一个地址空间。
- 操作系统内存地址从0开始。
- 内存是连续的
- 在虚拟环境,我们需要 VMM 通过技术手段也要满足 OS 对内存的这种特点。
面临问题
- 物理内存需要被多个 Guest OS 同时使用,但物理内存只有一个,地址 0 也只有一个,无法满足多个 OS 使用内存从 0 开始。
- 物理内存能分给多个系统进行使用,解决了多个系统的内存连续性问题,但是灵活性管理欠缺。
解决方式
引入一层全新的地址空间——客户机物理地址空间(GPA)。它让 GuestOS 看到一个虚拟的物理地址。然后通过 VMM 负责转换物理地址交由物理处理器处理。
VMM 掌握整个内存资源,维护虚拟地址到机器地址的映射关系。
- 影子页表技术:每次内存访问都需要 VMM 介入,由软件多次进行地址转换,效率较低。为 Guset 设计一套影子页表,将这套表装入 Host 的虚拟内存管理单元,当 Guest 访问内存时,可根据影子页表直接完成 GVA 到 HPA 的直接映射。
- EPT 技术:由硬件进行支持,Intel 的 EPT 技术(VT-d),AMD 的 NPT(AMD-V)是硬件辅助内存虚拟化的代表。在 GVA->GPA->HPA 的两次都有硬件完成。
I/O虚拟化
背景:
打开虚拟化配置
