当前位置: 首页 > news >正文

【ARM】armv8的虚拟化深度解读

Type-1 hypervisor

Type-1虚拟化也叫做Bare metal, standalone, Type1
在这里插入图片描述

Type2 hypervisor

Type-2虚拟化也叫做hosted, Type-2

VM和vCPU(虚拟机和虚拟cpu)

在一个VM(虚拟机)中有多个vCPU,多个vCPU可能属于同一个Vritual Processor。
在这里插入图片描述
EL2负责管理虚拟机VM的以下功能:
• Stage 2 translation
• EL1/0 instruction and register access trapping
• Virtual exception generation

VMIDs

  1. 每个 VM 都分配有一个虚拟机标识符 (VMID) 。 VMID 用于标记translation lookaside buffer(TLB) 条目,以标识每个entry属于哪个 VM。 此标记允许多个不同 VM 的翻译同时出现在 TLB 中
  2. VMID 存储在 VTTBR_EL2 中,可以是 8 位或 16 位。 VMID 由VTCR_EL2.VS 位控制。 对 16 位 VMID 的支持是可选的,并且是在 Armv8.1-A 中添加的。
  3. EL2 和 EL3 翻译机制的翻译没有用 VMID 标记,因为它们不受第 2 阶段翻译的约束。

没有虚拟化时,在EL0的translation regime 中有多个应用程序,每个应用程序都有自己独立的地址空间,如果两个应用程序的虚拟地址相同,那么在缓存到TLB中时就会发生冲突,因此我们要用ASID来标志。每个应用程序的ASID都不一样,在缓存到快表时会把程序的ASID也缓存进快表。

VMID interaction with ASIDs

VMID和ASID的结合使用

  1. TLB entry也可以使用地址空间标识符 (ASID) 进行标记。 操作系统为应用程序分配了一个 ASID,该应用程序中的所有 TLB 条目都使用该 ASID 进行标记。 这意味着不同应用程序的 TLB entry能够共存于TLB 中,而没有一个应用程序使用属于不同应用程序的 TLB entry的可能性。
  2. 每个 VM 都有自己的 ASID 命名空间。 例如,两个 VM 可能都使用 ASID5,但它们将它们用于不同的事情。 ASID 和 VMID 的组合很重要。

VM访问外设的方式

VM访问外设的方式有两种: physical peripherals 和 virtual peripherals. 前者是直接将IPA映射到真实的物理外设,后者则只是一个IPA内存,并不是真实的外设region,后者会触发一个mmu fault,然后在hypervisor的异常中断中去模拟该外设。

Hypervisor模拟外设原理

• 要模拟外设,管理程序不仅需要知道访问了哪个外设,还需要知道访问了该外设中的哪个寄存器、访问是读还是写、访问的大小以及用于传输数据的寄存器 .
• 异常模型引入了 FAR_ELx 寄存器。 在处理stage 1 fault时,这些寄存器报告触发异常的虚拟地址。 虚拟地址对hypervisor没有帮助,因为hypervisor通常不知道来guest os如何配置其虚拟地址空间。 对于stage 2 fault,还有一个额外的寄存器 HPFAR_EL2,它报告中止地址的 IPA。 由于 IPA 空间由hypervisor控制,因此它可以使用此信息来确定需要模拟的寄存器。
• 异常模型显示了 ESR_ELx 寄存器如何报告有关异常的信息。 对于触发stage 2 fault的单个通用寄存器加载或存储,提供了额外的综合信息。 该信息包括访问的大小和源或目标寄存器,并允许管理程序确定对虚拟外围设备进行的访问类型。

其它Master对内存的访问

在这里插入图片描述
在左边情况下,Processor是知道虚拟地址以及物理地址的,在建页表时就把VA和PA的关系搭建起来了。DMA也知道PA。
但是在EL2enable下,Guest OS只支持VA和IPA,但是DMA需要知道PA,而Processor不知道PA,就是在Linux driver程序中对DMA Controller进行编程,让DMA去干活。然后在Linux driver中看到的都是VA和IPA,它是无法看到真实的PA,所以在此中情况下,Linux driver程序就无法对DMA Controller进行编程了。

解决这个问题需要加一个SMMU
在这里插入图片描述
因为他么使用共同的页表,因此只要IPA相同,翻译出来的PA必然相同。

Trapping and emulation of instructions

