ARM64内存虚拟化分析(1)基础知识

news2024/12/28 19:26:22

1 两级转换

1.1 什么是stage2转换

        Stage2转换允许hypervisor控制虚拟机VM中内存视图。它允许hypervisor控制一个虚拟机可以访问哪块内存映射的系统资源,以及这些资源应该出现在虚拟机地址空间的哪个位置。

        这种控制内存访问的能力对于隔离是非常重要的。Stage2转换用于保证一个虚拟机仅能够看到分配给它的资源,分配给其他虚拟机或hypervisor的资源它是无法看到。

        对于内存地址转换,stage2转换为转换的第2阶段。为了支持它,要求一组新的转换表stage2表,如下所示:

        OS操作系统控制一组转换表,它们用于将虚拟地址空间映射到它认为的物理地址空间。但是,这个过程还经历第二级转换才将其变成真实的物理地址空间。第二级转换由hypervisor控制。

        OS控制的转换称为stage1转换,hypervisor控制的转换称为stage2转换。OS认为的物理地址空间称为中间物理地址空间IPA。

        用于stage2转换表的格式与stage1类似。但是,在stage2中一些属性被不同处理,Type、Normal或Device被直接放在页表项中,而不是在MAIR_ELx寄存器中。

1.2 VMIDs

        每个虚拟机VM都有一个VMID。VMID用于标记TLB项,这些TLB项用于区分它们属性哪个VM。这个标记允许多个不同VM的转换可以同时出现在TLB中。

        VMID由VTTBR_EL2保存,可以为8位或16位。VMID由VTCR_EL2.VS位控制。对16位VMID的支持是可选的。

        NOTE:EL2和EL3转换域的转换不会被标记VMID,因为它们并不是受限于stage2转换。

1.3 VMID与ASID交互

        TLB项也可以通过ASID被标记。一个应用通过OS被赋予ASID,应用中所有TLB项由ASID标记。这意味着不同应用的TLB项可以在TLB中共存,这就避免了一个应用使用的TLB项属于另一个应用。

        每个VM有自己独立的ASID空间。比如,两个VM可能都使用ASID 5,但使用它们来表示不同的事情。因此VMID和ASID的联合就是非常重要的。

1.4 属性合并和覆盖

        Stage1和stage2映射都包含像type和访问权限等属性。MMU会将两阶段的属性联合到一个有效的值。MMU是通过选择更严格的阶段来实现的。如下所示:

        在这个例子中,Device类型比Normal更严格。因此最后的类型为Device。

        属性联合的方法适用于绝大多数情况,但有时hypervisor可能希望覆盖这个行为。比如,在VM早期boot过程。对于这种情况,有一些控制位来覆盖正常的行为:

  1. HCR_EL2.CD:它将所有stage1属性变成non-cacheable
  2. HCR_EL2.DC:它强制stage1属性变成Normal,Write-Back Cacheable
  3. HCR_EL2.FWB:它允许stage2属性覆盖stage1属性,而不是正常的两阶段联合

1.5 MMIO的模拟

        像物理机上的物理地址空间,虚拟机上IPA空间用于访问内存和外设,如下图所示:

        虚拟机可以使用外设区域来访问真实的外设(通常是直接访问)和虚拟外设。

        虚拟外设由hypervisor完全模拟,如下图所示:

        一个assigned外设通常是分配给虚拟机的真实物理设备,它会被映射到IPA地址空间。它允许运行在VM上的软件与外设直接交互。

        虚拟设备为hypervisor将要用软件模拟的设备。相对应的stage2表项将被标记成fault。虚拟机中软件认为它可以直接访问外设,但每次访问会触发stage2 fault,然后hypervisor会模拟异常处理中外设的访问。

        为了模拟一个外设,hypervisor需要知道访问哪个外设,同时也要知道访问外设的哪个寄存器,访问是读还是写,访问的大小,用于传输数据的寄存器。

        从地址开始,异常模型介绍FAR_ELx寄存器。当处理stage1 fault时,这些寄存器报告触发异常的虚拟地址。一个虚拟地址对Hypervisor没有帮助,因为hypervisor通常不知道Guest OS是如何配置它的虚拟地址空间的。对于stage2 fault,存在额外寄存器,HPFAR_EL2,它报告产生异常的IPA地址。因为IPA地址空间由hypervisor控制,它使用信息来决定它需要模拟哪个寄存器。

        异常模型介绍了ESR_ELx寄存器是如何报告异常的信息的。对于单个通用寄存器的load和store,它会触发一个stage2 fault,并提供其他额外的症状。这些信息包括访问的大小,源寄存器,目的寄存器,并允许hypervisor决定访问的类型。

        下图描述了陷入以及模拟访问的过程:

        过程如下步骤所示:

