LoongArch KVM
概况
依据LoongArch CPU虚拟化硬件特性在Linux内核中实现了KVM虚拟化软件处理流程。目前可以配合用户态QEMU程序正常运行LoongArchKVM虚拟机。
LoongArch KVM虚拟化组件包含用户态QEMU程序,内核态Linux KVM模块,以及物理硬件支持。
LoongArch KVM虚拟化整体运行流程如图所示首先用户态OEMU创建KVM虚拟机并初始化运行环境,然后进入内核态KVM,让CPU在虚拟化模式下运行虚拟机程序。
当vCPU触发异常时会退出到内核态KVM来处理异常如果KVM能够处理则重新进入虚拟化模式运行,否贝I再退出到用户态处理,处理完成后返回KVM再进入虚拟机。
目前在Linux内核中提交的补丁为LoongArch KVM的基础版本,包含CPU虚拟化和内存虚拟化。后续会进一步完善如中断控制器下移至内核态、向量指令支持、hypercall指今支、硬件PMU支持等功能
CPU虚拟化
CPU硬件模型
LoongArch CPU拥有host模式和guest模式,并且两种模式下有内核态和用户态,在guest模式下切换内核态时并不会退出到host模式下。
host模式和guest模式共用通用寄存器r0-r31,而控制状态寄存器CSR在两种模式下各自拥有一份。
CPU虚拟化软件流程
内存虚拟化
MMU硬件模型
内存虚拟化采用两级MMU
- 一级MMU
- GVA --> GPA
- 发生缺页异常时造成虚拟机内部异常
- 二级MMU
- GPA -->HPA
- 发生缺页异常时造成物理机KVM异常
两级页表支持的规格为:
- 虚拟地址空间宽度48位
- 页大小为4KB,页内地址12位
- 可支持4级页表,每级页表索引占9位
内存虚拟化软件流程
外设虚拟化
虚拟外设地址空间
虚拟外设模拟流程
为了减少设备模拟时内核态和用户态的切换开销,提高LonngArch KVM运行效率,后续会提交补丁,将中断控制器下移至KVM模拟。