WFI指令就是进入低功耗状态,进入stand by模式。在vCPU0的视角下执行了WFI进入低功耗,但是实际是这条指令被Trap到EL2,通过软件又转到了vCPU1中。
在这里插入图片描述

lazy context switching 和 context switching

  1. traps也可以用作lazy context switching的一部分。 例如,操作系统通常会在启动期间初始化内存管理单元(MMU) 配置寄存器(TTBR_EL1、TCR_EL1 和 MAIR_EL1),然后不会再次对它们重新编程。 管理程序可以使用它来优化其上下文切换例程,方法是仅在上下文切换时恢复寄存器而不保存它们。
  2. 然而,操作系统可能会做一些不寻常的事情并在启动后重新编程寄存器。 为避免这导致任何问题,管理程序可以设置 HCR_EL2.TVM trap。 此设置会导致对 MMU 相关寄存器的任何写入都会在 EL2 中生成trap,
    从而允许管理程序检测它是否需要更新其保存的这些寄存器的副本。
  3. 解释: 这两段其实就是说,对于系统寄存器,在每次切换的时候会lazy context switching。但是对于MMU寄存器,可能会在运行时被修改,所以针对MMU寄存器的控制,可以设置 HCR_EL2.TVM,这样的话在guest os写MMU寄存器的时候,就会产生trap异常)
  4. 注: lazy context switching 和 context switching的区别:
    (1)前者,开机的时候记录下每个vcpu的context,当vcpu切换到VM时,则恢复这个vContext
    (2)后者,每次的VM切换,都伴随着vContext的save和restore

MIDR and MPIDR

两个寄存器
• 使用traps来虚拟化操作需要大量计算。 该操作向 EL2 生成trapped异常,管理程序确定所需的操作,对其进行模拟,然后返回给guest os。 诸如 ID_AA64MMFR0_EL1 之类的功能寄存器不被操作系统频繁访问。 这意味着当将对这些寄存器的访问捕获到管理程序中以模拟读取时,计算是可以接受的。
• 对于更频繁访问的寄存器,或在性能关键代码中,你可能希望避免此类计算频繁。 这些寄存器及其值的示例包括:
MIDR_EL1. The type of processor, for example Cortex-A53
MPIDR_EL1. The affinity, for example core 1 of processor 2
• 管理程序可能希望来guest os查看这些寄存器的虚拟值,而不必捕获每个单独的访问。 对于这些寄存器,该架构提供了一种捕获的替代方法:
VPIDR_EL2. This is the value to return for EL1 reads of MIDR_EL1.
VMPIDR_EL2. This is the value to return for EL1 reads of MPIDR_EL1
• 管理程序可以在进入 VM 之前设置这些寄存器。 如果在 VM 中运行的软件读取 MIDR_EL1 或MPIDR_EL1,硬件将自动返回虚拟值,无需trapped。
• VMPIDR_EL2 和 VPIDR_EL2 没有定义的复位值。 在第一次进入 EL1 之前,它们必须通过启动代码进行初始化。 这一点尤其重要。

虚拟中断

在hypervisor写HCR_EL2寄存器,直接产生虚拟中断。

• HCR_EL2 中有三个位控制虚拟中断的生成:
VI = Setting this bit registers a vIRQ.
VF = Setting this bit registers a vFIQ.
VSE = Setting this bit registers a vSError

• 这种机制并没有产生vIRQ/vFIQ/vSError信号,但是写这些比特后,等效于gic断言了一个中断,并发送vIRQ/vFIQ/vSError信号到vCPU.
• 这种机制使用简单,但缺点是它只提供了一种产生中断本身的方式。 Hypervisor需要替VM读写gic寄存器。 这种hypervisor软件中的捕获和模拟gic操作会带来额外的开销。

使用 GICv2或更高版本的中断控制器。支持vIRQ/vFIQ/vSError信号。

hypervisor可以将vCPU interface映射到VM,允许该 VM 中的软件直接与 GIC 通信。 这种方式的好处是hypervisor只需要设置虚拟接口,不需要模拟。 这种方法减少了执行需要被trapped在 EL2 的次数,因此减少了虚拟化中断的开销。

SCR比特位

IMO

IMO=0,routing到EL1;IMO=1,物理中断永远被taken到EL2。

TGE

表示当前是Guest OS还是Host OS,
如果TGE=0,表示是Guest OS;如果TGE=1,表示是Host OS;

E2H

Host OS的EL2是否开启,0表示没有开启,1表示enable

