【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
- 每个 VM 都分配有一个虚拟机标识符 (VMID) 。 VMID 用于标记translation lookaside buffer(TLB) 条目,以标识每个entry属于哪个 VM。 此标记允许多个不同 VM 的翻译同时出现在 TLB 中
- VMID 存储在 VTTBR_EL2 中,可以是 8 位或 16 位。 VMID 由VTCR_EL2.VS 位控制。 对 16 位 VMID 的支持是可选的,并且是在 Armv8.1-A 中添加的。
- EL2 和 EL3 翻译机制的翻译没有用 VMID 标记,因为它们不受第 2 阶段翻译的约束。
没有虚拟化时,在EL0的translation regime 中有多个应用程序,每个应用程序都有自己独立的地址空间,如果两个应用程序的虚拟地址相同,那么在缓存到TLB中时就会发生冲突,因此我们要用ASID来标志。每个应用程序的ASID都不一样,在缓存到快表时会把程序的ASID也缓存进快表。
VMID interaction with ASIDs
VMID和ASID的结合使用
- TLB entry也可以使用地址空间标识符 (ASID) 进行标记。 操作系统为应用程序分配了一个 ASID,该应用程序中的所有 TLB 条目都使用该 ASID 进行标记。 这意味着不同应用程序的 TLB entry能够共存于TLB 中,而没有一个应用程序使用属于不同应用程序的 TLB entry的可能性。
- 每个 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
- traps也可以用作lazy context switching的一部分。 例如,操作系统通常会在启动期间初始化内存管理单元(MMU) 配置寄存器(TTBR_EL1、TCR_EL1 和 MAIR_EL1),然后不会再次对它们重新编程。 管理程序可以使用它来优化其上下文切换例程,方法是仅在上下文切换时恢复寄存器而不保存它们。
- 然而,操作系统可能会做一些不寻常的事情并在启动后重新编程寄存器。 为避免这导致任何问题,管理程序可以设置 HCR_EL2.TVM trap。 此设置会导致对 MMU 相关寄存器的任何写入都会在 EL2 中生成trap,
从而允许管理程序检测它是否需要更新其保存的这些寄存器的副本。 - 解释: 这两段其实就是说,对于系统寄存器,在每次切换的时候会lazy context switching。但是对于MMU寄存器,可能会在运行时被修改,所以针对MMU寄存器的控制,可以设置 HCR_EL2.TVM,这样的话在guest os写MMU寄存器的时候,就会产生trap异常)
- 注: 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 寄存器以进行上下文切换。 您可以在下图中看到这一点
相关文章:

【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…...

9/24作业
1. 分文件编译 分什么要分文件编译? 防止主文件过大,不好修改,简化编译流程 1) 分那些文件 头文件:所有需要提前导入的库文件,函数声明 功能函数:所有功能函数的定义 主函数:main函数&…...

Leetcode 106. 从中序与后序遍历序列构造二叉树
给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1: 输入:inorder [9,3,15,20,7], postorder [9,15,7,20,3] 输出:[3…...

针对考研的C语言学习(定制化快速掌握重点1)
1.printf函数的几个要点 printf函数中所有的输出都是右对齐的,除非在%后面添加负号,则表示左对齐 #include<stdio.h> int main() {int num 10;int nums 100;float f 1000.2333333333;printf("%3d\n", nums);//%3d表示输出的总宽度至…...
【大数据入门 | Hive】DDL数据定义语言(数据库DataBase)
1. 数据库(DataBase) 1.1 创建数据库 语法: CREATE DATABASE [IF NOT EXISTS] database_name [COMMENT database_comment] [LOCATION hdfs_path] [WITH DBPROPERTIES (property_nameproperty_value, ...)]; 案例: (1)创建一个…...

CNVD漏洞和证书挖掘经验总结
前言 本篇文章主要是分享一下本人挖掘CVND漏洞碰到的一些问题,根据过往成功归档的漏洞和未归档的漏洞总结出的经验,也确实给审核的大佬们添了很多麻烦(主要真的没人教一下,闷着头尝试犯了好很多错误,希望各位以后交一个…...
阿里rtc旁路推流TypeScript版NODE运行
阿里云音视频服务云端录制typescript版本; 编译后可以使用 node index.js运行 package.json 版本 // npm install --save alicloud/rtc201801112.3.0 "alicloud/rtc20180111": "^2.3.0",引入 import Client, { StartCloudRecordRequest, StopCloudRecord…...
计算机书籍分享
0.简介 数据库系统概念、深入理解计算机系统、领域驱动设计、Linux高性能服务器编程 高清版本pdf 1.链接 数据库系统概念: 链接: https://pan.baidu.com/s/17zz7QFevV2Eni9qHJyLEGA 提取码: wfrx 深入理解计算机系统 链接: https://pan.baidu.com/s/19yiJG8GqHJR…...
处理ASAM-MDF格式的开源python库asammdf
asammdf是一个强大的Python库,专为处理ASAM(Association for Standardization of Automation and Measuring Systems)MDF(Measurement Data Format)文件而设计。MDF是一种用于存储测量和诊断数据的标准格式,…...
物业管理小程序开发
物业小程序的开发是一个综合性的项目,旨在提升物业管理效率和增强业主的服务体验。以下是关于物业小程序开发的一些关键方面: 一、需求分析 目标用户:识别主要用户群体,包括业主、租户、物业管理人员等。 功能需求: 物…...
【Vue】Pinia
系列文章目录 第八章 Pinia 文章目录 系列文章目录前言一、安装和配置:二、基本使用三、一个更真实的例子 前言 Pinia是Vue.js应用程序的状态管理库。它提供了一种简单,轻量级的解决方案,用于在Vue应用程序中管理和维护状态。Pinia库的特点…...

帕金森病患者的生命长度:科学管理与乐观心态是关键
在快节奏的现代生活中,健康成为了我们最宝贵的财富之一。然而,当“帕金森病”这个名词悄然进入我们的视野时,不少人心中难免会涌起一丝不安与担忧。帕金森病,作为一种常见的神经系统退行性疾病,确实给患者的日常生活带…...
详解Linux中cat命令
在 Linux 命令的世界中,cat 命令就像是一位多才多艺的艺术家,它能够将文本文件的美妙旋律编织在一起,或者单独演奏它们的每一个音符。下面,让我们以一种充满情感的方式,用 Markdown 格式来探索 cat 命令的多种用途。 …...

Mysql高级篇(中)—— SQL优化之查询截取分析
SQL优化之查询截取分析 一、慢查询日志(1)简述(2)如何开启(3)慢查询日志分析工具介绍(了解)(4)官方工具 mysqldumpslow简述如何使用 二、SHOW PROCESSLIST三、(了解&…...
企业如何制作一个官方网站?
随着实体宣传的减弱,提高线上的宣传是新式的宣传方式,那么企业搭建网站成为线上宣传的重要途径。企业如何去搭建网站呢?如何拥有一个专业的网站来展示企业文化和企业销售产品?今天我给大家带来干货:如何一步步构建自己…...

游戏开发2025年最新版——八股文面试题(unity,虚幻,cocos都适用)
1.静态合批与动态合批的原理是什么?有什么限制条件?为什么?对CPU和GPU产生的影响分别是什么? 原理:Unity运行时可以将一些物体进行合并,从而用一个描绘调用来渲染他们,就是一个drawcall批次。 限…...

如何查看线程
1、首先找到我们的电脑安装jdk的位置,这里给大家展示一下博主本人的电脑jdk路径下的jconsole位置。 2、 ok,那么找到这个jconsole程序我们直接双击打开就可以查看我们电脑的本地进程: jconsole 这里能够罗列出你系统上的 java 进程࿰…...

详细分析Spring的动态代理机制
文章目录 1. JDK动态代理和CGLIB动态代理的区别1.1 适用范围1.2 生成的代理类1.3 调用方式 2. 问题引入3. 创建工程验证 Spring 默认采用的动态代理机制3.1 引入 Maven 依赖3.2 UserController.java3.3 UserService.java3.4 UserServiceImpl.java(save方法添加了Tra…...
Redis数据类型,使用场景,事物及分布式锁
文章目录 关于Redis1.常用数据类型1.字符串(String)2.哈希(Hash)3.列表(List)4.集合(Set)5.有序集合(Sorted Set)6.位图(Bitmap)7.超日…...

目标检测系列(一)什么是目标检测
目录 一、相关名词解释 二、目标检测算法 三、目标检测模型 四、目标检测应用 五、目标检测数据集 六、目标检测常用标注工具 一、相关名词解释 关于图像识别的计算机视觉四大类任务: 分类(Classification):解决“是什么&…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...

工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...

有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...

用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...