当前位置: 首页 > 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 寄存器以进行上下文切换。 您可以在下图中看到这一点

相关文章:

【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函数中所有的输出都是右对齐的&#xff0c;除非在%后面添加负号&#xff0c;则表示左对齐 #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 创建数据库 语法&#xff1a; CREATE DATABASE [IF NOT EXISTS] database_name [COMMENT database_comment] [LOCATION hdfs_path] [WITH DBPROPERTIES (property_nameproperty_value, ...)]; 案例&#xff1a; &#xff08;1&#xff09;创建一个…...

CNVD漏洞和证书挖掘经验总结

前言 本篇文章主要是分享一下本人挖掘CVND漏洞碰到的一些问题&#xff0c;根据过往成功归档的漏洞和未归档的漏洞总结出的经验&#xff0c;也确实给审核的大佬们添了很多麻烦&#xff08;主要真的没人教一下&#xff0c;闷着头尝试犯了好很多错误&#xff0c;希望各位以后交一个…...

阿里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.链接 数据库系统概念&#xff1a; 链接: https://pan.baidu.com/s/17zz7QFevV2Eni9qHJyLEGA 提取码: wfrx 深入理解计算机系统 链接: https://pan.baidu.com/s/19yiJG8GqHJR…...

处理ASAM-MDF格式的开源python库asammdf

asammdf是一个强大的Python库&#xff0c;专为处理ASAM&#xff08;Association for Standardization of Automation and Measuring Systems&#xff09;MDF&#xff08;Measurement Data Format&#xff09;文件而设计。MDF是一种用于存储测量和诊断数据的标准格式&#xff0c…...

物业管理小程序开发

物业小程序的开发是一个综合性的项目&#xff0c;旨在提升物业管理效率和增强业主的服务体验。以下是关于物业小程序开发的一些关键方面&#xff1a; 一、需求分析 目标用户&#xff1a;识别主要用户群体&#xff0c;包括业主、租户、物业管理人员等。 功能需求&#xff1a; 物…...

【Vue】Pinia

系列文章目录 第八章 Pinia 文章目录 系列文章目录前言一、安装和配置&#xff1a;二、基本使用三、一个更真实的例子 前言 Pinia是Vue.js应用程序的状态管理库。它提供了一种简单&#xff0c;轻量级的解决方案&#xff0c;用于在Vue应用程序中管理和维护状态。Pinia库的特点…...

帕金森病患者的生命长度:科学管理与乐观心态是关键

在快节奏的现代生活中&#xff0c;健康成为了我们最宝贵的财富之一。然而&#xff0c;当“帕金森病”这个名词悄然进入我们的视野时&#xff0c;不少人心中难免会涌起一丝不安与担忧。帕金森病&#xff0c;作为一种常见的神经系统退行性疾病&#xff0c;确实给患者的日常生活带…...

详解Linux中cat命令

在 Linux 命令的世界中&#xff0c;cat 命令就像是一位多才多艺的艺术家&#xff0c;它能够将文本文件的美妙旋律编织在一起&#xff0c;或者单独演奏它们的每一个音符。下面&#xff0c;让我们以一种充满情感的方式&#xff0c;用 Markdown 格式来探索 cat 命令的多种用途。 …...

Mysql高级篇(中)—— SQL优化之查询截取分析

SQL优化之查询截取分析 一、慢查询日志&#xff08;1&#xff09;简述&#xff08;2&#xff09;如何开启&#xff08;3&#xff09;慢查询日志分析工具介绍(了解)&#xff08;4&#xff09;官方工具 mysqldumpslow简述如何使用 二、SHOW PROCESSLIST三、&#xff08;了解&…...

企业如何制作一个官方网站?

随着实体宣传的减弱&#xff0c;提高线上的宣传是新式的宣传方式&#xff0c;那么企业搭建网站成为线上宣传的重要途径。企业如何去搭建网站呢&#xff1f;如何拥有一个专业的网站来展示企业文化和企业销售产品&#xff1f;今天我给大家带来干货&#xff1a;如何一步步构建自己…...

游戏开发2025年最新版——八股文面试题(unity,虚幻,cocos都适用)

1.静态合批与动态合批的原理是什么&#xff1f;有什么限制条件&#xff1f;为什么&#xff1f;对CPU和GPU产生的影响分别是什么&#xff1f; 原理&#xff1a;Unity运行时可以将一些物体进行合并&#xff0c;从而用一个描绘调用来渲染他们&#xff0c;就是一个drawcall批次。 限…...

如何查看线程

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

详细分析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&#xff08;save方法添加了Tra…...

Redis数据类型,使用场景,事物及分布式锁

文章目录 关于Redis1.常用数据类型1.字符串&#xff08;String&#xff09;2.哈希&#xff08;Hash&#xff09;3.列表&#xff08;List&#xff09;4.集合&#xff08;Set&#xff09;5.有序集合&#xff08;Sorted Set&#xff09;6.位图&#xff08;Bitmap&#xff09;7.超日…...

目标检测系列(一)什么是目标检测

目录 一、相关名词解释 二、目标检测算法 三、目标检测模型 四、目标检测应用 五、目标检测数据集 六、目标检测常用标注工具 一、相关名词解释 关于图像识别的计算机视觉四大类任务&#xff1a; 分类&#xff08;Classification&#xff09;&#xff1a;解决“是什么&…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

Java数值运算常见陷阱与规避方法

整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...