说明:
- KVM版本:5.9.1
- QEMU版本:5.0.0
- 工具:Source Insight 3.5, Visio
1. 概述
- 本文围绕ARMv8 CPU的虚拟化展开;
- 本文会结合Qemu + KVM的代码分析,捋清楚上层到底层的脉络;
- 本文会提供一个Sample Code,用于类比Qemu和KVM的关系.
先来两段前戏。
1.1 CPU工作原理
AI的世界,程序的执行不再冰冷,CPU对a.out说,hello啊,world已经ok啦,下来return吧!
既然要说CPU的虚拟化,那就先简要介绍一下CPU的工作原理:
- CPU的根本任务是执行指令,我们常说的取指-译码-执行-访存-写回,就是典型的指令Pipeline操作;
- 从CPU的功能出发,可以简要分成三个逻辑模块:
- Control Unit:CPU的指挥中心,协调数据的移动;
- ALU:运算单元,执行CPU内部所有的计算;
- Register:寄存器和Cache,都算是CPU内部的存储单元,其中寄存器可用于存储需要被译码和执行的指令、数据、地址等;
- CPU从内存中读取指令进行译码并执行,执行的过程中需要去访问内存中的数据,CPU内部的寄存器可以暂存中间的指令和数据等信息,通常说的CPU的context指的就是CPU寄存器值;
在硬件支持虚拟化之前,Qemu纯软件虚拟化方案,是通过tcg(tiny code generator)的方式来进行指令翻译,翻译成Host处理器架构的指令来执行。硬件虚拟化技术,是让虚拟机能直接执行在Host CPU上,让Host CPU直接来执行虚拟机,结合CPU的实际工作原理,应该怎么来理解呢?来张图:
- CPU通过pc寄存器获取下一条执行指令,进行取指译码执行等操作,因此给定CPU一个Context,自然就能控制其执行某些代码;
- CPU的虚拟化,最终目标让虚拟机执行在CPU上,无非也是要进行CPU的Context切换,控制CPU去执行对应的代码,下文会进一步阐述;
既然都讲CPU了,那就捎带介绍下ARMv8的寄存器吧:
- 通用寄存器:
- 图中描述的是EL3以下,AArch32与AArch64寄存器对应关系;
- AArch64中,总共31个通用寄存器,64bit的为X0-X30,32bit的为W0-W30;
- 特殊用途寄存器: