【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 寄存器以进行上下文切换。 您可以在下图中看到这一点

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1542102.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

java-----异常

目录 异常:代表程序出现的问题 运行时异常和编译时异常的区别? 异常的作用: 异常的处理方式: 异常中常见的方法: 抛出异常: 自定义异常: 异常:代表程序出现的问题 Exception:叫做异常,代表程序可能出现的问题。…

【alluxio编译报错】Some files do not have the expected license header

Some files do not have the expected license header 快捷导航 在开始解决问题之前,大家可以通过下面的导航快速找到相关资源啦!💡👇 快捷导航链接地址备注相关文档-ambaribigtop自定义组件集成https://blog.csdn.net/TTBIGDA…

【JavaScript】LeetCode:46-50

文章目录 46 翻转二叉树47 对称二叉树48 二叉树的直径49 二叉树的层序遍历50 将有序数组转换为二叉搜索树 46 翻转二叉树 递归前序遍历 / 后序遍历,这里给出前序遍历的代码。遍历节点,交换左右子树。 /*** Definition for a binary tree node.* functio…

vue3快速入门(看心情更新)

vue3初始化工程目录 编写一个App .vscode下的extensions.json 配置插件的地方 public 页签图标 src 你的.vue文件都是在这个目录下的 .gitgnore 忽略文件 env.d.ts 让Ts去识别一些文件 index.html 入口文件 vite.config.ts 整个工程的配置文件 .vue文件中可以写的内容 template…

Windows安装Oracle11gR2(图文教程)

本章教程,记录在Windows10上安装Oracle11gR2过程。 一、下载安装包 通过网盘分享的文件:oracle11g 链接: https://pan.baidu.com/s/15ilciQ5NlKWtClklmdAH_w?pwds4dd 提取码: s4dd 二、下载并解压文件 将网盘中的安装包文件下载到本地,在此之…

心觉:感恩何其重要,感恩之心如何培养

Hi,我是心觉,与你一起玩转潜意识、脑波音乐和吸引力法则,轻松掌控自己的人生! 挑战每日一省写作177/1000天 上篇文章我们讲了保持感恩之心,可以吸引更多的机会和财富 但是现实中很多人是缺乏感恩之心 这是由于他们…

c++day3 手动封装一个顺序表(SeqList),分文件编译实现

要求: 有私有成员:顺序表数组的起始地址 ptr、 顺序表的总长度:size、顺序表的实际长度:len 成员函数:初始化 init(int n) 判空:empty 判满:full 尾插:push_back 插入:insert&…

进程间的通信4 共享内存

共享内存 1.共享内存简介 共享内存是将分配的物理空间直接映射到进程的用户虚拟地址空间中,减少数据在内核空间缓存共享内存是一种效率较高的进程间通讯的方式在 Linux 系统中通过 ipcs -m 查看所有的共享内存 共享内存模型图 2.共享内存的创建 1.函数头文件 #…

【如何在 Windows 10 主机上通过 VMware 安装 Windows 11 虚拟机,并共享主机网络】

环境说明 主机操作系统:Windows 10虚拟机操作系统:Windows 11虚拟机软件:VMware 步骤一:确保主机(Windows 10)网络连接正常 启动网络加速软件:在主机上启动软件,确保主机可以正常访…

JavaEE: 深入探索TCP网络编程的奇妙世界(三)

文章目录 TCP核心机制TCP核心机制三: 连接管理建立连接(三次握手)断开连接(四次挥手)三次握手/四次挥手 流程简图 TCP核心机制 书接上文~ TCP核心机制三: 连接管理 建立连接(三次握手),断开连接(四次挥手). 这里的次数指的是网络通信的次数,挥手/握手是形象的比喻(handshake…

基于SpringBoot+Vue的智慧物业管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 精品专栏:Java精选实战项目源码、Python精…

SpringBoot3核心特性-核心原理

目录 传送门前言一、事件和监听器1、生命周期监听2、事件触发时机 二、自动配置原理1、入门理解1.1、自动配置流程1.2、SPI机制1.3、功能开关 2、进阶理解2.1、 SpringBootApplication2.2、 完整启动加载流程 三、自定义starter1、业务代码2、基本抽取3、使用EnableXxx机制4、完…

SaaS软件的配置化平台是如何实现个性化定制的?

SaaS(Software as a Service,软件即服务)是一种通过互联网提供软件的模式,用户无需安装和维护任何复杂的基础设施,只需通过网络连接即可使用软件。SaaS 供应商负责软件的维护、升级和可用性,用户则通过订阅…

智能体时代,AI正从“神坛”走向“人间”

从通用大模型到行业大模型:AI智能体引领新风口 在人工智能领域,一场深刻的变革正悄然发生。从昔日高高在上的通用大模型,到如今愈发接地气的行业大模型,AI的风向标已经鲜明地指向了AI智能体(AI Agent)&…

APO v0.4.0 发布:新增影响面分析;新增调用数据库指标;优化告警事件关联展示

APO 新版本 v0.4.0 正式发布!本次更新主要包含以下内容: 新增影响面分析,识别服务端点对服务入口的影响 服务入口是指业务被访问时调用的第一个服务端点,在调用拓扑图中处于最上游。服务入口直接反映了系统对外提供服务的状态&a…

基于SpringBoot+Vue+MySQL的手机销售管理系统

系统展示 用户前台界面 管理员后台界面 商家后台界面 系统背景 随着智能手机的普及和市场竞争的日益激烈,手机销售行业面临着前所未有的挑战与机遇。传统的手工记录和简单的电子表格管理方式已难以满足现代手机销售业务的需求,销售数据的混乱和管理效率低…

(done) 声音信号处理基础知识(2) (重点知识:pitch)(Sound Waveforms)

来源:https://www.youtube.com/watch?vbnHHVo3j124 复习物理知识: 声音由物体的振动产生 物体振动会导致空气分支振荡 某一处的空气气压变化会创造一个波 声音是机械波 空气的振荡在空间中传递 能量从空间中的一个点到另一个点 机械波需要媒介&#x…

DBNet 博客转载

论文地址:https://arxiv.org/abs/1911.08947 最后的文字概率还需要扩张d https://blog.csdn.net/weixin_46505265/article/details/134836652 https://paddlepedia.readthedocs.io/en/latest/tutorials/computer_vision/OCR/OCR_Detection/DBNet.html

ThreadLocal与AsyncLocal

简介 ThreadLocal 用于在多线程环境中创建线程局部变量,可以让每个线程独立地访问自己的变量副本,互不影响。 而 AsyncLocal 是 ThreadLocal 的异步版本,专门用于异步编程场景,在异步操作中它可以正确处理上下文切换。 ThreadLo…

【Python】探索 Elpy:Emacs 中的 Python 开发环境

可以短时间不开心,但别长时间不清醒。 对于使用 Emacs 编辑器的 Python 开发者来说,Elpy 是一个强大的集成开发环境(IDE),它通过整合多个 Emacs Lisp 和 Python 包,提供了一套完整的 Python 编程支持。本文…