AArch64 memory management学习(二)

提示

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

注意:这两章只是介绍AArch64 memory management,还有AArch64 memory management examples,AArch64 memory attributes and properties等没介绍

1. 内存管理单元(Memory Management Unit,MMU)

内存管理单元(MMU)负责将软件使用的虚拟地址转换为内存系统中使用的物理地址。
MMU包含以下内容:

  • The table walk unit(表行走单元?这里还是用英文,中文翻译感觉有点奇怪,下面涉及到感觉翻译奇怪的都会写英文然后括号中文加上“?”),它包含从内存中读取转换表的逻辑
  • Translation Lookaside Buffers (TLBs,转换备用缓冲区?),表示最近缓存使用的转换。
    由软件发布的所有内存地址都是虚拟的。这些内存地址被传递给MMU,MMU检查TLBs是否有最近使用的缓存转换。如果MMU没有找到最近缓存的转换,表行走单元将从内存中读取适当的入口,如下图所示:
    在这里插入图片描述
    在进行内存访问之前,一个虚拟地址必须被转换为一个物理地址(因为我们必须知道我们正在访问的是哪个物理内存位置)。这种转换的需求也适用于缓存的数据,因为在Armv6和更高版本的处理器上,数据缓存使用物理地址(经过物理标记的地址)来存储数据。因此,在完成缓存查找之前,必须转换地址。

1.1 表入口(Table entry)

转换表的工作原理是将虚拟地址空间划分为相同大小的块(block),并为每个块提供表入口。
表中的入口0提供块0(block 0)的映射,入口1提供块1(block 1)的映射,以此类推。每个入口包含相应的物理内存块的地址以及访问物理地址时使用的属性。
在这里插入图片描述

1.2 查表法(Table lookup)

当发生转换时会发生表查找。当发生转换时,软件发出的虚拟地址将被一分为二,如下图所示:
在这里插入图片描述
上图显示了一个单级查找。
图中标记为“哪个条目(Which entry)”的高位告诉你要查看哪个块入口,并且它们被用作表中的索引。此输入块包含该虚拟地址的物理地址。
图中被标记为“块中的偏移量(Offset in block)”的低位,是该块内的一个偏移量,不会因转换而改变。

1.3 多级转换(Multilevel translation)

在单级查找中,虚拟地址空间被分割成相同大小的块。实际上,通常使用多级查找。
第一个表(第1级表)将虚拟地址空间分成大块。这个表中的每个入口都可以指向一个大小相同的物理内存块,也可以指向另一个表,该表将该块细分为更小的块。我们将这种类型的表称为“多级表(multilevel table)”。在这里,我们可以看到一个有三层的多级表的例子:
在这里插入图片描述
在Armv8-A中,最大支持4级,级别编号为0到3
这种多级方法允许描述更大的块和更小的块。大小块的特点如下:

  • 大块比小块需要更少的读取级别来转换。此外,大块在TLBs中缓存更有效。
  • 小块使软件能够对内存分配进行细粒度控制。然而,小块在TLBs中缓存的效率较低。因为小块需要进行多次级别转换来读取。

为了管理这种权衡,操作系统必须平衡使用较大映射的效率和使用较小映射的灵活性,以获得最佳性能。

处理器在启动表查找时并不知道转换的大小。处理器通过执行表行走(The table walk )来计算正在转换的块的大小。

2. 控制地址转换和转换表格式

下图中,我们可以看到转换表入口所允许的不同格式:
在这里插入图片描述

为了清晰起见,此图没有指定位字段的宽度。您可以在 Arm Architecture Reference Manual Armv8找到此信息,用于Armv8-A体系结构配置文件:The VMSAv8-64 translation table format descriptors。

每个入口都是64位,低两位决定了入口的类型。
请注意,某些表入口仅在特定的级别上有效。表的最大级别数是4,这就是为什么没有针对级别3(或第四级)、表的表描述符的原因。类似地,级别0中也没有块描述符或页面描述符。因为0级入口覆盖了很大的虚拟地址空间区域,所以允许块没有意义。

第0-2级的表描述符的编码与第3级的页面描述符相同。这种编码允许“递归表(recursive tables)”,它们指向它们自己。这很有用,因为它便于计算特定页表条目的虚拟地址,以便可以更新它。

3. 转换颗粒

转换颗粒是可以描述的最小的内存块。没有更小的可以描述,只有更大的块,这是颗粒的倍数。
AArch64支持三种不同的颗粒尺寸: 4KB、16KB和64KB。
处理器所支持的颗粒大小是由ID_AA64MMFR0_EL1定义并报告的实现。所有的Arm Cortex-A处理器都支持4KB和64KB。所选的颗粒是在最新级别表中可以描述的最小块。也可以描述更大的块。下表显示了基于所选颗粒的每个级别表的不同块大小:
在这里插入图片描述
在引入Armv9.2-A和Armv8.7-A之前,对使用52位地址有限制。当所选颗粒为4KB或16KB时,最大虚拟地址区域大小为48位。同样地,输出物理地址被限制为48位。只有当使用64KB的颗粒时,才能使用完整的52位。

TCR_EL1有两个独立的字段来控制内核空间的颗粒大小和用户空间的虚拟地址范围。这些字段对于内核空间称为TG1,对于用户空间称为TG0。程序员面临的一个潜在问题是,这两个字段有不同的编码。

3.1 地址转换的起始级别

颗粒和虚拟地址空间的大小一起控制着地址转换的起始级别。
上一个表总结了每个表层中每个颗粒的块大小(由单个入口所覆盖的虚拟地址范围的大小)。从块的大小中,你可以计算出虚拟地址的哪些位被用来索引表的每个级别。
在这里插入图片描述
假设,对于一个配置,你将虚拟地址空间的大小TCR_ELx.T0SZ设置为32。然后,以地址位表示的虚拟地址空间的大小计算为:
64 - T0SZ = 32-bit address space (address bits 31:0)
如果我们再看前面的4KB颗粒图,0级被47:39位索引。对于一个32位的地址空间,你就没有这些位了。因此,您配置的初始转换级别是第1级。
接下来,假设您将T0SZ设置为34:
64 - T0SZ = 30-bit address space (address bits 29:0)
此时,您没有任何其他用于索引第0级表或第1级表的位,因此您的配置的起始转换级别是第2级。
如上图所示,当虚拟地址空间的大小减小时,您需要更少级别的表来描述它。
这些例子是基于使用4KB颗粒。同样的原理也适用于使用16KB和64KB的颗粒,但地址位发生了变化。

3.2 控制地址转换寄存器

地址转换由以下系统寄存器的组合控制:

  • SCTLR_ELx
    • M :使能MMU
    • C:使能data和统一缓存
    • EE:转换表行走(translation table walks)大小端
  • TTBR0_ELx 和 TTBR1_ELx
    • BADDR:转换表开始位置的物理地址(PA)(或中间物理地址,EL0/EL1)
    • ASID:用于非全局转换的地址空间标识符
  • TCR_ELx
    • PS/IPS:PA或IPA空间的大小,最大输出地址大小
    • TnSZ:表中所覆盖的地址空间的大小
    • TGn:颗粒度
    • SH/IRGN/ORGN-MMU表行走所使用的可访问性和可共享性
    • TBln:禁用表行走到一个特定的表
  • MAIR_ELx
    • Attr:控制阶段1(stage 1)表中的类型和可缓存性

3.3 失能MMU

当在转换阶段禁用MMU时,所有地址都是平面映射的。平面映射表示输入地址和输出地址相同。

4. 转换备用缓冲区维护

转换备用缓冲区(Translation Lookaside Buffers,TLBs)缓存最近使用的转换。这种缓存允许后续查找重用转换,而不需要重读表。

TLBs是转换缓存,而不是转换表缓存。区别是微妙的。有几个寄存器字段控制如何解释转换表入口。TLB入口中包含的是给定在行走表时的配置的转换表入口的解释。在Arm架构参考手册(Arm ARM)中,这样的寄存器字段被描述为“允许在TLB中缓存”。

如果更改了转换表入口或控制影响入口的参数,则需要使TLB中受影响的入口无效。如果您不使这些入口无效,那么处理器可能会继续使用旧的转换。
处理器不允许缓存到导致以下任何故障的TLB的转换:

  • 转换fault(未映射的地址)
  • 地址大小fault(地址超出范围)
  • 访问标志fault
    因此,在第一次映射地址时,不需要发出TLB无效。但是,如果您想执行以下任何操作,则需要发出TLB无效:
  • 取消映射地址
    获取一个以前有效的地址或已映射的地址,并将其标记为错误地址。
  • 更改地址映射
    更改输出地址或任何属性。例如,将地址从只读权限更改为读写权限。
  • 更改解释表的方式
    这种情况并不常见。但是,如果颗粒度改变了,那么对表的转换也会改变。因此,TLB无效将是必要的。

4.1 TLB操作的格式

TLBI指令用于使TLBs中的入口无效。此指令的语法为:

TLBI < type >< level >{IS|OS} {, < xt >}
  • < type > 表示哪些入口无效
    ALL:所有入口
    VA:在Xt中匹配VA和ASID的入口
    VAA:对于任何ASID,在Xt中输入匹配VA的入口
    ASID:在Xt中,匹配ASID的任何入口
  • < level > 表示要操作的地址空间
    E1 = EL0/1虚拟地址空间
    E2 = EL2虚拟地址空间
    E3 = EL3虚拟地址空间
  • < IS|OS > 表示操作是内部共享(Inner Shareable,IS)还是外部共享(Outer Shareable,OS)
    当IS添加到操作时,它将广播到内部共享域中的其他核心。
    当操作系统添加到操作时,它将广播到外部共享域的其他核心(在Armv8.4-A中添加)。
  • < Xt > 表示操作哪个地址或ASID
    仅用于按地址或ASID进行的操作
    例如,一个正在更新其内核转换表中的入口的操作系统(OS)。一个典型的TLB无效序列应该是这样的:
STR X1, [X5]		 // Write to translation table entry
DSB ISH				 // Barrier instructions - not covered in this guide
TLBI VAAE1IS , X0 	 // Invalidate VA specified by X0, in EL0/1
 					 // virtual address space for all ASIDs
DSB ISH				 // Barrier instructions - not covered in this guide
ISB 				 // Synchronize context on this processor

5. 地址转换指令

地址转换(AT)指令允许软件查询特定地址的转换。转换的结果包括属性,被写入物理地址寄存器PAR_EL1。
AT指令的语法允许您指定要使用的转换机制。例如,EL2可以查询EL0/EL1的转换机制。但是,EL1不能使用AT指令来查询EL2的转换机制,因为这违反了特权。
如果所请求的转换会导致fault,则不会生成异常(exception)。相反,将生成的fault类型将记录在PAR_EL1中。

6. Check your knowledge

  1. 在地址转换的阶段(stage)和级别(level)之间有什么区别?
    一个阶段是将输入地址转换为输出地址的过程。对于第一阶段,这是从VA到IPA的过程,第二阶段从IPA到PA
    一个级别指的是在一个给定的转换阶段中的表。这也是如何将一个更大的块细分为更小的块。

  2. 物理地址的最大大小是多少?
    物理地址空间的最大大小是由实现定义(IMPLEMENTATION DEFINED),最多52位(从Armv8.2-A开始)。

  3. 哪个寄存器字段控制虚拟地址空间的大小?
    TCR_ELx.TnSZ, or VTCR_EL2.T0SZ for Stage 2.

  4. 什么是转换颗粒,支持的大小是多少?
    它是可以描述的最小的内存块。支持的size分别为4KB、16KB和64KB。

  5. TLBI中的ALLE3是做什么的?
    它会使EL3虚拟地址空间中的所有TLB入口无效。

  6. 导致转换fault的转换表入口能否缓存在TLBs中?
    它不能存储在TLBs中

  7. 在禁用MMU时,如何映射地址?
    地址是平面映射的,因此输入地址和输出地址是相同的。

  8. 什么是ASID?TLB入口何时包含ASID?
    ASID是一个地址空间标识符,它标识与转换关联的应用程序。非全局映射(nG=1)在TLBs中用ASID进行标记。

7. 下一步

下一步将介绍

  1. AArch64 memory management examples
  2. Memory Model

参考文献

Learn the architecture - AArch64 memory management

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu下AI4Green开源ELN服务的简单部署

主部署程序&#xff1a;AI4Green 配置参考这篇文档&#xff1a;AI4Green开源ELN&#xff08;电子实验记录本&#xff09;-CSDN博客 流量转发和负载均衡&#xff1a;使用Nginx 配置参考这篇文档&#xff1a;Nginx负载均衡-CSDN博客 SSL配置部分参考这篇文档&#xff1a; 设置…

python自动化运维管理拓扑

1、简介 这部分实验是属于python自动化管理拓扑、配置拓扑的实验。模拟企业配置中&#xff0c;使用python自动化批量管理网络设备&#xff0c;减少人力物力时间成本的场景。 2、实验环境 ensp软件centos。 ensp中需要配置好cloud&#xff0c;连接本地的vmnet8虚拟网卡&…

基于多反应堆的高并发服务器【C/C++/Reactor】(中)解析请求头并存储

一、解析请求头并存储 ### 解析请求头数据 1.数据存储在对应的Buffer结构内存块中。解析时&#xff0c;需要将readPos更新到请求头的起始位置parseHttpRequestLine函数中已经为解析请求头做好了准备。 回顾一下parseHttpRequestLine函数: bool parseHttpRequestLine(struct…

802.1X(HCIP)

目录 一、802.1X协议概述 1、802.1X协议概述 2、802.1X基本概念 认证模式 认证方式 端口控制方式 3、802.1X认证触发机制 客户端主动触发 设备端主动触发&#xff08;用于支持不能主动发送EAPOL-Start报文的客户端&#xff09; 4、EAP体系结构 5、EAP报文封装结构 6…

RT-Thread: 基于STM32CubeMX配置驱STM32驱动的USB虚拟串口调试

关键词&#xff1a;USB 虚拟串口 USB虚拟串口&#xff0c;RT-Thread Studio&#xff0c;STM32 说明&#xff1a; 1&#xff1a;文档记录 STM32F103系列基于 RT-Thread 系统的 USB虚拟串口的开启及数据收发应用流程介绍。 2&#xff1a;本文以STM32F103C8T6型号做测试&#x…

K8S中的Pod到底是什么

01 概述 In earlier chapters we discussed how you might go about containerizing your application, but in real-world deployments of containerized applications you will often want to colocate multiple applications into a single atomic unit, scheduled onto a …

USB定位检测

拍摄要求&#xff1a; 1、精度要求&#xff1a;检测USB接口内芯位置是否处于接口的中心&#xff0c;检测精度0.05mm。 2.速度要求&#xff1a;一分钟检测3个产品&#xff1b;一次一个产品&#xff1b; 拍摄思路&#xff1a; 如图&#xff0c;想要检测USB内芯位置是否处于接口的…

信号的互相关计算及时延估计

1. 信号的互相关计算 互相关反映向量x和移位&#xff08;滞后&#xff09;向量y之间的相似性。 最直观的解释是&#xff1a;互相关的作用是为了找到信号在哪一时刻与另一信号最像&#xff08;另一信号为本身时就是自相关&#xff09;&#xff01; 滑动求互相关&#xff08;图…

软件测试|Linux基础教程:ln命令与软链接和硬链接

简介 在Linux系统中&#xff0c;ln命令是一个非常有用的工具&#xff0c;用于创建链接&#xff08;link&#xff09;&#xff0c;将一个文件或目录链接到另一个位置。链接允许一个文件或目录可以同时存在于多个位置&#xff0c;而不会占用额外的磁盘空间。ln命令支持创建硬链接…

SAP 物料读取基本数据文本与检验文本READ_TEXT