(1)虚拟机中软件尝试访问虚拟外设。在这个例子中,访问的是虚拟UART的FIFO。

(2)访问被阻塞在stage2转换上,它会导致路由到EL2的abort。

- 异常abort提供ESR_EL2异常相关信息,包括访问的大小,目标寄存器,是load还是store。

- 异常abort提供HPFAR_EL2异常访问的IPA地址

(3)hypervisor使用ESR_EL2和HPFAR_EL2区分访问的虚拟外设寄存器。这些信息允许hypervisor模拟这些操作,然后再通过ERET返回vCPU

1.6 arm64两stage转换的例子

        下图描述了arm64两级转换的例子,其中虚拟机和物理机都是48位:

        其中GVA是虚拟机中虚拟地址,GPA是虚拟机中物理地址,HPA是host上物理地址。注意,在虚拟机中页表项中存放虚拟机中认为的物理地址即GPA,而页表项存放在真实的物理内存中即HPA。

        当虚拟机中访问GVA时,由虚拟机VTTBR_ELx指向虚拟机中页表项,但由于存放的是GPA,需要经过stage2的四级转换,最终得到下一级页表项的真实物理地址HPA。因此虚拟机中访问物理内存,最终需要访问的内存次数(5*4+4)=24次。

 

 

 

 

 

 

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

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

相关文章

【C语言 全局 整形变量 布尔变量 数组变量 指针变量 结构体位域变量 枚举变量被其他.C文件相互访问】

【C语言 全局-> 整形变量 布尔变量 数组变量 指针变量 结构体位域变量 枚举变量被其他.C文件相互访问】【0】UI设计【1】项目概述【2】mainwindow.h头文件解析【3】头文件源码【4】mianwindow.c源文件解析【5】源文件源码【6】main文件解析源码【7】编译-链接-运行结果学完这…

对Java中String类的解释

文章目录一、String 的常用方法1.字符串的构造以及字符串常量池2.String 类中对象的比较3.字符串查找4.转化5.字符串替换6.字符串拆分7.字符串截取二、StringBuilder 和 StringBuffer1.引入两者的原因2.相关修改操作的介绍一、String 的常用方法 首先,在介绍 Strin…

[年终总结] 2023,希望一切都能够好起来

0. 引言 2022年,依旧是一个特殊的年份,从前年开始,我就开始撰写年终总结,感兴趣的大家可以看一看2020年终总结和2021年年终总结。 一年比一年过的快速,我也感觉到一年比一年过的更加珍惜。曾经以为自己尚且年轻&…

linux /dev/mapper/rhel-root分区扩容

命令查看linux内存占用情况 /dev/mapper/rhel-root分区已满,主要是东西太多,改善了也删了,但是还是不够用。在扩容之前在首先针对虚拟机硬盘进行扩展 接下来就是在linux上操作了 1、输入fdisk -l 这里显示我已经有了三个分区,sd…

ArcGIS基础实验操作100例--实验9线要素的延伸与裁剪

