armv8/armv9 MMU深度学习

news2024/9/27 21:27:36

目录

        • 1、MMU概念介绍
        • 2、虚拟地址空间和物理地址空间
          • 2.1、(虚拟/物理)地址空间的范围
          • 2.2、物理地址空间有效位(范围)
            • 2.2.1、页表翻译相关寄存器的配置
        • 3、Translation regimes
        • 4、地址翻译/几级页表?
          • 4.1、思考:页表到底有几级?
          • 4.2、以4KB granule为例,页表的组成方式
          • 4.3、optee实际使用的示例
        • 5、页表格式(Descriptor format)
          • 5.1、ARMV8支持的3种页表格式
          • 5.2、AArch64 Long Descriptor支持的四种entry
          • 5.3、页表的属性位介绍( Block Descriptor/Page Descriptor )
          • 5.3.1、stage1的页表属性
          • 5.3.2、stage2的页表属性
          • 5.3.3、其它标志位的详细介绍
        • 6、地址翻译指令介绍
        • 7、地址翻译相关的系统寄存器总结
          • 7.1 SCTLR_ELx
          • 7.2 TTBRn_ELx
          • 7.3 TCR_ELx
          • 7.3 MAIR_ELx
        • 推荐

本文转自 周贺贺,baron,代码改变世界ctw,Arm精选, 资深安全架构专家,11年手机安全/SOC底层安全开发经验。擅长trustzone/tee安全产品的设计和开发。

思考
1、为什么要用虚拟地址?为什么要用MMU?
2、MMU硬件完成了地址翻译,我们软件还需要做什么?
3、MMU在哪里?MMU和SMMU是什么关系?


1、MMU概念介绍

MMU分为两个部分: TLB maintenanceaddress translation
在这里插入图片描述
MMU的作用,主要是完成地址的翻译,即虚拟地址到物理地址的转换,无论是main-memory地址(DDR地址),还是IO地址(设备device地址),在开启了MMU的系统中,CPU发起的指令读取、数据读写都是虚拟地址,在ARM Core内部,会先经过MMU将该虚拟地址自动转换成物理地址,然后在将物理地址发送到AXI总线上,完成真正的物理内存、物理设备的读写访问.

那么为什么要用MMU?为什么要用虚拟地址? 以下总结了三点:

  • 多个程序独立执行 — 不需要知道具体物理地址
  • 虚拟地址是连续的 — 程序可以在多个分段的物理内存运行
  • 允许操作系统管理内存 — 哪些是可见的,哪些是允许读写的,哪些是cacheable的……

既然MMU开启后,硬件会自动的将虚拟地址转换成物理地址,那么还需要我们软件做什么事情呢? 即创建一个页表翻译都需要做哪些事情呢? 或者说启用一个MMU需要软件做什么事情呢?

  • 设置页表基地址TTBR(Specify the location of the translation table)
  • 初始化MAIR_EL3 (Memory Attribute Indirection Register)
  • 配置TCR_EL3 (Configure the translation regime)
  • 创建页表 (Generate the translation tables)
  • Enable the MMU
2、虚拟地址空间和物理地址空间
2.1、(虚拟/物理)地址空间的范围

内核虚拟地址空间的范围是什么?应用程序的虚拟地址空间的范围是什么?
以前我们在学习操作系统时,最常看到的一句话是:内核的虚拟地址空间范围是3G-4G地址空间,应用程序的虚拟地址空间的范围是0-3G地址空间; 到了aarch64上,则为 : 内核的虚拟地址空间是0xffff_0000_0000_0000 - 0xffff_ffff_ffff_ffff , 应用程序的虚拟地址空间是: 0x0000_0000_0000_0000 - 0x0000_ffff_ffff_ffff.
做为一名杠精,必需告诉你这句话是错误的。错误主要有两点:
(1) arm处理器,并没有规定你的内核必需要使用哪套地址空间,以上这是Linux Kernel自己的设计,它设计了让Linux Kernel使用0xffff_0000_0000_0000 - 0xffff_ffff_ffff_ffff地址区间,Userspace使用0x0000_0000_0000_0000 - 0x0000_ffff_ffff_ffff地址区间,这里正好可以举一个反例,比如optee os,它的kernel mode和user mode使用的都是高位的虚拟地址空间。
(2) 高位是有几个F(几个1)是根据你操作系统使用的有效虚拟地址位来决定的,也并非固定的。比如optee中的mode和user mode的虚拟地址空间范围都是: 0x0000_0000_0000_0000 - 0x0000_0000_ffff_ffff

其实arm文档中有一句标准的描述 :
高位是1的虚拟地址空间,使用TTBR1_ELx基地址寄存器进行页表翻译;高位是0的虚拟地址空间,使用TTBR0_ELx基地址寄存器页表翻译。 所以不应该说,因为你使用了哪个寄存器(TTBR0/TTBR1),然后决定了你使用的哪套虚拟地址空间;应该说,你操作系统(或userspace软件)使用了哪套虚拟地址空间,决定了使用哪个哪个基地址寄存器(TTBR0/TTBR1)进行翻译。

如下便是两套虚拟地址空间和TTBRn_ELx的对应关系,其中高位的位数不是固定的16(即T1SZ和T0SZ不一定等于16)
在这里插入图片描述
以下摘自ARM文档的官方描述:

As Figure shows, for 48-bit VAs:
• The address range translated using TTBR0_ELx is 0x0000000000000000 to 0x0000FFFFFFFFFFFF.
• The address range translated using TTBR1_ELx is 0xFFFF000000000000 to 0xFFFFFFFFFFFFFFFF.
In an implementation that includes ARMv8.2-LVA and is using Secure EL3 the 64KB translation granule, for 52-bit VAs:
• The address range translated using TTBR0_ELx is 0x0000000000000000 to 0x000FFFFFFFFFFFFF.
• The address range translated using TTBR1_ELx is 0xFFF0000000000000 to 0xFFFFFFFFFFFFFFFF.
Which TTBR_ELx is used depends only on the VA presented for translation. The most significant bits of the VA must all be the same value and:
• If the most significant bits of the VA are zero, then TTBR0_ELx is used.
• If the most significant bits of the VA are one, then TTBR1_ELx is used.

2.2、物理地址空间有效位(范围)

具体每一个core的物理地址是多少位,其实都是定死的,虚拟地址是多少位,是编译或开发的时候根据自己的需要自己配置的。如下表格摘出了部分arm core的物理地址有效位,所以你具体使用多少有效位的物理地址,可以查询core TRM手册。
在这里插入图片描述

2.2.1、页表翻译相关寄存器的配置
  • ID_AA64MMFR0_EL1.PARange : Physical address size : 读取arm寄存器,得到当前系统支持的有效物理地址是多少位
    在这里插入图片描述
  • TCR_EL1.IPS : Output address size : 告诉mmu,你需要给我输出多少位的物理地址
    在这里插入图片描述
  • TCR_EL1.T0SZTCR_EL1.T1SZ : Input address size : 告诉mmu,我输入的是多少有效位的虚拟地址
    在这里插入图片描述
3、Translation regimes

内存管理单元 (MMU) 执行地址翻译。MMU 包含以下内容:

  • The table walk unit : 它从内存中读取页表,并完成地址转换
  • Translation Lookaside Buffers (TLBs) : 缓存,相当于cache

软件看到的所有内存地址都是虚拟的。 这些内存地址被传递到 MMU,它检查最近使用的缓存转换的 TLB。 如果 TLB没有找到最近缓存的翻译,那么翻译单元将从内存中读取适当的一个或多个表项目进行地址翻译,如下所示:
在这里插入图片描述
Translation tables 的工作原理是将虚拟地址空间划分为大小相等的块,并在表中为每个块提供一个entry。
Translation tables 中的entry 0 提供block 0 的映射,entry 1 提供block 1 的映射,依此类推。 每个entry都包含相应物理内存块的地址以及访问物理地址时要使用的属性。
在这里插入图片描述
在当前的ARMV8/ARMV9体系中(暂不考虑armv9的RME扩展), 至少存在以下9类Translation regime:

Secure EL1&0 translation regime, when EL2 is disabled
Non-secure EL1&0 translation regime, when EL2 is disabled
Secure EL1&0 translation regime, when EL2 is enabled
Non-secure EL1&0 translation regime, when EL2 is enabled
Secure EL2&0 translation regime
Non-secure EL2&0 translation regime
Secure EL2 translation regime
Non-secure EL2 translation regime
Secure EL3 translation regime

这9类Translation regime的地址翻译的场景如下图所示:
在这里插入图片描述
Secure and Non-secure地址空间
在REE(linux)和TEE(optee)双系统的环境下,可同时开启两个系统的MMU.
在secure和non-secure中使用不同的页表.secure的页表可以映射non-secure的内存,而non-secure的页表不能去映射secure的内存,否则在转换时会发生错误
在这里插入图片描述
Two Stage Translations
EL1&0 Translation regime处于VM(Virtual Machine)或SP(Secure Partition)时,EL2 enabled的情况下,是需要stage2转换的。对于EL2 Translation regime 和 EL3 Translation regime是没用stage2 转换的。
在这里插入图片描述

4、地址翻译/几级页表?
4.1、思考:页表到底有几级?

从以下图来看,有的页表从L2开始,有得从L1开始,有的从L0开始,还有从L-1开始的,都是到L3终止。
那么我们的页表到底有几级呢?
在这里插入图片描述

4.2、以4KB granule为例,页表的组成方式

在这里插入图片描述

  • 除了第一级index(这里是leve 0 table中的index),每一个查找table/page的index都是9个bit,也就是说除了第一级页表,后面的每一级table都是有512个offset
  • 如果VA_BIT = 39,那么leve 0 table用BIT[38:39]表示,只有1个offset
  • 如果VA_BIT = 48,那么leve 0 table用BIT[47:39]表示,有512个offset
  • 如果VA_BIT > 48,那是不存在的,因为arm规定,大于48的,只有一个,那就是VA_BIT=52,并且规定该情况下的最小granue size=64KB,而我们这里讲述的是granue size=4KB的情况
  • 如果VA_BIT = 32,那么leve 0 table就不用了,TTBR_ELx指向Level 1 table
  • 另外我们还需注意一点,在Level 0 table中,他只能指向D_Table,不能指向D_Block

以下针对虚拟地址是48有效位的情形做了一个总结:
在这里插入图片描述

4.3、optee实际使用的示例

32位有效虚拟地址、,3级页表查询(L1、L2、L3),颗粒的位4KB
在这里插入图片描述

如下展示是optee os的页表结构,TTBR0_EL1指向L1 Table,L1 Table中有4个表项,但只用了3个 , 也就对应着3张L2 Table.
在这里插入图片描述
配置相关的代码如下:
在这里插入图片描述

5、页表格式(Descriptor format)
5.1、ARMV8支持的3种页表格式
  • AArch64 Long Descriptor : 我们只学习这个
  • Armv7-A Long Descriptor : for Large Physical Address Extension (LPAE)
  • Armv7-A Short Descriptor
5.2、AArch64 Long Descriptor支持的四种entry

对于AArch64 Long Descriptor,又分为下面四种entry:

  • An invalid or fault entry.
  • A table entry, that points to the next-level translation table.
  • A block entry, that defines the memory properties for the access.
  • A reserved format

注意:entry[1:0] 表示该entry属于哪类entry, Block Descriptor和Page Descriptor是一个意思。在当前架构中,reserved也是invalid。
在这里插入图片描述

5.3、页表的属性位介绍( Block Descriptor/Page Descriptor )
5.3.1、stage1的页表属性

(Attribute fields in stage 1 VMSAv8-64 Block and Page descriptors)
在这里插入图片描述

  • PBHA, bits[62:59] :for FEAT_HPDS2
  • XN or UXN, bit[54] : Execute-never or Unprivileged execute-never
  • PXN, bit[53] :Privileged execute-never
  • Contiguous, bit[52] : translation table entry 是连续的,可以存在一个TLB Entry中
  • DBM, bit[51] :Dirty Bit Modifier
  • GP, bit[50] :for FEAT_BTI
  • nT, bit[16] :for FEAT_BBM
  • nG, bit[11] :缓存在TLB中的翻译是否使用ASID标识
  • AF, bit[10] : Access flag, AF=0后,第一次访问该页面时,会将该标志置为1. 即暗示第一次访问
  • SH, bits[9:8] :shareable属性
  • AP[2:1], bits[7:6] :Data Access Permissions bits,
  • NS, bit[5] :Non-secure bit
  • AttrIndx[2:0], bits[4:2] :
5.3.2、stage2的页表属性

(Attribute fields in stage 2 VMSAv8-64 Block and Page descriptors)
在这里插入图片描述

  • PBHA[3:1], bits[62:60] :for FEAT_HPDS2
  • PBHA[0], bit[59] :for FEAT_HPDS2
  • XN[1:0], bits[54:53] :Execute-never
  • Contiguous, bit[52] :translation table entry 是连续的,可以存在一个TLB Entry中
  • DBM, bit[51] :Dirty Bit Modifier
  • nT, bit[16] :for FEAT_BBM
  • FnXS, bit[11] :for FEAT_XS
  • AF, bit[10] :Access flag
  • SH, bits[9:8] :shareable属性
  • S2AP, bits[7:6] :Stage 2 data Access Permissions
  • MemAttr, bits[5:2] :
5.3.3、其它标志位的详细介绍

(1)、MemAttr
指向MAIR_ELx寄存器中的attrn属性域,表示内存的缓存属性,如cachable、shareable等

(2)、NS
Non-secure比特 表示转换后的物理地址是secure的还是non-secure的。

(3)、AP
Data access permissions 数据访问权限
在这里插入图片描述
(4)、SH
shareable属性
在这里插入图片描述

(5)、AF
Access flag, AF=0后,第一次访问该页面时,会将该标志置为1. 即暗示第一次访问
(6)、nG
对于 EL0/EL1 虚拟地址空间,Page Descriptor属性字段中的 nG 位将转换标记为Gloabl(G) 或non-Gloabl(nG)。例如,内核映射是Gloabl(G)翻译,应用程序映射是non-Gloabl翻译。Gloabl翻译适用于当前正在运的任何应用程序。非全局翻译仅适用于特定应用程序

non-Gloabl映射在 TLB 中使用 ASID进行标记。在 TLB 查找时,将 TLB 条目中的 ASID 与当前选择的 ASID 进行比较。如果它们不匹配,则不使用TLB 条目。下图显示了内核空间中没有 ASID 标记的全局映射和用户空间中具有 ASID 标记的非全局映射
在这里插入图片描述

(7)、XN or UXN
特权和非特权不可从该memory-region中执行指令的标志位:
Execute-never
Unprivileged execute-never

6、地址翻译指令介绍

address translation的指令大约14个:
在这里插入图片描述
总结一下:
在这里插入图片描述

7、地址翻译相关的系统寄存器总结

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

7.1 SCTLR_ELx

在这里插入图片描述
在这里插入图片描述

系统控制寄存器,控制着MMU、I-cache、D-cache的打开与关闭,也控制着translation table walks访问内存的大小端。

  • M - Enable Memory Management Unit (MMU).
  • C - Enable for data and unified caches.
  • EE - Endianness of translation table walks.
7.2 TTBRn_ELx

在这里插入图片描述
在这里插入图片描述

  • BADDR : 基地址
  • ASID :TLB entry区分user程序所用的ASID
7.3 TCR_ELx

在ARM Core中(aarch64),有三个Translation Control Register 寄存器:
在这里插入图片描述

在这里插入图片描述

比特位功能说明
ORGN1、IRGN1、ORGN0、IRGN0cacheable属性outer/inner cableability的属性(如直写模式、回写模式)
SH1、SH0shareable属性cache的共享属性配置(如non-shareable, outer/inner shareable)
TG0/TG1Granule sizeGranule size(其实就是页面的大小,4k/16k/64k)
IPS物理地址size物理地址size,如32bit/36bit/40bit
EPD1、EPD0-TTBR_EL1/TTBR_EL0的enable和disable
TBI1、TBI0-top addr是ignore,还是用于MTE的计算
A1-ASID的选择,是使用TTBR_EL1中的,还是使用TTBR_EL0中的
AS-ASID是使用8bit,还是使用16bit
7.3 MAIR_ELx

内存属性寄存器,分为8个Attrn,所以一个core,最多只支持8中内存属性。
页表中的每一个entry,都会指向一个Attr域。
在这里插入图片描述


推荐
  • ARMv8/ARMv9架构从入门到精通 --博客专栏
  • 《Armv8/Armv9架构从入门到精通 第二期》 --大课程
  • 8天入门ARM架构 --入门课程

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

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

相关文章

《日期类》的模拟实现

目录 前言: 头文件类与函数的定义Date.h 实现函数的Date.cpp 测试Test.cpp 运行结果: 前言: 我们在前面的两章初步学习认识了《类与对象》的概念,接下来我们将实现一个日期类,是我们的知识储备更加牢固。 头文件…

Android Gradle 开发与应用 (五) : 基于Gradle 8.2,创建Gradle插件

1. 前言 本文介绍在Android中,如何基于Gradle 8.2,创建Gradle插件。 1.1 本文环境 Android Studio 版本 : Android Studio Hedgehog | 2023.1.1Gralde版本 : gradle 8.2 使用 Android Gradle 插件升级助理 Android Gradle 插件版本说明 1.2 为什么要写…

【C语言】——详解操作符(下)

【C语言】——详解操作符(下) 前言七、关系操作符八、逻辑操作符8.1、& 与运算符8.2、 | 或运算符 九、条件操作符十、逗号表达式十一、下标引用与函数调用操作符11.1、[ ] 下标引用操作符11.2、( ) 函数调用操作符 十二、 结构成员操作符12.1、…

转移表回调函数实现

回调函数实现 计算器的模拟(函数指针数组的使用)(回调函数) 简化 冗余 老的代码的问题就是 冗余 写死 不能完成不同的任务 函数调用的时候只需要知道地址就可以 calc计算器 这里也称之为转移表 #define _CRT_SECURE_NO_WAR…

朴素贝叶斯 | 多分类问题

目录 一. 贝叶斯公式的推导二. 朴素贝叶斯1. 离散的朴素贝叶斯朴素贝叶斯导入示例 离散的朴素贝叶斯训练 2. 连续的朴素贝叶斯3. 伯努利朴素贝叶斯4. 多项式朴素贝叶斯4.1 Laplace平滑4.2 Lidstone平滑 三. 概率图模型1. 贝叶斯网络(Bayesian Network)1.1 全连接贝叶斯网络1.2 …

【Redis系列】深入了解 Redis:一种高性能的内存数据库

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

分布式搜索elasticsearch

1.初识elasticsearch 1.1.了解ES 1.1.1.elasticsearch的作用 elasticsearch是一款非常强大的开源搜索引擎,具备非常多强大功能,可以帮助我们从海量数据中快速找到需要的内容 例如: 在GitHub搜索代码 在电商网站搜索商品 在百度搜索答案…

25 使用块的网络 VGG【李沐动手学深度学习v2课程笔记】

目录 1. VGG块 2. VGG网络 3. 训练模型 4. 小结 虽然AlexNet证明深层神经网络卓有成效,但它没有提供一个通用的模板来指导后续的研究人员设计新的网络。 与芯片设计中工程师从放置晶体管到逻辑元件再到逻辑块的过程类似,神经网络架构的设计也逐渐变得…