1. 读取基本数据文本 使用函数 READ_TEXT 2. 读取检验文本

【金猿CIO展】是石科技CIO侯建业:算力产业赋能,促进数字经济建设

‍ 侯建业 本文由是石科技CIO侯建业撰写并投递参与“数据猿年度金猿策划活动——2023大数据产业年度优秀CIO榜单及奖项”评选。 大数据产业创新服务媒体 ——聚焦数据 改变商业 是石科技&#xff08;江苏&#xff09;有限公司成立于2021年&#xff0c;由国家超级计算无锡中心与…

CSDN博客重新更新

说来惭愧&#xff0c;好久没更新博客文章&#xff0c;导致个人博客网站&#xff1a;https://lenky.info/ 所在的网络空间和域名都过期了都没发觉&#xff0c;直到有个同事在Dim上问我我的个人博客为啥打不开了。。。幸好之前有做整站备份&#xff0c;后续慢慢把内容都迁回CSDN上…

【Docker】可以将TA用于什么,简单了解下

欢迎来到《小5讲堂》&#xff0c;大家好&#xff0c;我是全栈小5。 这是是《Docker容器》序列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深…

独立式键盘的按键功能扩展:“以一当四“

#include<reg51.h> // 包含51单片机寄存器定义的头文件 unsigned char ID; //储存流水灯的流动速度 sbit S1P1^4; //位定义S1为P1.4 /************************************************************** 函数功能&#xff1a;延时子程序 ***********…

卷积神经网络|迁移学习-猫狗分类完整代码实现

还记得这篇文章吗&#xff1f;迁移学习|代码实现 在这篇文章中&#xff0c;我们知道了在构建模型时&#xff0c;可以借助一些非常有名的模型&#xff0c;这些模型在ImageNet数据集上早已经得到了检验。 同时torchvision模块也提供了预训练好的模型。我们只需稍作修改&#xf…

我的阿里云服务器被攻击了

服务器被DDoS攻击最恶心&#xff0c;尤其是阿里云的服务器受攻击最频繁&#xff0c;因为黑客都知道阿里云服务器防御低&#xff0c;一但被攻击就会进入黑洞清洗&#xff0c;轻的IP停止半小时&#xff0c;重的停两个至24小时&#xff0c;给网站带来很严重的损失。而处理 ddos 攻…

Spring Cloud Gateway整合Sentinel

日升时奋斗&#xff0c;日落时自省 目录 1、实现整合 1.1、添加框架依赖 1.2、设置配置文件 1.3、设置限流和熔断规则 1.3.1、限流配置 Route ID限流配置 API限流配置 1.3.2、熔断配置 2、实现原理 先前Sentinel针对是业务微服务&#xff0c;没有整合Sentinel到Spring…

若依CRUD搬砖开始,Java小白入门(十)

背景 经过囫囵吞枣的学习若依框架&#xff0c;对于ruoyi-framework&#xff0c;common&#xff0c;安全&#xff0c;代码生成等模块都看了一圈&#xff0c;剩余的调度模块&#xff0c;这个暂时不深入&#xff0c;剩余的是ruoyi-system&#xff0c;就是用mybatis完成的&#xf…

c/c++基础 自增自减运算符 大白讲解i++/i--/++i/--i

后置运算符&#xff1a;i表示在使用x之后&#xff0c;再使x的值加1&#xff0c;即ii1; 前置运算符&#xff1a;i表示在使用x之前&#xff0c;先使x的值加1&#xff0c;即ii1. 前缀运算和后缀运算的区别&#xff1a;前缀运算是“先变后用”&#xff0c;而后缀运算是“先用后变”…

JavaScript:Date 对象-时间日期

Date 对象-时间日期: - JS中所有的关于时间信息都需要通过Date对象来表示 // 创建一个Date对象 // 如果直接使用new Date()创建时间对象&#xff0c;它会默认创建一个表示代码执行时刻的对象var d new Date();// 如果希望创建一个指定的时间的Date的对象&#xff0c;需要传递…
最新文章