【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):解决“是什么&…...

STM32CubeIDE | 使用HAL库的ADC读取内部传感器温度
1、cubemx配置 1.1、系统配置 1.2、GPIO配置 PB2设置为“GPIO_Output” user label设置为“LED” 1.3、串口配置 模式选择为“Asynchronous”,其他默认 1.4、时钟树配置 全部保持默认 2、ADC配置 通道选择“Temperature Sensor Channel”,其他默认 …...

茶思屋直播|TinyEngine+AI:聚焦主航道,在实践中探索低代码技术黑土地
低代码引擎使能开发者定制低代码平台。它是低代码平台的底座,提供可视化搭建页面等基础能力,既可以通过线上搭配组合,也可以通过cli创建个人工程进行二次开发,实时定制出自己的低代码平台。适用于多场景的低代码平台开发ÿ…...

Ansible流程控制-条件_循环_错误处理_包含导入_块异常处理
文章目录 Ansible流程控制介绍1. 条件判断2. 循环3. 循环控制4. 错误处理5. 包含和导入6. 块和异常处理7. 角色的流程控制*include_tasks、import_tasks_include之间的区别 条件语句再细说且、或、非、是模糊条件when指令的详细使用方法 循环语句再细说如何使用使用item变量结合…...

Mybatis-为什么使用Mybatis,它存在哪些优点和缺点?
优点: 基于 SQL 语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL单独写,解除SQL与程序代码的耦合,便于统⼀管理。与 JDBC 相比,减少了 50%以上的代码量,消除…...

银河麒麟高级服务器操作系统V10外接硬盘挂载指南
银河麒麟高级服务器操作系统V10外接硬盘挂载指南 1、临时挂载外接硬盘2、永久挂载外接硬盘3、总结 💖The Begin💖点点关注,收藏不迷路💖 在使用银河麒麟高级服务器操作系统V10时,您可能希望将外接硬盘(如sd…...

免费制作证件照的小程序源码
1、效果展示 证件照制作,证件照免费制作,证件照调用api源码,解析代码。证件照制作小程序包,可以下载程序包,最初级版本免费下载。以上是高级版本。如果你有开发能力的话可以自己写前端,然后以下调用以下api…...

面经宝典【1】-拼多多
这个专题我主要想的是吧这些面经题目给整合起来,自己时不时可以看看然后回答回答,然后再根据一些面经去查漏补缺,具体的答案我都记录在在自己的语雀笔记当中,如果想要的可以私聊我,当然这些答案一般在网上都能找到。 今…...

AI画图用到的网站与资源
1、画图 爱灯泡 midjourney官网 可以使用stable-diffusion的网站 2、素材 花瓣 figma 3、...

C++——多线程编程(从入门到放弃)
进程:运行中的程序 线程:进程中的进程 线程的最大数量取决于CPU的核心数 一、将两个函数添加到不同线程中 demo:两个函数test01()和test02(),实现将用户输入的参数进行打印输出1000次 将这两个函数均放到独立的线程t1和t2中&…...

江协科技STM32学习- P14 示例程序(定时器定时中断和定时器外部时钟)
🚀write in front🚀 🔎大家好,我是黄桃罐头,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝…...