MMU概念介绍

MMU分为两个部分: TLB maintenance 和 address translation

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

下图是一个linux kernel系统中宏观的虚拟地址到物理地址转换的视图,可以看出在MMU进行地址转换时,会依赖TTBRx_EL1寄存器指向的一个页表基地址。其中,TTBR1_EL1指向特权模式的页表基地址,用于特权模式下的地址空间转换;TTBR0_EL0指向非特权模式的页表基地址,用于非特权模式下的地址空间转换。刚刚我们也提到,CPU发出读写后, MMU会自动的将虚拟地址转换为为例地址,那么我们软件需要做什么呢?我们软件需要做的其实就是管理这个页表,按照ARM的技术要求去创建一个这样的页表,然后再将其基地址写入到TTBR1_EL1或TTBR0_EL1。当然,根据实际的场景和需要,这个基地址和页表中的内容都会发生动态变化。例如,两个user进程进行切换时,TTBR0_EL1是要从一个user的页表地址,切换到另外一个user的页表地址。

MMU地址翻译的过程

using a 64KB granule with a 42-bit virtual address space,地址翻译的过程(只用到一级页表的情况):

使用二级页表的情况举例:

在secure和non-secure中使用MMU

TTBRx_EL1是banked的,在linux和optee双系统的环境下,可同时开启两个系统的MMU。在secure和non-secure中使用不同的页表.secure的页表可以映射non-secure的内存,而non-secure的页表不能去映射secure的内存,否则在转换时会发生错误。

在不同异常等级中使用MMU

在ARMV8-aarch64架构下,页表基地址寄存器有:

  • TTBR0_EL1 – banked

  • TTBR1_EL1 – banked

  • TTBR1_EL2

  • TTBR1_EL3

在EL0/EL1的系统中,MMU地址转换时,如果虚拟地址在0x00000000_ffffffff - 0x0000ffff_ffffffff范围,MMU会自动使用TTBR0_EL1指向的页表,进行地址转换;如果虚拟地址在0xffff0000_ffffffff - 0xffffffff_ffffffff范围,MMU会自动使用TTBR1_EL1指向的页表,进行地址转换。

在EL2系统中,MMU地址转换时,会自动使用TTBR2_EL1指向的页表。

在EL3系统中,MMU地址转换时,会自动使用TTBR3_EL1指向的页表

memory attributes介绍

translation tables为每一块region(entry)都定义了一个memory attributes条目,如同下面这个样子(以linux kernel为例,在创建页表的时候,应该会设置这个memory attributes,有待看代码去验证):

• Unprivileged eXecute Never (UXN) and Privileged eXecute Never (PXN) are execution permissions. • AF is the access flag. • SH is the shareable attribute. • AP is the access permission. • NS is the security bit, but only at EL3 and Secure EL1. ---- secure权限配置 • Indx is the index into the MAIR_ELn

在这块region(entry)的memory attributes条目中的BIT4:2(index)指向了系统寄存器MAIR_ELn中的attr,MAIR_ELn共有8中attr选择。

而每一个attr都有一种配置:

memory tagging介绍

When tagged addressing support is enabled, the top eight bits [63:56] of the virtual address are ignored by the processor. It internally sets bit [55] to sign-extend the address to 64-bit format. The top 8 bits can then be used to pass data. These bits are ignored for addressing and translation faults. The TCR_EL1 has separate enable bits for EL0 and EL1

如果使用memory tagging, 虚拟地址的[63:56]用于传输签名数据,bit[55]表示是否需要签名.TCR_EL1也会有一个bit区分是给EL0用的还是给EL1用的

启用hypervisor

如果启用了hypervisor那么虚拟地址转换的过程将有VA—>PA变成了VA—>IPA—>PA, 也就是要经过两次转换.在guestos(如linux kernel)中转换的物理地址,其实不是真实的物理地址(假物理地址),然后在EL2通过VTTBR0_EL2基地址的页表转换后的物理地址,才是真实的硬件地址。

IPA : intermediate physical address

Access permissions

Access permissions are controlled through translation table entries. Access permissions control whether a region is readable or writeable, or both, and can be set separately to EL0 for unprivileged and access to EL1, EL2, and EL3 for privileged accesses, as shown in the following table

参考 :SCTLR_EL1.WXN、SCTLR.UWXN执行权限:

  • non-executable (Execute Never (XN))

  • The Unprivileged Execute Never (UXN)

  • Privileged Execute Never (PXN)

