本文基于以下软硬件假定:
架构:AARCH64
内核版本:5.14.0-rc5
1 什么是虚拟化
虚拟化就是把一台物理计算机虚拟成多台逻辑计算机,每台逻辑计算机里面可以运行不同操作系统,而相互之间不受影响,其典型架构如下:
其中hypervisor又被称为VMM(virtual machine monitor),它被用于管理系统全局资源。guest os为运行在虚拟机(VM)上的操作系统,每个guest os之间都无法感知对方的存在,而认为其可以独占系统资源。
理想的虚拟化方案通常包含以下几个条件:
(1)等价性:VMM需要在宿主机上为虚拟机模拟出一个本质上与物理机一致的环境
(2)高效性:虚拟机指令执行的性能与其在物理机上运行相比没有明显的损耗
(3)资源控制:VMM可以完全控制系统资源,并且协调和分配给虚拟机
通过将业务划分到不同的VM中,可以提高系统的资源利用率、安全性和可扩展性等。如对于硬件资源有富余的物理机,通过在上面运行多个虚拟机可充分利用其空闲资源,从而提高了资源的利用率。由于虚拟机之间的资源隔离作用,通过将不同安全等级的应用运行在不同虚拟机中,可以避免其互相干扰,以提高系统的安全性。在不改变物理机资源的前提下,可以动态地调整虚拟机资源,为系统配置带来了更多的灵活性和可扩展性
2 主流虚拟化方案
按照虚拟化实现方式的不同,其可分为软件虚拟化和硬件虚拟化。而硬件虚拟化又可以根据VMM是否运行在host os上,而被分为type 1虚拟化和type 2虚拟化。由于虚拟化方案中guest os的IO操作需要退回到VMM中处理,而引入较大的开销,为了减少这部分开销又诞生了半虚拟化方案
2.1 软件虚拟化
软件虚拟化不需要借助特殊的硬件支持,而能完整地模拟一台虚拟机,该虚拟机可包含自己的cpu、内存、中断控制器、定时器以及外部设备等,其典型方案为qemu。
qemu方案可在宿主机上模拟多种不同架构的虚拟机,如x86、arm、mips、ppc等,也几乎能模拟出任何的硬件设备,以下为其架构图:
由于其模拟的架构与宿主机架构可能不同,故guest os的二进制程序无法直接在宿主机上执行。qemu通过二进制翻译的方式将VM指令翻译为宿主机指令,从而实现guest os在宿主机上的正常运行。
(免费订阅,永久学习)学习地址: Dpdk/网络协议栈/vpp/OvS/DDos/NFV/虚拟化/高性能专家-学习视频教程-腾讯课堂
更多DPDK相关学习资料有需要的可以自行报名学习,免费订阅,永久学习,或点击这里加qun免费
领取,关注我持续更新哦! !
为了减少二进制翻译的复杂度,qemu引入了TCG中间指令格式,guest指令先被翻译成TCG指令,然后将TCG指令翻译成宿主机指令。如下图为在X86平台上模拟arm平台虚拟机的指令翻译流程:
这种方式下,若系统一共支持N种指令集,则一共需要实现2 * N种指令翻译方案。而若采用直接翻译方式,由于每两种指令集之间都需要支持翻译,因此总共需要实现2^N种翻译方案。
由于所有指令都需要在运行时执行翻译流程,因此严格意义上来说qemu只能叫做模拟器,而且相对于指令直接运行在cpu上,其效率相当低。但是qemu在很多情形下是非常有用的,如芯片开发或嵌入式开发早期缺少目标板时,可用qemu模拟的方式实现代码调试。
2.2 硬件虚拟化
在硬件虚拟化方案中guest指令不再需要指令翻译,而是直接运行在物理cpu上,这种方式解决了软件虚拟化的效率问题。
根据VMM实现方式的不同,硬件虚拟化方案包含type1 hypervisor和type2 hypervisor两种类型。type1方案中hypervisor直接运行在硬件上,并管理系统中所有的硬件资源和虚拟机,其典型框图如下:
这种方式hypervisor除了执行虚拟机管理功能外,还需要实现系统中所有设备的驱动,因此开发工作量较大。
Type 2 hypervisor会运行在一个host os上,host os负责管理和控制系统的硬件资源。而hypervisor作为host os的一个组件,执行虚拟机的管理工作。其典型框图如下:
此时,hypervisor可以复用host os的驱动程序,而其自身只需要专注于虚拟机管理相关的工作,从而开发工作量大大降低了。
当前比较广泛使用的hypervisor为xen(type1)和kvm(type2),在arm64架构下它们的效率如下:
(1)对于type2 hypervisor,传统方式下host os和hypervisor运行在不同的异常等级,因此它们之间需要通过异常的方式实现功能调用,相对于type1 hypervisor效率会有所降低
(2)为了解决该问题,armv8.1增加了vhe扩展支持,使得host os和hypervisor都可以运行在EL2下。此时它们之间可以直接通过函数的方式实现功能调用,因此其效率已经与type1 hypervisor不相上下
2.3 半虚拟化
半虚拟化是相对于全虚拟化提出的,其中全虚拟化是指运行在虚拟机上的guest os不需要修改任何代码,其执行方式与运行在真实硬件上完全相同。但是由于guest的每次IO操作都需要返回hypervisor,这中间涉及到异常处理、上下文切换等操作,因此效率比较低。
半虚拟化方案就是为了提高虚拟机IO能力而实现的,它通过修改guest os中驱动的代码,实现与hypervisor之间更加高效的IO交互,从而提升虚拟机的整体性能。下图为其架构框图:
典型的半虚拟化方案为virtio,它定义了guest os驱动与hypervisor中模拟设备之间的io数据通信协议,通过通道的方式管理它们之间的数据传输,从而避免了频繁的IO操作
3 后续工作
由于kvm具有简单、高效等突出优势,因此后面我们将重点介绍arm64架构下的kvm实现方案及其代码流程。kvm只包含了内核态的实现,因此其通常会与qemu配合使用,由qemu提供用户态实现和大部分设备的模拟工作,故在后面的讨论中若涉及用户态的部分,则都以qemu为例
原文链接:https://zhuanlan.zhihu.com/p/528599297