AArch64 memory management学习(一)

news2024/9/23 13:20:19

提示

  • 该博客主要为个人学习,通过阅读官网手册整理而来(个人觉得阅读官网的英文文档非常有助于理解各个IP特性)。若有不对之处请参考参考文档,以官网参考文档为准。
  • AArch64 memory management学习一共分为两章,这是第一章

1. 什么是memory management(内存管理)?

内存管理描述了如何控制对系统中内存的访问。每次OS(操作系统)或应用程序访问内存时,硬件都会执行内存管理。内存管理是一种为应用程序动态分配内存区域的方法。

1.1 为什么需要内存管理?

应用程序处理器被设计为运行一个丰富的操作系统,如Linux,并支持虚拟内存系统。在处理器上执行的软件只能看到虚拟地址,而处理器会将其转换为物理地址。这些物理地址被呈现给内存系统,并指向内存中的实际物理位置。

在AArch64架构中需要内存管理的几个主要原因:

  • 虚拟内存: 内存管理支持虚拟内存技术,将逻辑地址空间映射到物理内存上。每个进程都有自己的虚拟地址空间,使得进程之间彼此隔离并且可以独立运行。内存管理负责将虚拟地址转换为对应的物理地址,以实现地址映射和访问控制。

  • 内存分配与回收: 内存管理负责动态分配和回收内存资源。它跟踪哪些内存块已被分配给进程,并在进程不再需要时将其释放回可用内存池。这样可以避免内存浪费和耗尽,并确保内存资源的高效利用。

  • 内存保护: 内存管理通过页表等机制,为每个进程或应用程序设置访问权限和保护机制。这样可以防止进程之间的互相干扰或访问其他进程的内存空间,从而提高系统的安全性和稳定性。

  • 内存映射: 内存管理负责将外部设备(如显卡、网络接口等)的物理内存映射到系统内存空间中。这样,设备可以直接访问系统内存,实现高效的数据传输和交互。

  • 页面置换: 内存管理通过页面置换算法,管理可用内存和磁盘之间的数据交换。当物理内存不足时,会使用页面置换机制将一些页从内存移到磁盘上,并将需要的页重新调入内存。这样可以扩大可用内存空间,满足更多进程的需求。

总之,AArch64架构中的内存管理在系统层面上负责有效地分配、保护和优化物理内存资源。它为每个进程提供独立的虚拟地址空间,管理内存分配和回收,确保内存保护和安全,支持设备内存映射,并通过页面置换机制增加系统的可用内存空间。这些功能都是为了提高系统的性能、稳定性和安全性。

2 虚拟地址和物理地址

使用虚拟地址的好处

  • 允许管理软件,如操作系统(OS),来控制呈现给软件的内存视图
    操作系统可以控制哪块内存是可见的,该内存是可见的虚拟地址,以及允许对该内存的访问。这允许操作系统使用sandbox应用程序(从另一个应用程序中隐藏一个应用程序的资源),并提供来自底层硬件的abstraction(该单词翻译出来反倒有点抽象)。总之,可以理解为,使用虚拟地址比直接访问物理地址更加容易管理。
  • 操作系统可以将内存的多个碎片物理区域作为单一的连续虚拟地址空间呈现给应用程序
  • 提高开发效率
    虚拟地址也有利于软件开发人员,他们在编写应用程序时将不知道系统的真实物理内存地址。有了虚拟地址,软件开发人员就不需要关心物理内存了。

在实际发开中,每个应用程序都可以使用自己的虚拟地址集,这些地址将映射到物理系统中的不同位置。当操作系统在不同的应用程序之间切换时,它会重新编程映射关系。这意味着当前应用程序的虚拟地址将映射到内存中真实物理位置。
虚拟地址通过映射被转换为物理地址。虚拟地址和物理地址之间的映射存储在转换表(有时也称为页表)中,如下图所示:
在这里插入图片描述

转换表(Translation Tables)在内存中,由软件管理,通常是操作系统或管理程序。转换表不是静态的,这些表是根据软件更改而更新。这将更改虚拟地址和物理地址之间的映射。

3 地址空间

下图显示了在AArch64中的虚拟地址空间(以Armv8-A为例):
在这里插入图片描述

该表展示了三个虚拟地址空间

  • Non-secure EL0 and EL1
  • Non-secure EL2
  • EL3