【Linux】文件系统扩展——软硬链接

目录 对文件建立软硬链接 软链接 硬链接 对文件建立软硬链接 对 log 文件建立软链接: ln -s log log.soft.link 对 test 文件建立硬链接: ln test test.hard.link log.soft.link 和 test.hard.link 在 Linux 中都只是文件名,为了方便…

Math类 --Java学习笔记

Math 代表数学,是一个工具类,里面提供的都是对数据进行操作的一些静态方法 Math提供的常用方法

springBoot--静态资源映射

静态资源映射 前言1、通过继承 WebMvcConfigurerAdapter 来实现2、在 application.properties 配置 前言 在 web 开发中,静态资源的访问是必不可少的,如图片、js、css等资源的访问 1、通过继承 WebMvcConfigurerAdapter 来实现 即如果使用了 EnableWe…

web前端框架

目前比较火热的几门框架: React React是由Facebook(脸书)开发和创建的开源框架。React 用于开发丰富的用户界面,特别是当您需要构建单页应用程序时。它是最强大的前端框架。 弊端: 您不具备 JavaScript 的实践知识,则建议不要使用 React。同样&#x…

后端八股笔记------框架篇

👆是单例,不是线程安全 上上图中的count变量在单例bean中就是不安全的。 有fetchType"lazy"的情况就是懒加载,不调用就不加载。 没有"lazy"的情况就不是懒加载。

小迪安全36WEB 攻防-通用漏洞XSS 跨站MXSSUXSSFlashXSSPDFXSS

#XSS跨站系列内容:1. XSS跨站-原理&分类&手法 XSS跨站-探针&利用&审计XSS跨站另类攻击手法利用 XSS跨站-防御修复&绕过策略 #知识点: 1、XSS 跨站-原理&攻击&分类等 2、XSS 跨站-MXSS&UXSS&FlashXss&PDFXSS 等 1、原…

【数据结构与算法】绪论

目录 一、数据结构研究 二、基本概念和术语 2.1 基本概念 2.2 什么是数据结构? 2.3 数据结构内容 2.4 逻辑结构种类 2.5 存储结构种类 2.6 数据类型和抽象数据类型 三、算法和算法分析 3.1 算法的定义 3.2 算法的特性 3.3 算法设计要求 3.4 算法好坏评…

mediapipe 实现姿态分析——举手检测

目录 人体姿态检测 效果展示 举手检测 行业应用 代码实现 代码分析 效果展示 代码修改,一只手举起即可 总结 啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦^_^啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦♪(^∇^*)啦啦啦…

计算机网络 —— 运输层

运输层 5.1 运输层概述 运输层的主要任务是,如何为运行在不同主机上的应用进程提供直接的通信服务。运输层协议又称为端到端协议。 根据应用需求的不同,因特网的运输层为应用层提供了两种不同的运输协议,即面向连接的TCP和无连接的UDP 5.2…

VBA(学习笔记)

1. 数据类型 变量定义:Dim 变量名 As 数据类型 变量赋值:变量名 值 1.1 数值型 1.1.1 整数 (1) Byte:1字节(0~255) (2) Integer:2字节(-32768~32767) (3) Long:4…

ubuntu18.04下zookeeper安装与简单使用

下载与解压 官网下载地址 Apache ZooKeeper 解压 tar -zxvf zookeeper-3.4.10.tar.gz 环境准备 zookeeper基于java开发,因此首先需要安装java的jdk包 sudo apt-get install openjdk-8-jdk修改配置 进入解压目录里的conf文件夹内 mv zoo_sample.cfg zoo.cfg …

表单进阶(6)-字段集

带框的字段集用fieldse &#xff0c;字段集标头用legent 选中的样式&#xff1a; 圆点用radio&#xff0c;方框用checkbox <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" cont…