TMO

TMO 表示中断的路线模型

Virtualizing the Generic Timers

在这里插入图片描述
在 4 毫秒的物理时间或wall-clock time,之后,每个 vCPU 已经运行了 2 毫秒。 如果 vCPU0 在 T=0 时将其比较器设置为在 3ms 后生成中断,您是否希望中断触发?
或者,您是否想要在虚拟时间 2 毫秒(即 vCPU 所经历的时间)或wall-clock time的 2 毫秒之后中断?
Arm 架构提供了两种能力,具体取决于虚拟化的用途。 在 vCPU 上运行的软件可以访问两个计时器:
• EL1 Physical Timer
EL1 物理计时器与系统计数器模块生成的计数进行比较。 使用此计时器可提wall-clock time
• EL1 Virtual Timer
EL1 虚拟计时器与虚拟计数进行比较。 虚拟计数是物理计数减去偏移量。 管理程序在寄存器中指定当前调度的 vCPU 的偏移量。 这允许它在未安排 vCPU 运行时隐藏时间的流逝。
在这里插入图片描述

Re-directing register accesses (重新定位寄存器访问)

在启用VHE的系统上,一个hosted VM, 它的内核是跑在EL2上的,它访问的系统寄存器,不再应该是XXX_EL1,应该是XXX_EL2。例如对于mmu的配置,访问的是TTBR0_EL2,而不是TTBR0_EL1。要在EL2上运行等效EL1的操作,那么需要将EL1寄存器重定向到EL2寄存器。设置E2H将实现此需求.
然而,这种重定向给我们留下了一个新问题。 管理程序仍然需要访问真正的_EL1 寄存器,以便它可以实现任务切换。 为了解决这个问题,引入了一组带有 xxx_EL12 或 xxx_EL02 后缀的新寄存器别名。 当在 EL2 上使用时,E2H==1,它们可以访问 EL1 寄存器以进行上下文切换。 您可以在下图中看到这一点

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 神经网络激活函数
  • API代理是什么?解读其原理与作用
  • 累加求和-C语言
  • [大语言模型-论文精读] Diffusion Model技术-通过时间和空间组合扩散模型生成复杂的3D人物动作
  • 大模型prompt先关
  • 【网络安全】密码学的新进展
  • 大模型之基准测试集(Benchmark)-给通义千问2.0做测评的10个权威测基准测评集
  • windows使用JEnv实现一键临时或全局切换java版本
  • WebGL动画与交互
  • Maya学习笔记:物体的层级关系
  • 若依生成主子表
  • Vue3:v-model实现组件通信
  • numpy.rollcirculant
  • SuperMap GIS基础产品FAQ集锦(20240923)
  • Python 字符串的常见方法
  • 「译」Node.js Streams 基础
  • 【React系列】如何构建React应用程序
  • Angular 2 DI - IoC DI - 1
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • in typeof instanceof ===这些运算符有什么作用
  • JavaScript创建对象的四种方式
  • Leetcode 27 Remove Element
  • nodejs调试方法
  • orm2 中文文档 3.1 模型属性
  • Python十分钟制作属于你自己的个性logo
  • 基于Android乐音识别(2)
  • 技术:超级实用的电脑小技巧
  • 我是如何设计 Upload 上传组件的
  • - 转 Ext2.0 form使用实例
  • 转载:[译] 内容加速黑科技趣谈
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • scrapy中间件源码分析及常用中间件大全
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • # windows 安装 mysql 显示 no packages found 解决方法
  • #QT(TCP网络编程-服务端)
  • $.ajax()
  • (19)夹钳(用于送货)
  • (Charles)如何抓取手机http的报文
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (四) 虚拟摄像头vivi体验
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • .NET中winform传递参数至Url并获得返回值或文件
  • .secret勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复
  • [ 2222 ]http://e.eqxiu.com/s/wJMf15Ku
  • [145] 二叉树的后序遍历 js
  • [16/N]论得趣
  • [BZOJ3223]文艺平衡树
  • [C#] 基于 yield 语句的迭代器逻辑懒执行
  • [C#]使用深度学习算法opencvsharp部署RecRecNet广角图像畸变矫正校正摄像广角镜头畸变图像
  • [C++]拼图游戏
  • [C++数据结构之看懂就这一篇]图(上)
  • [Firefly-Linux] RK3568修改控制台DEBUG为普通串口UART