关于Secure,Non-secure. EL0~EL3将会放到Exception章节博客讲解

上述每个虚拟地址空间都是独立的,并且都有自己的设置和表。我们经常称这些设置和表为“translation regimes(转换机制)”。Secure EL0、Secure EL1和Secure EL2也有虚拟地址空间,但它们没有显示在图中。

在Armv8.4-A中添加了Secure EL2

因为存在多个虚拟地址空间,所以指定地址所在的地址空间很重要。例如,NS.EL2:0x8000是指在Non-secure EL2虚拟地址空间中的地址0x8000。
该图还显示了来自Non-secure EL0和Non-secure EL1的虚拟地址都经过了两组表(Guest OS Tables, Virtulization Tables)。这些表支持虚拟化,并允许hypervisor(管理程序?该单词翻译出来有点抽象,实际上就是一种模式,下面出现这个单词不在解释)虚拟化虚拟机(VM)所看到的物理内存。
Armv9-A支持上述针对Armv8-A的所有虚拟地址空间。Armv9-A引入了可选的领域管理扩展(Realm Management Extension,RME)。当实现RME时,还存在额外的转换机制:

  • Realm EL1 and EL0
  • Realm EL2 and EL0
  • Realm EL2

关于RME将会放到RME章节博客讲解

在虚拟化中,我们将由操作系统(OS)控制的转换集(set of translations)称为阶段1(Stage 1)。阶段1的表将虚拟地址转换为中间物理地址(IPAs)。在阶段1中,操作系统(OS)认为IPAs是物理地址空间。然而,hypervisor控制着第二组转换,我们称之为阶段2(Stage 2)。这第二组将IPAs转换为物理地址。下图显示了这两组转换的工作原理:
在这里插入图片描述
虽然表格格式有一些细微的差异,但阶段1和阶段2的转换过程通常是相同的。

在Arm中,许多示例中都使用了地址0x8000。0x8000也是Arm链接器(armlink)链接的默认地址。这个地址来自一台早期的微型计算机,BBC Micro Model B,它有ROM(和sideways(横向?) RAM)在地址0x8000。BBC Micro Model B是由一家名为Acorn的公司制造的,该公司开发了Acorn RISC Machine(ARM),后来成为Arm。

3.1 物理地址

除了多个虚拟地址空间外,AArch64还具有多个物理地址空间(physical address spaces PAS):

  • Non-secure PAS0
  • Secure PAS
  • Realm PAS (Armv9-A only)
  • Root PAS (Armv9-A only)
    虚拟地址可以映射到哪个物理地址空间决于处理器的当前安全状态(Security state)。下面的列表显示了安全状态及其对应的虚拟地址映射目标:
  • Non-secure state: 虚拟地址只能映射到非安全(Non-secure)的物理地址。
  • Secure state: 虚拟地址可以映射到安全(Secure)的或非安全(Non-secure)的物理地址
  • Realm state: 虚拟地址可以映射到Realm或非安全(Non-secure)的物理地址
  • Root state: 虚拟地址可以映射到任何物理地址空间

当处于具有多个物理地址空间可见的安全状态时,转换表入口处(translation table
entries)控制使用哪个输出物理地址空间。下图显示了多个物理地址空间的映射:
在这里插入图片描述

3.2 地址大小

AArch64是一个64位的体系结构,但这并不意味着所有的地址都是64位的。

3.3 虚拟地址大小

虚拟地址以64位的格式存储。因此,加载指令(LDR)和存储指令(STR)中的地址总是在X寄存器中指定。但是,并非X寄存器中的所有地址都有效
下图显示了AArch64中的虚拟地址空间的布局:
在这里插入图片描述
EL0/EL1虚拟地址空间有两个区域:内核空间和应用程序空间。这两个区域显示在图的左侧,顶部是内核空间(Kernel Space),以及底部的应用程序空间,它被标记为“用户空间(User Space)”。内核空间和用户空间有单独的转换表,这意味着它们的映射可以保持独立。
对于所有其他异常级别而言,在地址空间的底部有一个单独的区域。这个区域显示在图表的右侧,是一个没有内容的box(方框?)。

