【原创】Linux虚拟化KVM-Qemu分析(二)之ARMv8虚拟化

Read the fucking source code! --By 鲁迅

A picture is worth a thousand words. --By 高尔基

说明:

KVM版本:5.9.1

QEMU版本:5.0.0

工具:Source Insight 3.5, Visio

1. 概述

【原创】Linux虚拟化KVM-Qemu分析(二)之ARMv8虚拟化

KVM虚拟化离不开底层硬件的支持,本文将介绍ARMv8架构处理器对虚拟化的支持,包括内存虚拟化、中断虚拟化、I/O虚拟化等内容;

ARM处理器主要用于移动终端领域,近年也逐渐往服务器领域靠拢,对虚拟化也有了较为完善的支持;

Hypervisor软件,涵盖的功能包括:内存管理、设备模拟、设备分配、异常处理、指令捕获、虚拟异常管理、中断控制器管理、调度、上下文切换、内存转换、多个虚拟地址空间管理等;

本文描述的ARMv8虚拟化支持,对于理解arch/arm64/kvm下的代码很重要,脱离硬件去看Architecture-Specific代码,那是耍流氓;

开始旅程!

2. ARMv8虚拟化 2.1 Exception Level

ARMv7之前的架构,定义了一个处理器的异常处理模式,比如USR, FIQ, IRQ, SVC, ABT, UND, SYS, HYP, MON等,各个异常模式所处的特权级不一样,比如USR模式的特权级就为PL0,对应为用户态程序运行;

处理器的异常模式可以在特权级软件控制下进行主动切换,比如修改CPSR寄存器,也可以被动进行异常模式切换,典型的比如中断来临时切换到IRQ模式;

ARMv7处理器的异常模式如下表所示:

【原创】Linux虚拟化KVM-Qemu分析(二)之ARMv8虚拟化

然鹅,到了ARMv8,Exception Level(EL)取代了特权级,其中处理器的异常模式与Exception Level的映射关系如下图:

【原创】Linux虚拟化KVM-Qemu分析(二)之ARMv8虚拟化

当异常发生时,处理器将改变Exception Level(相当于ARMv7中的处理器模式切换),来处理异常类型;

图中可以看出Hypervisor运行在EL2,而Guest OS运行在EL1,可以通过HVC (Hypervisor Call)指令向Hypervisor请求服务,响应虚拟化请求时就涉及到了Exception Level的切换;

2.2 Stage 2 translation

Stage 2转换与内存虚拟化息息相关,这部分内容不仅包括常规的内存映射访问,还包含了基于内存映射的I/O(MMIO)访问,以及系统内存管理单元(SMMUs)控制下的内存访问。

2.2.1 内存映射

OS在访问物理内存前,需要先建立页表来维护虚拟地址到物理地址的映射关系,看过之前内存管理分析的同学应该熟悉下边这张图,这个可以认为是Stage 1转换:

【原创】Linux虚拟化KVM-Qemu分析(二)之ARMv8虚拟化

当有了虚拟机时,情况就不太一样了,比如Qemu运行在Linux系统之上时,它只是Linux系统的一个用户进程,Guest OS所认为自己访问的物理地址,其实是Linux的用户进程虚拟地址,到最终的物理地址还需要进一步的映射;

Hypervisor可以通过Stage 2转换来控制虚拟机的内存视图,控制虚拟机是否可以访问某块物理内存,进而达到隔离的目的;

【原创】Linux虚拟化KVM-Qemu分析(二)之ARMv8虚拟化

整个地址的映射分成了两个阶段:

Stage 1: VA(Virutal Address) -> IPA(Intermediate Physical Address),操作系统控制Stage 1转换;

Stage 2: IPA(Intermediate Physical Address) -> PA(Physical Address),Hypervisor控制Stage 2转换;

Stage 2转换与Stage 1转换机制很类似,不同点在于Stage 2转换时判断内存类型是normal还是device时,是存放进页表信息里了,而不是通过MAIR_ELx寄存器来判断;

每个虚拟机(VM,Virtual Machine)都会分配一个VMID,用于标识TLB entry所属的VM,允许在TLB中同时存在多个不同VM的转换;

操作系统会给应用程序分配一个ASID(Address Space Identifier),也可以用于标识TLB entry,属于同一个应用程序的TLB entry都有相同的ASID,不同的应用程序可以共享同一块TLB缓存。每个VM都有自己的ASID空间,通常会结合VMID和ASID来同时使用;

Stage 1和Stage 2的转换页表中,都包含了属性的相关设备,比如访问权限,存储类型等,在两级转换的过程中,MMU会整合成一个最终的也有效值,选择限制更严格的属性,如下图:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzfwzz.html