本实验专栏来自于汤国安教授《地理信息系统基础实验操作100例》一书 实验平台:ArcGIS 10.6 实验数据:请访问实验1(传送门) 基础编辑篇--实验9 线要素的延伸与裁剪 目录 一、实验背景 二、实验数据 三、实验步骤 (…

qinglong-青龙面板部署

背景 之前服务器部署过 jd自动签到、刷豆的脚本,感觉还可以,薅羊毛每天1-2米左右,能把服务器成本薅回来,不过缺点不好管理,后面很久没人维护就凉了。最近了解到青龙面板能够很方便的维护这种脚本。所以部署了一下。 …

SQL学习笔记-聚合函数部分

鉴于自己最近在做后端开发的工作时,发现自己的SQL能力实在太差,开始学习SQL语句基础,学习过程中在本博客进行笔记记录,课程参考:SQL课程 聚合函数是一系列SQL内置的方法,能够完成一些非常使用的功能&#…

java输入语句怎么写

壹哥在前面给大家讲过,Java中给咱们提供了有三个标准的“流”,他们被统称为standard streams。除了负责输出的流之外,还有一个负责输入的标准流,Java中对应的API是System.in。 与标准输出相比,标准输入则复杂的多。尤…

OpenHarmony#深入浅出学习eTs/ArkUI#(一)模拟器/真机环境搭建

本项目的Gitee仓地址:深入浅出eTs学习: 带大家深入浅出学习eTs (gitee.com) (之前有些意外,数据丢失了,现在重新发,且不参与任何活动,在第一篇说明一下,之后就不再说明了) 一、下载…

2022 年 11 种最佳移动自动化测试工具

移动应用程序开发正在以前所未有的速度增长,并且相应地需要使用正确的移动测试策略执行彻底的测试。这些策略主要涉及使用各种移动自动化测试工具。 移动测试工具可帮助企业自动化其应用程序测试,并减少额外的成本、时间和人为错误的机会。我们生活在一个…

用QT实现一个模型交互的网络请求

最近,我接收到了一个项目需求,具体内容如下: 具体要求: 1.交付给我程序的源代码即可,因为我要集成到我的大软件中,要求采用C和QT开发; 2.程序首先检测当前用户环境有没有联网,如果没…

linux的权限

前言 学习权限我们先理解一下xshell 我们使用Xshell的存在的意义 帮助进行命令行传递和返回结构保护操作系统 linux的权限 (1)权限的概念 限制人的,访问的对象可能没有这种“属性” 权限:一件事情是否运行被谁“做” 权限 人 事物属性 (2)linux的上…

【vector的各个begin迭代器详解】

前言 本文是熊猫练习stl一段时间之后,对vector容器的各种迭代器产生了很大的好奇心,于是对它们进行了以下探究。 从图中我们可以知道,vector一个有四组不同的迭代器, 其中,字符 ‘c’ 是 const 常量的意思&#xff0c…

严蔚敏 《数据结构C语言版》读书笔记

目录 第一章 线性表 顺序表 Sequence Table 带头双向循环链表 Linked List 第二章 栈和队列 栈 Stack (顺序存储) 检查括号是否匹配 队列 Queue (链式存储) 循环队列 Circle Queue 第三章 串 模拟实现string.h库函数 第…

2 面向对象编程

面向对象编程(OOP) **面向对象的程序(oop)**是由对象组成的, 每个对象包含对用户公开的特定功能部分和隐藏的实现部分。 传统的结构化程序设计通过**设计一系列的过程(即算法)**来求解问题。一旦确定了这些过程, 就要开始考虑存…

设备通过发放批量自注册场景体验【玩转华为云】

创建实例 首先,根据提示创建实例 实例名称实例描述 创建成功 可以看到,当前实例已经在运行中了 设备发放 在左侧列表中点击“设备发放” 功能简介 您可以通过“设备发放”轻松管理跨多区域,海量设备的发放工作,实现单点发放管…

.Net WebApi— SwaggerUI配置

最近新公司用了特别老的技术【Web 服务 .asmx文件 做WebService服务】,而WebApi早就流行四五年了; 实在太过于简陋,关键其他系统对接的同事,经常说对接不上,如果接口过多确实不方便接口管理,所以最终决定重…

基于Amlogic 安卓9.0, 驱动简说(一):字符设备驱动,手动创建设备

文章目录一、前言二、系列文章三、解析:完整源码1. helloworld_amlogic_char_driver.c2. Makefile四、编译执行4.1 编译4.2 执行(1)部署(2)加载ko文件(3)查看结果(4)是否…

android 皮肤包换肤之Resources加载(一)

Android 换肤之资源(Resources)加载(一) 本系列计划3篇: Android 换肤之资源(Resources)加载(一) — 本篇setContentView() / LayoutInflater源码分析(二)换肤框架搭建(三) 看完本篇你可以学会什么? Resources在什么时候被解析并加载的 Application#ResourcesActivity#Reso…

【Python黑帽子】——搭建TCP端口扫描器

作者名:Demo不是emo 主页面链接:主页传送门 创作初心:舞台再大,你不上台,永远是观众,没人会关心你努不努力,摔的痛不痛,他们只会看你最后站在什么位置,然后羡慕或鄙夷座…