Armv8-A Memory management

 

本文介绍Armv8-A的内存管理。内存管理指的是在系统中,内存访问是如何实现的。

使用内存管理机制,可以让每个应用之间的内存地址分离,即sandbox application,也可以让多个在物理内存上碎片化的地址形成虚拟地址空间一个连续的地址,同时可以让程序员编程更为方便。

image-20200802152342377

虚拟地址到物理地址的转换通过mapping的方式来进行,其关键为Translation tables,存储在memory中,并且被OS或者hypervisor来管理。

Memory Management Unit(MMU)

虚拟地址到物理地址的translation由MMU来执行,其包含两个部分:

  1. The table walk unit, which contains logic that reads the translation tables from memory.
  2. Translation Lookaside Buffers (TLBs), which cache recently used translations ,是被映射的地址,而不是地址对应的内容。
  3. https://johnrico580.github.io/2020-111-a-test-post.html
    https://johnrico580.github.io/2020-116-a-test-post.html

当一个虚拟地址来临的时候,MMU先是查找TLBs,看是否有cached translation,如果没有,那么table walk unit就memory中读取对应的table entry或者table entries(大块内存可能就需要多个entry)

 

Table entry

translation tabls通过把整个虚拟地址空间划分为多个大小相同的block/page,然后每个page对应一个entry。

image-20200802164144863

Table lookup

对于一个单一层级的查找来说,当对某个虚拟地址来查找table的时候,会把虚拟地址分城两部分,高位的用来定位对应的entry,而低位的则用来表示该地址在查找到的该block中的偏置大小。

 

Multilevel translation

在实践使用中,一般使用的是分级table。每一级的访问都像前面介绍的table lookup一样访问。

在armv8中,最多可以分为4级,每级分别被标记为0-3. 这种分级方案支持larger blocks和 smaller blocks:

  • larger blocks:相比smaller blocks,它只要更少层级的读取翻译就可以得到对应的物理地址。同时,在TLB中的缓存效率也更高
  • small block:可以提供对内存分配fine-grain的控制。但是在TLB中的缓存效率较低,因为需要更多层级的读取翻译才可以得到物理地址
  • https://johnrico580.github.io/2020-113-a-test-post.html
    https://johnrico580.github.io/2020-110-a-test-post.html

 

OS必须做好large block和small block之间的平衡,以达到效率和物理内存使用灵活上的平衡,从而达到最优的性能。Note:在这种情况下,处理器并不知道此次翻译对应的block大小,它需要通过table walk的方式来得到。

Address spaces in Armv8-A

 

在arm中,同时存在几个独立的虚拟地址空间,比如OS的、Hypervisor的以及Secore Monitor的。每个虚拟地址空间都有他们自己的setting和tables。从这个图上我们可以看到,OS的虚拟地址其实是经过了两层translation的,先是由OS翻译成IPAs,然后再又hypervisor翻译成真正的物理地址,这两次翻译虽然在表的格式方面可能有所差异,但是大体是基本是一致的。如下图所示:

 

Address sizes

虽然Armv8-A是64位的架构,但是并不是意味着所有的地址都是64位的

Size of virtual addresses

image-20200802193015118

从这个图也可以看出,对于EL0/EL1,kernel space和user space的地址空间是分开的,kernel的位于高地址,user位于低地址。kernel space和user space都有各自的translation table。TCR_ELx registers中表示的TnSZ值用来控制虚拟地址空间:

 

所有的armv8-a架构都支持48位的虚拟地址,52位的是可选支持。比如上图的中的0x0000_0000_0000_0000~0x000F_FFFF_FFFF_FFFF表示的就是一个52位的地址空间

Size of physical address

size of物理地址是有实现决定的,最大支持52bits。如果你在table entry中指定一个

Adress Space Identifiers - Tagging translations with the owning process

对于现代操作系统,多个同时运行的进程看起来都是有着相同的虚拟地址的。那么从MMU的角度来讲,它怎么区分一个相同的虚拟地址是来自哪个进程呢?同时,理想化的来讲,我们希望不同的进程所对应的TLB是互不冲突的,这就不会导致TLB的的刷新以及上下文切换。解决这个问题的手段就是使用Address Space Identifiers (ASIDs)