MMU/cache相关的寄存器总结

MMU(address translation /TLB maintenance)、cache maintenance相关的寄存器

  1. address translation

address translation 共计14个寄存器

  1. TLB maintenance

TLB maintenance数十个寄存器

  1. cache maintenance

  1. Base system registers

系统寄存器中, 和MMU/Cache相关的寄存器有:

TTBR0_ELx TTBR1_ELx

(aarch64)

  • TTBR0_EL1

  • TTBR0_EL2

  • TTBR0_EL3

  • TTBR1_EL1

  • VTTBR_EL2

(aarch32)

  • TTBR0

  • TTBR1

  • HTTBR

  • VTTBR

TCR_ELx

(aarch64)

  • TCR_EL1

  • TCR_EL2

  • TCR_EL3

  • VTCR_EL2

(aarch32)

  • TTBCR(NS)

  • HTCR

  • TTBCR(S)

  • VTCR

MAIR_ELx

  • MAIR_EL1

  • MAIR_EL2

  • MAIR_EL3

系统寄存器 — TCR寄存器介绍

在ARM Core中(aarch64),还有几个相关的系统寄存器:

  • TCR_EL1 banked

  • TCR_EL2

  • TCR_EL3

  1. T1SZ、T0SZ

  • T1SZ, bits [21:16] 通过TTBR1寻址的内存区域的大小偏移量,也就是TTBR1基地址下的一级页表的大小

  • T0SZ, bits [5:0]

  1. ORGN1、IRGN1、ORGN0、IRGN0

其实可以总结为这样:

  1. SH1、SH0

其实可以总结为这样:

Shareable的很容易理解,就是某个地址的可能被别人使用。我们在定义某个页属性的时候会给出。Non-Shareable就是只有自己使用。当然,定义成Non-Shareable不表示别人不可以用。某个地址A如果在核1上映射成Shareable,核2映射成Non-Shareable,并且两个核通过CCI400相连。那么核1在访问A的时候,总线会去监听核2,而核2访问A的时候,总线直接访问内存,不监听核1。显然这种做法是错误的。

对于Inner和Outer Shareable,有个简单的的理解,就是认为他们都是一个东西。在最近的ARM A系列处理器上上,配置处理器RTL的时候,会选择是不是把inner的传输送到ACE口上。当存在多个处理器簇或者需要双向一致性的GPU时,就需要设成送到ACE端口。这样,内部的操作,无论inner shareable还是outershareable,都会经由CCI广播到别的ACE口上。

  1. TG0/TG1 - Granule size

  1. IPS

  1. EPD1、EPD0

  1. TBI1、TBI0

  1. A1

  1. AS

除了以上介绍的bit之外,剩余的bit都是特有功能使用或reserved的

代码使用示例展

设置inner/outer cache的属性(只写模式/回写模式/write allocate/No-write allocate)

#define TCR_IRGN_WBWA  ((UL(1) << 8) | (UL(1) << 24))   //使用TTBR0和使用TTBR1时后的inner cache的属性设置#define TCR_ORGN_WBWA  ((UL(1) << 10) | (UL(1) << 26))   //使用TTBR0和使用TTBR1时后的outer cache的属性设置#define TCR_CACHE_FLAGS TCR_IRGN_WBWA | TCR_ORGN_WBWA   // inner + outer cache的属性值ENTRY(__cpu_setup)
....../** Set/prepare TCR and TTBR. We use 512GB (39-bit) address range for* both user and kernel.*/ldr x10, =TCR_TxSZ(VA_BITS) | TCR_CACHE_FLAGS | TCR_SMP_FLAGS | \TCR_TG_FLAGS | TCR_ASID16 | TCR_TBI0 | TCR_A1tcr_set_idmap_t0sz x10, x9......msr tcr_el1, x10ret     // return to head.S
ENDPROC(__cpu_setup)

属性设置了1,也就是回写模式、write allocate模式。

5T技术资源大放送!包括但不限于:C/C++,Arm, Linux,Android,人工智能,单片机,树莓派,等等。在上面的【人人都是极客】公众号内回复「peter」,即可免费获取!!

 记得点击分享在看,给我充点儿电吧

一文搞懂 | ARM MMU相关推荐

  1. 一文搞懂 | ARM微架构的变化

    一.引言 伴随智能手机的高速发展,移动处理器架构设计厂商ARM公司几乎每年都更新CPU的核心架构.从2018至2020年,ARM公司基于ARMv8架构推出了三代Cortex-A76.Cortex-A7 ...

  2. 教你彻底搞懂ARM Cortex-A75 CPU的数字后端实现报告

    教你彻底搞懂ARM Cortex-A75 CPU的数字后端实现报告 文章右侧广告为官方硬广告,与吾爱IC社区无关,用户勿点.点击进去后出现任何损失与社区无关. 下图为 ARM 公司 release 的 ...

  3. 一文搞懂RNN(循环神经网络)

    基础篇|一文搞懂RNN(循环神经网络) https://mp.weixin.qq.com/s/va1gmavl2ZESgnM7biORQg 神经网络基础 神经网络可以当做是能够拟合任意函数的黑盒子,只 ...

  4. 一文搞懂 Python 的 import 机制

    一.前言 希望能够让读者一文搞懂 Python 的 import 机制 1.什么是 import 机制? 通常来讲,在一段 Python 代码中去执行引用另一个模块中的代码,就需要使用 Python ...

  5. python语言语句快的标记是什么_一文搞懂Python程序语句

    原标题:一文搞懂Python程序语句 程序流 Python 程序中常用的基本数据类型,包括: 内置的数值数据类型 Tuple 容器类型 String 容器类型 List 容器类型 自然的顺序是从页面或 ...

  6. 怎么看电脑系统是win几_一文看懂arm架构和x86架构有什么区别

    一文看懂arm架构和x86架构有什么区别 本文主要介绍的是arm架构和x86架构的区别,首先介绍了ARM架构图,其次介绍了x86架构图,最后从性能.扩展能力.操作系统的兼容性.软件开发的方便性及可使用 ...

  7. 一文搞懂 Java 线程中断

    转载自   一文搞懂 Java 线程中断 在之前的一文<如何"优雅"地终止一个线程>中详细说明了 stop 终止线程的坏处及如何优雅地终止线程,那么还有别的可以终止线程 ...

  8. 一文搞懂HMM(隐马尔可夫模型)-Viterbi algorithm

    ***一文搞懂HMM(隐马尔可夫模型)*** 简单来说,熵是表示物质系统状态的一种度量,用它老表征系统的无序程度.熵越大,系统越无序,意味着系统结构和运动的不确定和无规则:反之,,熵越小,系统越有序, ...

  9. 一文搞懂如何使用Node.js进行TCP网络通信

    摘要: 网络是通信互联的基础,Node.js提供了net.http.dgram等模块,分别用来实现TCP.HTTP.UDP的通信,本文主要对使用Node.js的TCP通信部份进行实践记录. 本文分享自 ...

最新文章

  1. 小型企业Exchange server 2010高可用性方案要注意咯!
  2. 关于MyEclipse连接SQLServer和Mariadbsql
  3. labview将产生数据存入数组 并保存成Excel
  4. 证券业震荡,数字化智能化变革、升级与突破或是新生力量(附案例)
  5. 在sts中springboot工程的maven解析异常处理
  6. 8口PoE网口供电交换机适用环境介绍
  7. ABBYY FineReader 12扫描对页的步骤有哪些
  8. 每日一题[LeetCode 689]三个无重叠子数组的最大和
  9. flask前端优化:css/js/html压缩
  10. otsu结合OpenCV实现灰度图像自动阈值处理
  11. 人类究竟需要什么样的微积分原理
  12. 手把手教你使用《ProxyMan》抓取App接口
  13. Cisco路由器密码重置
  14. MATLAB中linspace函数使用
  15. keil 不能F12跳转到定义
  16. 大二下-企业级信息系统设计与开发笔记18(Spring Boot整合Redis)
  17. r 语言计算欧氏距离_R语言-KNN算法
  18. Android BLE HIDS Data ,从问询DB 到写入Android 节点的flow 之四
  19. IPFS未来展望,迎接Web3.0新潮流
  20. UPUPOO返回码格式!!!

热门文章

  1. Python if-for-while使用
  2. 简单用spyder画函数图像
  3. MySQL普通索引和唯一索引的区别
  4. Mac 下FTP软件
  5. 数据库应用 --- Yelp Data Analysis Application
  6. Sophus库的安装和使用教程
  7. 用友与阿里云共建社会化商业新生态
  8. day6 面向对象
  9. Python中的ULM类图
  10. 对话Bitcherry价值通证BCHC现状与未来:“百舸争流”到“价值至上”