arm linux kvm,Linux虚拟化KVM-Qemu分析(二)之ARMv8虚拟化

Linux虚拟化KVM-Qemu分析(二)之ARMv8虚拟化

Linux虚拟化KVM-Qemu分析(二)之ARMv8虚拟化

Table of Contents

1. 概述

2. ARMv8虚拟化

2.1 Exception Level

2.2 Stage 2 translation

2.2.1 内存映射

2.2.2 MMIO(Memory-Mapped Input/Output)

2.2.3 SMMUs(System Memory Management Units)

2.3 Trapping and emulation of Instructions – 指令的陷印和仿真

2.4 虚拟化中断

2.5 虚拟化通用计时器

2.6 虚拟主机扩展(VHE)

2.7 总结

参考

KVM版本:5.9.1

QEMU版本:5.0.0

《用QEMU构建嵌入式LINUX系统》

《Linux虚拟化KVM-Qemu分析(一)》

《Linux虚拟化KVM-Qemu分析(二)之ARMv8虚拟化》

《在CentOS上进行虚拟化:QEMU、Xen、KVM、LibVirt、oVirt》

《ARM SMMU原理与IOMMU技术(“VT-d” DMA、I/O虚拟化、内存虚拟化)》

ASID:Address Space ID   地址空间标识符

CD:Context Descriptor;  上下文描述符;

CTP:Context-table pointer   上下文表指针

EPT:Extended Page Table 扩展页表

GPA:Guest Phyical Address   客人的实际地址

GVA:Guest Virtual Address   访客虚拟地址

HPA:Host Phyical Address    主机物理地址

IOVA:IO Virtual Address space   IO虚拟地址空间

IPA:Intermediate Phyical Address    中间物理地址

MMIO:Memory-Mapped Input/Output 内存映射IO

NPT:Nested Page Table   嵌套页表

PCID:Process context identifier 进程上下文标识符

PMCG:Performance Monitor Counter Groups 性能监控计数器组

S2TTB:Stage 2 Translate Table Base  第二阶段翻译表库

SMMU:System MMU 系统MMU

SMMUs:System Memory Management Units

VT-d:Virtualization Technology for Direct I/O 直接I/O虚拟化技术

1. 概述

2. ARMv8虚拟化

2.1 Exception Level

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

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

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

2.2 Stage 2 translation

Stage 2转换与内存虚拟化息息相关,这部分内容不仅包括常规的内存映射访问,还包含了基于内存映射的I/O(MMIO)访问(《ARM SMMU原理与IOMMU技术(“VT-d” DMA、I/O虚拟化、内存虚拟化)》),以及系统内存管理单元(SMMUs)控制下的内存访问。

2.2.1 内存映射

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

2.2.2 MMIO(Memory-Mapped Input/Output)

Guest OS认为的物理地址空间,实际是IPA(Intermediate Physical Address中间物理地址)地址空间,就像真实物理机中一样,IPA的地址空间,也分成内存地址空间和I/O地址空间:

2.2.3 SMMUs(System Memory Management Units)

访问内存的另外一种case就是DMA控制器。

非虚拟化下DMA控制器的工作情况如下:

SMMU也叫IOMMU,对IO部件提供MMU功能,虚拟化只是SMMU的一个应用;

Hypervisor可以负责对SMMU进行编程,以便让上层的控制器和虚拟机VM以同一个视角对待内存,同时也保持了隔离性;

2.3 Trapping and emulation of Instructions – 指令的陷印和仿真

Hypervisor也需要具备捕获(trap)和模拟指令的能力,比如当VM中的软件需要配置底层处理器来进行功耗管理或者缓存一致性操作时,为了不破坏隔离性,Hypervisor就需要捕获操作并进行模拟,以便不影响其他的VM。如果设置了捕获某个操作时,当该操作被执行时会向更高一级的Exception Level触发异常(比如Hypervisor为EL2),从而在相应的异常处理中完成模拟。

例子来了:

2.4 虚拟化中断

Virtualizing exceptions – 虚拟化异常

Hypervisor对虚拟中断的处理比较复杂,Hypervisor本身需要机制来在EL2处理中断,还需要机制来将外设的中断信号发送到目标虚拟机VM(或vCPU)上,为了使能这些机制,ARM体系架构包含了对虚拟中断的支持(vIRQs,vFIQs,vSErrors);

处理器只有在EL0/EL1执行状态下,才能收到虚拟中断,在EL2/EL3状态下不能收到虚拟中断;

Hypervisor通过设置HCR_EL2寄存器来控制向EL0/EL1发送虚拟中断,比如为了使能vIRQ,需要设置HCR_EL2.IMO,设置后便会将物理中断发送至EL2,然后使能将虚拟中断发送至EL1;

有两种方式可以产生虚拟中断:

1)在处理器内部控制HCR_EL2寄存器;

2)通过GIC中断控制器(v2版本以上);

其中方式一使用比较简单,但是它只提供了产生中断的方式,需要Hypervisor来模拟VM中的中断控制器,通过捕获然后模拟的方式,会带来overhead,当然不是一个最优解。

让我们来看看GIC吧,看过之前中断子系统系列文章的同学,应该见过下图:

2.5 虚拟化通用计时器

Virtualizing the Generic Timers –  虚拟化通用计时器

先来看一下SoC的内部:

2.6 虚拟主机扩展(VHE)

Virtualization Host Extensions(VHE) – 虚拟主机扩展

先抛出一个问题:通常Host OS的内核都运行在EL1,而控制虚拟化的代码运行在EL2,这就意味着传统的上下文切换,这个显然是比较低效的;

VHE用于支持type-2的Hypervisor,这种扩展可以让内核直接跑在EL2,减少host和guest之间共享的系统寄存器数量,同时也减少虚拟化的overhead;

VHE由系统寄存器HCR_EL2的E2H和TGE两个比特位来控制,如下图:

2.7 总结本文涉及到内存虚拟化(stage 2转换),I/O虚拟化(包含了SMMU,中断等),中断虚拟化,以及指令trap and emulation等内容;

基本的套路就是请求虚拟化服务时,路由到EL2去处理,如果有硬件支持的则硬件负责处理,否则可以通过软件进行模拟;

尽管本文还没涉及到代码分析,但是已经大概扫了一遍了,大体的轮廓已经了然于胸了,说了可能不信,我现在都有点小兴奋了;

参考

《ArmV8-A virtualization.pdf》

《vm-support-ARM-may6-2019.pdf》

《aarch64_virtualization_100942_0100_en.pdf》

《ARM Cortex-A Series Programmer’s Guide for ARMv8-A》

《arm64: Virtualization Host Extension support》

Linux虚拟化KVM-Qemu分析(二)之ARMv8虚拟化相关教程

linux内核协议栈 TCP数据接收之快速路径处理

linux内核协议栈 TCP数据接收之快速路径处理 目录 1快慢路劲分流 1.1 首部预测标记pred_flags 1.1.1 首部预测标记的设定 1.2__tcp_fast_path_on 调用 1.2.1 客户端处理SYN+ACK报文 tcp_rcv_synsent_state_process 1.3tcp_fast_path_on 调用 1.3.1 服务器端收

linux用户相关操作

linux用户相关操作 linux用户相关操作 1. 创建用户 2. 设置密码 3. 切换用户 4. 修改用户信息 5. 添加和删除附加组 5. 删除用户 1. 创建用户 useradd创建(添加)用户 useradd命令选项: 选项 说明 -m 自动创建用户主目录,主目录的名字就是用户名 -g 指定用户所

Linux虚拟化KVM-Qemu分析(三)之KVM源码(1)kvm_init

Linux虚拟化KVM-Qemu分析(三)之KVM源码(1)kvm_init Table of Contents 1. 概述 2. KVM初始化 2.1kvm_arch_init 2.1.1init_hyp_mode 2.1.2init_subsystems 2.2misc_register 3. 总结 KVM版本:5.9.1 QEMU版本:5.0.0 《用QEMU构建嵌入式LINUX系统》 《Linu

Linux网络管理之三从windows访问Linux共享打印

Linux网络管理之三:从windows访问Linux共享打印 环境: 客户端为windows xp(10.0.0.10); 打印服务器为FC7(10.0.0.100)。 要求: 客户端可以通过FC7上的打印机进行网络打印,并可进行基于Web的远程管理。 实现过程: 一、在FC7上安装SMB共享打印机 1、

Linux IPC——system v 共享内存

Linux IPC——system v 共享内存 有关函数 shmget 创建一个共享内存对象并返回共享内存标识符或得到一个共享内存标识符 原型:int shmget(key_t key,size_t size,int shmflg); 返回值:失败返回-1,成功返回标识 参 数: key:一般由系统调用fotk获得,为0(IP

Linux信号详解

Linux信号详解 每个信号都有一个编号和宏定义,在signal.h中可以找到 可通过kill -l 命令查看所有信号 1-31为普通信号 信号的 产生 通过终端按键产生 用户通过键盘按键,如ctrl+c给前台进程发送2号信号SIGINT,该信号的默认动作为终止进程,当进程收到此信号

Linux软件卸载

Linux软件卸载 软件卸载 1. 软件卸载的介绍 2. deb 文件格式卸载 3. apt-get 方式卸载 1. 软件卸载的介绍 Ubuntu软件卸载有两种方式: 离线安装包的卸载(deb 文件格式卸载) 在线安装包的卸载(apt-get 方式卸载) 2. deb 文件格式卸载 命令格式: sudo dpkg –r

linux下pureftp服务器的搭建

linux下pureftp服务器的搭建 Pure-FTPd 是一款免费(BSD)的,安全的,高质量和符合标准的FTP服务器。 侧重于运行效率和易用性。 它提供了简单的答案,他满足了大众化的需求,包括普通用户以及主机供应商们。 Pure-FTPd 安全性 pure – ftpd 得到了充分的支持

文章知识点与官方知识档案匹配,可进一步学习相关知识CS入门技能树Linux入门初识Linux24731 人正在系统学习中 相关资源:漂浮截图工具-教育工具类资源

来源:浮梦绝离殇

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年4月10日
下一篇 2021年4月10日

相关推荐