对于EL0/EL1,即OS,的虚拟地址,translations table entry的属性字段中的nG位用来标记global或者non-global。kernel对应的是global,也即意味着对于所有的进程都是共用的,而non-global的ranslation则与对应的进程相关。对于non-global的,则匹配TLB中的ASID和当前translations提供的ASID,会选择匹配了的来进行处理。

 

Virtual Machine Identifiers - Tagging translations with the owning VM

对于不同的VM,和ASID一样,使用Virtual Machine Identifier (VMID) 来进行tag。这里讲的VM就是EL0 EL1 EL2 EL3这些。

Common not Private

有这样一个问题,现在CPU都是多核的,同一个ASID和VMID在不同的process上有相同的含义吗?

对Armv8.0-A 版本,答案是否定的。没有要求对于多个processor之间要求ASID和VMID含义一致,即相同的ASID在不同的processor可能表示不同的进程。也即意味着,一个processor创建的TLB不能被另一个processor使用。

但是,在实际中,我们更倾向于他们是跨processor通用的,因此从Armv8.2-A 开始引入了Common not Private (CnP)bit in the Translation Table Base Register (TTBR) ,如果CnP位被set,那么就意味着可以通用。

Controlling address translation

Translation table format

https://johnrico580.github.io/2020-114-a-test-post.html
https://johnrico580.github.io/
https://johnrico580.github.io

 

为什么对于level3没有Next-level Table Address?因为前面也提到过,最多容许四级地址。也即3就是最后一级了,必须输出硬件地址了,即Output Block Address

为什么level0没有Output Block Address?因为level0表示的范围太大了,直接让其表示blocks没有意义。

为什么第一个和第三个的descriptor是一样的?因为这样容许recursive tables,让他们相互之间可以point back。This is useful because it makes it easy to calculate the virtual address of a particular page table entry so that it can be updated .

Translation granule

translation granule,即翻译粒度,指的是最小可described的block memory大小。Armv8-A 支持4KB, 16KB, and 64KB 。具体是由ID_AA64MMFR0_EL1 所指定。

 

There are restrictions on using 52-bit addresses. When the selected granule is 4KB or 16KB, the maximum virtual address region size is 48 bits. Similarly, output physical addresses are limited to 48 bits. It is only when the 64KB granule is used that the full 52 bits can be used 。

The starting level of address translation

 

这张表说明的是,当选择4KB的 granule时,各个entry level所利用的地址bits。假如你设置TCR_ELx.T0SZ为32,那么虚拟地址空间就只有64−TOSZ=3264−TOSZ=32位,那么对应上表,你就可以发现,已经不需要level0了,直接从level1开始就可以完全表示整个虚拟地址空间了。而如果虚拟地址空间只有30位,那么只需要从level2开始就可以完整表示整个地址空间了。也即,虚拟地址空间越小,那么所需的level也就越小。

Registers that control address translation

地址翻译是通过如下这些寄存器来配合控制的:

  • SCTLR_ELx
    • M - Enable Memory Management Unit (MMU).
    • C - Enable for data and unified caches
    • EE - Endianness of translation table walks.
  • TTBR0_ELx and TTBR1_ELx
    • BADDR - Physical address (PA) (or intermediate physical address, IPA, for EL0/EL1) of start of translation table.
    • ASID - The Address Space Identifier for Non-Global translations.
  • TCR_ELx
    • PS/IPS - Size of PA or IPA space, the maximum output addresssize.
    • TnSZ - Size of address space covered by table.
    • TGn - Granule size.
    • SH/IRGN/ORGN - Cacheability and shareability to be used by MMU table walks.
    • TBIn - Disabling of table walks to a specific table.
  • MAIR_ELx
    • Attr - Controls the Type and cacheability in Stage 1 tables.

MMU disabled

如果MMU被禁用的话,那么所有地址都是flat-mapped,即输入等于输出。

Translation Lookaside Buffer maintenance

TLB缓存的最近使用的translations,以便可以得到translation结果而不用去读tables。注意:TLB换成的translations,即从虚拟地址到硬件地址的直接映射关系,而不是translation tables。个人认为有三个原因:一是这样效率最高,直接读结果;二是entry有多个level,换成entry的话,会需要更多的空间;三是entry可能会随着配置寄存器的更改而有不同的含义,这也会给缓存的重利用造成更多负担。

这些情况下,TLB不会对其进行缓存:

• A translation fault (unmapped address).
• An address size fault (address outside of range).
• An access flag fault.

当你首次mapping一个地址的时候,并不需要issue a TLB invalidate ,而当有下列行为的时候,必须issue a TLB invalidate :

  • Unmap an address .Take an address that was previously valid or mapped and mark it as faulting.
  • Change the mapping of an address. Change the output address or any of the attributes. For example, change an address from read-only to read-write permissions.
  • Change the way the tables are interpreted. This is less common. But, for example, if the granule size was changed, then the interpretation of the tables also changes. Therefore, a TLB invalidate would be necessary.

对应的指令为TLBI <type><level>{IS|OS} {, <xt>} 

Address translation instructions

Address Translation (AT) 可以用来查询特定地址的translation结果,翻译结果和地址属性,保存在Physical Address Register, PAR_EL1 。同时,AT指令可以查询指定regime的结果,比如EL2可以查询某个EL1地址的结果,但不能反过来。因为EL2比EL1拥有更高的特权。

Check your knowledge

  • What is the difference between a stage and a level in address translation?

    stage表示的是从输入到输出的两个阶段。第一个阶段是从虚拟地址VA到中间物理地址IPA,阶段二是从IPA到物理地址PA。只有EL1/EL0的才有两个stage。

    level表示的给定stage中不同级别的tables,从大范围往小范围级级缩小。

  • What is the maximum size of a physical address?
    这是implementation决定的,最大为52bit

  • Which register field controls the size of the virtual address space?
    TCR_ELx.TnSZ, or VTCR_EL2.T0SZ for Stage 2

  • What is a translation granule, and what are the supported sizes?
    表示的是最小的内存描叙分割单元,支持4,16,64KB三种

  • What does the TLBI ALLE3 do?
    刷新所有EL3的虚拟地址空间对应的TLB entries

  • How are addresses mapped when the MMU is disabled?
    采用flat mapped,即输出等于输入

  • What is an ASID and when does a TLB entry include an ASID?
    ASID表示的当前地址对应的哪个application。. Non-Global mappings (nG=1)对应的TLBs使用ASID进行标记。

  • MMU和DMA?
    As well as the Memory Management Unit (MMU) in the processor, it is increasingly common to have MMUs for non-processor masters, such as Direct Memory Access (DMA) engines. These are referred to as SMMUs (System MMUs) in Arm systems, and elsewhere as IOMMU.

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
# 学习对象在全民造车、造芯的大时代,在努力去解决卡脖子的时代,ASIC硬件、SOC底层软件、Linux Kernel等操作系统软件(内核/驱动)、软硬件方面的系统架构师等的岗位需求也越来越明显,社会一直都是非常缺人的,缺的是核心的那一小撮、领头的那一小撮,社会所缺的更是能够软硬件融合的那一小撮人……总之,要想在这个时代,站稳自己的脚跟,能够在大公司或行业上拥有一席之地,就必需深入学习底层技术原理,核心技术才是您的看家本领。本课程设计之初,主要针对SOC底层软件开发的者、系统开发者,或者励志成为这样的人。既适合资深/高级工程师来查缺补漏,又适合初级工程师入门。(理论上该课程和ASIC硬件电路设计无关,该课程偏软件,但事实购买该课程的做ASIC的同学已然超过了15%)适用人群1、芯片开发者(包括底层软件、或做ASIC硬件的)。不限行业,例如车、云、物联网、移动端等领域;2、汽车行业开发者(主机厂、tier1、SOC厂家、各级供应商);3、嵌入式开发者、kernel开发者、驱动、软件工程师;4、学生。既适合学生从入门到精通,也适合资深工程师查缺补漏;您的收益:1、全体系的掌握ARMv8/ARMv9的核心知识点(ARM基础、异常中断GIC、MMU/Cache、architecture...);2、掌握ARM架构、掌握SOC架构、掌握常规IP(gic、smmu、timer、AXI/ACE/CHI、TZC400...);3、快速熟悉常规系统软件(bootrom、spl、ATF、TEE、bootloader、kernel...), Secureboot安全启动...4、技术水平提升N个level, 掌握快速的学习方法;# 学习什么在ARM蓬勃发展的年代,不仅仅涉及到物联网IOT、移动领域(如手机)、汽车电子领域,现在还涉及到PC、服务器的,简直就是各行各业。ARMv8出来已经有10年了,ARMv9也2年时间了。在技术不断更新迭代的背景下,此时再去学习十五年前的ARMv7、二十年前的ARMv5/v6显然不是明智的选择。本课程主要基于当前最新的架构,ARMv8的aarch64和ARMv9,如涉及具体的ARM Core IP主要还是以最新的ARM Core IP为主,软件架构也是以当前最主流的/未来所趋势的架构来讲解。以下也给大家列举初了一个ARM产品的timeline的总结(在本课程中有着大量的这种总结),从这张图中,您是可以清晰的看到本课程拥有独具一格的风格、拥有全网最新(且唯一)的资料总结或学习路线。# 本课程大纲和规划(课程持续更新中,课程总量统计:2022/10/02  当前是 61节课, 22小时)第一章:主要是快速学习: ARM简介、指令集、寄存器总结等。第二章:本系列视频的一大亮点,系统全面地讲解了arm异常中断gic等相关的软硬件知识,本人一直在倡导“学arm安全其实就是学arm架构,学arm架构其实就是学习arm的异常和中断”,异常中断是领着你进入架构的入门,是让你变成系统软硬件架构师的必走之路。第三章:安全专题,这也是本视频最核心的东西。因为你无论买书还是看博客等,你都很难找到讲解安全的教程,这里就是有和无的区别。本人系统的整理的安全的知识,带领你快速入门。第四章:mmu专题,透过事务看本质的讲解,白话式的演讲。在所有模块中,mmu也算是相对较简单模块。相信人人听得懂,人人学得会。第五章:cache专题,一切追求实事求是,不人云亦云,一切知识点都有迹可循,推翻了网络的很多观念。在众多模块中,cache算是一个比较难的模块。了解了cache后,才能算真正了解系统的软硬件架构。第六章:虚拟化,本人不擅长,会啥就随便讲点啥。(以后学会了再来补)第七章:architecture,就是零散和零碎的系统架构知识,如exclusive、arch timer、reset、系统启动、SOC设计、AMBA/AXI/ACE、DSU、WFE/WFI这样的。第八章: 新增的ARMv9 CCA/RME安全架构专题第九章:主要放置一些直播课。# 课程收益1、知道我学习什么,我要怎么去学习,从此之后有了一个明确的学习路线。2、认识一些共同目标的人,相互讨论问题,共同进步。勤学、共学、助学。3、ARM不再神秘,SOC不在神秘,让您短期内就能cover住全局4、熟悉ARM Architecture架构知识5、熟悉SOC架构知识6、熟悉主流的系统软件框架7、熟悉各项硬件原理和机制,如异常中断、MMU、cache、TLB、VMSA、Trustzone6、深入了解当前的系统架构、软硬件架构,能够看懂这些大家,将来也能够自己设计。7、熟悉系统的启动流程、Secureboot等8、熟悉各类标准和规范9、能够进入芯片厂商干活、能够在非芯片产生成为技术担当。10、学习资料的获取方法,会看11500多页的ARM手册,会看数以百计的ARM各项参考手册。 本课程会持续更新。也希望通过本课程的学习,能够让大家的ARMv8/ARMv9开发技术能有质的飞越,能找到自己心仪的工作。在购买之前,也建议大家看一看第一章第一节的课程介绍。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值