如果设置HCR_EL2.E2H=1,则将使能运行在EL2中的host OS(主机操作系统?)配置,以及运行在EL0中的应用配置。在这种情况下,EL2也有一个上区域和一个下区域(region)。

每个地址空间的区域大小达52位。然而,每个区域都可以独立地缩小到一个更小的尺寸。TCR_ELx寄存器中的TnSZ位控制着虚拟地址空间的大小。例如,下图显示了TCR_EL1控制EL0/EL1虚拟地址空间:
在这里插入图片描述
虚拟地址的大小编码计算公式:
virtual address size in bytes = 264 -TCR_ELx.TnSZ
虚拟地址的大小也可以表示为地址位的数量:
Number of address bits = 64 - TnSZ

因此,如果将TCR_EL1.T1SZ设置为32,则EL0/EL1虚拟地址空间中的内核区域的大小为232字节(0xFFFF_FFFF_0000_0000到0xFFFF_FFFF_FFFF_FFFF)。任何超出配置范围或范围的地址在访问时将产生异常。这种配置的优点是,我们只需要描述尽可能多的地址空间,这就节省了时间和空间。例如,假设OS内核需要1GB的地址空间(30位的地址大小)来实现其内核空间。如果操作系统将T1SZ设置为34,则只创建1GB的转换表入口处(translation table
entries),如64 - 34 = 30。

所有的Armv8-A实现都支持48位的虚拟地址。支持52位虚拟地址是可选的,并由ID_AA64MMFR2_EL1报告。但是,没有一个Arm Cortex-A处理器支持52位虚拟地址。

3.4 物理地址大小

物理地址的大小是IMPLEMENTATION DEFINED(实现定义)的,最多52位。ID_AA64MMFR0_EL1寄存器报告大小由处理器实现。对于Arm Cortex-A处理器,通常是40位或44位。

在Armv8.0-A中物理地址的最大是48位。在Armv8.2-A中被扩展到52位。

3.5 中间物理地址的大小

如果在转换表入口处(translation table entries)指定的输出地址大于实现的最大值,内存管理单元(MMU)将产生地址大小异常。
IPA空间的大小可以和虚拟地址空间相同的方式进行配置。VTCR_EL2.T0SZ控制大小。可以配置的最大大小与处理器支持的物理地址大小相同。这意味着你不能配置比所支持的物理地址空间更大的IPA空间。即中间物理地址大小必须小于等于物理地址大小。

3.6 地址空间标识符 - 使用已拥有的进程来标记翻译

许多现代操作系统(OS)的应用程序似乎都运行在同一个地址区域,这就是我们所描述的用户空间。在实践中,不同的应用程序需要不同的映射。这意味着,例如,VA 0x8000的翻译取决于当前正在运行的哪个应用程序。
理想情况下,我们希望不同应用程序的转换在转换查找缓冲区(Translation
Lookaside BuffersT, LBs)中共存,以防止在上下文切换上需要TLB失效。但是处理器如何知道要使用哪个版本的VA 0x8000翻译呢?在AArch64中,答案是地址空间标识符(Address Space Identifiers, ASIDs)。
对于EL0/EL1虚拟地址空间,可以使用转换表项的属性字段中的nG位将转换标记为全局(G)或非全局(nG)。例如,内核映射是全局转换,应用映射是非全局转换。全局转换应用于当前正在运行的任何应用程序。非全局转换仅适用于特定的应用程序。
非全局映射在TLBs中用ASID进行标记。在TLB查找中,将TLB入口中的ASID与当前选择的ASID进行比较。如果它们不匹配,则不使用TLB入口。下图显示了内核空间中没有ASID标记的全局映射和用户空间中带有ASID标记的非全局映射:
在这里插入图片描述
上图显示了多个应用程序的TLB入口允许在缓存中共存,并且ASID决定使用哪个入口。
ASID存储在两个TTBRn_EL1寄存器中的一个中。TTBR0_EL1通常用于用户空间。因此,单个寄存器更新可以同时更改ASID和它所指向的转换表。
在2023年,Arm引入了同时指定两个ASIDs的能力。从Armv9.5-A中,软件可以选择在两个TTBRn_EL1寄存器中使用ASID字段。TTBR0_EL1.ASID应用于虚拟地址空间的下部的地址和TTBR1_EL1.ASID到虚拟地址空间上部的地址。

ASID标记也可以在EL2中使用,通过设置HCR_EL2.E2H = 1

3.7 虚拟机标识符 - 使用所拥有的虚拟机(VM)来标记翻译

EL0/EL1的转换也可以用虚拟机标识符(VMID)进行标记。VMIDs允许来自不同VM的转换在缓存中共存。这类似于ASID转换来自不同应用程序的工作方式。在实际中,这意味着一些转换将同时被标记为VMID和ASID,并且两者都必须匹配才能使用TLB入口。

当安全状态支持虚拟化时,EL0/EL1转换总是用VMID标记,即使没有启用阶段2(Satge 2)转换也是如此。这意味着,如果您正在编写初始化代码而没有使用hypervisor(系统管理程序?),那么在设置Stage 1 MMU之前设置一个已知的VMID值是很重要的。

3.8 Common not Private

如果一个系统包含多个处理器,那么在一个处理器上使用的ASIDs和VMIDs在其他处理器上是否具有相同的含义?
对于Armv8.0-A,它们不必意味着相同的东西。这里没有要求软件在多个处理器上以相同的方式使用给定的ASID。例如,ASID 5可能被一个处理器上的计算器使用,可能被另一个处理器上的web浏览器使用。这意味着由一个处理器创建的TLB入口不能被另一个处理器使用。
在实践中,软件不太可能在不同的处理器之间使用不同的ASIDs。软件在给定系统中的所有处理器上以相同的方式使用ASIDs和VMIDs更为常见。因此,Armv8.2-A在转换表基寄存器(Translation Table
Base RegisterT,TBR)中引入了通用非私有(Common not Private,CnP)位。当设置了CnP位时,该软件允许在所有处理器上以相同的方式使用ASIDs和VMIDs,这允许由一个处理器创建的TLB入口被另一个处理器使用。

我们一直在谈论处理器,但是,从技术上讲,我们应该使用处理单元(Processing Element, PE)这个术语。PE是对实现Arm架构的任何机器的通用术语。这很重要,因为在处理器之间共享TLBs是困难的。但是在一个多线程处理器中,每个硬件线程都是一个PE,它更希望共享TLB入口。

参考文档

Learn the architecture - AArch64 memory management

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

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

相关文章

Github 2024-01-08开源项目周报 Top14

根据Github Trendings的统计,本周(2024-01-08统计)共有14个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目5TypeScript项目3C项目2Dart项目1QML项目1Go项目1Shell项目1Rust项目1JavaScript项目1C#项目1 免费…

【网络安全】PKI加密

1、PKI概述 名称:Public Key Infrastruction 公钥基础设施 作用:通过加密技术和数字签名保证信息的安全 组成:公钥机密技术、数字证书、CA、RA 2、信息安全三要素 机密性 完整性 身份验证/操作的不可否认性 3、哪些IT领域用到PKI&…

【Golang】go编程语言适合哪些项目开发?

文章目录 **前言****Go 编程语言适合哪些项目开发?****1. 网络编程项目:****2. 大数据处理项目:****3. 云计算项目:****4. Web开发项目:****5. 嵌入式系统项目:****6.API开发**:**1. 并发性能:*…

数据库内核那些事|细说PolarDB优化器查询变换:IN-List变换

导读 数据库的查询优化器是整个系统的"大脑",一条SQL语句执行是否高效在不同的优化决策下可能会产生几个数量级的性能差异,因此优化器也是数据库系统中最为核心的组件和竞争力之一。阿里云瑶池旗下的云原生数据库PolarDB MySQL版作为领先的云…

prometheus 黑盒监控

黑盒监控 “白盒监控” 是需要把对应的Exporter程序安装到被监控的目标主机上,从而实现对主机各种资源以及状态的数据采集工作 ”黑盒监控“ 是不需要把Exporter程序部署到被监控的目标主机上,比如全球的网络质量的稳定性,通常用ping操作&am…

在 Mac 上轻松安装和配置 JMeter

Apache JMeter 是一个开源的负载测试工具,可以用于测试静态和动态资源,确定服务器的性能和稳定性。在本文中,我们将讨论如何下载和安装 JMeter。 安装 Java(已安装 Java 的此步骤可跳过) 要安装 Java,请按…

基于SSM的停车管理系统设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

1-03C语言超基础语法

一、概述 为了更好的进行后续的课程,避免出现"老师,我还没学过的东西,你怎么直接用?"诸如此类疑问,本小节就诞生了。 实际上,整个第一个大章节的所有小节都是"C语言基础语法"&#x…

ORA-600 adg无法查询故障

再续前缘 ORA-600[12406]故障解决-CSDN博客 当你点背的时候,看似一个简单的case,总是会迎来反转 上次改完参数没两天,又出现了报错不同,但是现象相似的情况 这次是 ORA-600 [kksgaGetNoAlloc_Int0] 这次出现故障的范围更大&a…

XML技术分析05

一、DOM 使用DOM扫描器程序:DOM扫描器是一种非常通用的程序,它不需知道用户定制的XML标记的确切含义。DOMAPI具有某些能把任何数据存储到树形结构中的接口。扫描器具有一组实现了这些接口的类,可以实例化这些类的对象。 这些接口和类…

CAN协议层详细介绍

CAN物理层协议介绍-CSDN博客 目录 1. CAN的波特率及位同步 2. 位时序分解 3. CAN的报文种类及结构 3.1 报文的种类 3.2 数据帧的结构 3.2.1 仲裁段 3.2.2 RTR位(Remote Transmission Request Bit) 3.2.3 IDE位(Identifier Extension Bit) 3.2.3 SRR位(Substi…

K8S--安装MySQL8(单机)

原文网址:K8S--安装MySQL8(单机)-CSDN博客 简介 本文介绍K8S部署MySQL8(单机)的方法。 本文的目标 1.通过PV和PVC(hostPath方式)存储MySQL的数据 2.通过Deployment、Service部署MySQL8&…

【AI视野·今日NLP 自然语言处理论文速览 第七十期】Thu, 4 Jan 2024

AI视野今日CS.NLP 自然语言处理论文速览 Thu, 4 Jan 2024 Totally 29 papers 👉上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Multilingual Instruction Tuning With Just a Pinch of Multilinguality Authors Uri Shaham, Jonathan Herzi…

新手练习项目 5:简易计算器(C++)

名人说:莫听穿林打叶声,何妨吟啸且徐行。—— 苏轼《定风波莫听穿林打叶声》 Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder) 目录 一、效果图二、代码(带注释)三、说明 一、效果图 二、代码(带…

SPON世邦 IP网络对讲广播系统 多处文件上传漏洞复现

0x01 产品简介 SPON世邦IP网络对讲广播系统是一种先进的通信解决方案,旨在提供高效的网络对讲和广播功能。 0x02 漏洞概述 SPON世邦IP网络对讲广播系统 addscenedata.php、uploadjson.php、my_parser.php等接口处存在任意文件上传漏洞,未经身份验证的攻击者可利用此漏洞上…

尚硅谷大数据技术-数据湖Hudi视频教程-笔记01【概述、编译安装】

大数据新风口:Hudi数据湖(尚硅谷&Apache Hudi联合出品) B站直达:https://www.bilibili.com/video/BV1ue4y1i7na 尚硅谷数据湖Hudi视频教程百度网盘:https://pan.baidu.com/s/1NkPku5Pp-l0gfgoo63hR-Q?pwdyyds阿里…

flutter中枚举的使用

Dart 2.17 增加了对枚举成员变量的支持,推荐使用方式三 使用dart工具来运行代码,工具:https://dartpad.cn //方式一:未支持扩展枚举时 enum InOutOrderStatusEnum {approval,completed,cancel,rejected;int get statusCode {sw…

【C++】- 类和对象(构造函数!析构函数!拷贝构造函数!详解)

类和对象② 类的6个默认成员函数构造函数析构函数拷贝构造函数 类的6个默认成员函数 上一篇详细介绍了类。如果一个类中什么成员都没有,简称为空类。 那么空类中真的什么都没有吗? 并不是,当类在什么都不写时,编译器会自动生成…

126基于matlab的孪生支持向量机(Twin support vector machine,TWSVM)是SVM的一种变形算法

基于matlab的孪生支持向量机(Twin support vector machine,TWSVM)是SVM的一种变形算法。该采用WSVM进行二分类,程序已注释数据可更换自己的,程序已调通,可直接运行。 126matlabTWSVM模式识别 (xiaohongshu.com)