【ARM】一文带你深入解读MMU

memory-map

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

虚拟地址作用

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

软件需要做什么

虚拟地址到物理地址怎么翻译是由软件来决定的,翻译的动作是由硬件来实现的

  • 设置页表基地址TTBR(translation table base address)
    • 初始化MAIR_EL3 (Memory Attribute Indirection Register),用来配置当前寄存器支持哪些内存属性
    • 配置TCR_EL3 (Configure the translation regime),告诉MMU输入输入多少位虚拟地址,你给我输出多少位物理地址,granule size是多少,页表的内存属性是什么…
    • 创建页表 (Generate the translation tables)
    • Enable the MMU
    页表中每一行叫一个页表项,也叫entry,一般是64bit

系统中的MMU

一个core中有一个MMU
在这里插入图片描述
后面部分是硬件厂商定义好的,调用某部分的物理地址就是调用对应的硬件设备

页表也是可以缓存到cache中的

在这里插入图片描述
Device通过SMMU与DDR相连时,Device和Core一般也是用相同的一份页表
在这里插入图片描述

MMU和cache之间的关系

cache和mmu之间是相互影响的:

  • MMU页表entry中的属性,会影响到cache的缓存策略
    • cache缓存中也是可以存储MMU页表的

以下配置都是支持:

  • MMU和cache都enabled的
  • MMU和cache都disabled的
  • MMU是enabled,cache是disabled
  • MMU是disabled,cache是enabled
    大多数用前两种
    在这里插入图片描述
    MMU和SMMU是同一份页表
    多核架构中,不同CPU使用的页表一般是同一份,也可以不是同一份

MMU的好处:

  1. 应用程序独立执行,由独立的地址空间
  2. 程序的虚拟地址是连续的,物理地址可以不连续
  3. 权限的管理,内存属性的管理

MMU的主要功能

  1. 地址翻译
  2. 权限管理
  3. cache的缓存策略和共享策略

地址空间

访问内存的2中方式(内存不仅仅指DDR):
1,访问系统寄存器方式
2,memory-map
在这里插入图片描述

物理地址空间

core发出的寻址空间
在这里插入图片描述

虚拟地址空间

在这里插入图片描述
如果虚拟地址落入低地址空间,那么在翻译时自动使用TTBR0作为它的基地址;同样,当虚拟地址落入高地址空间,那么在翻译时自动使用TTBR1作为它的基地址。

地址空间的配置

core的种类繁多,需要告诉操作系统当前core可输出的物理地址是多少位的操作系统读取ID寄存器,即可获取core可输出的物理地址。
在这里插入图片描述
需要告诉MMU,我输入的虚拟地址是多少位,你需要给我输出多少位的物理地址:
• Output address size – 告诉mmu,你需要给我输出多少位的物理地址
• Input address size – 告诉mmu,我输入的是多数为的虚拟地址
(1)TCR_ELx.T0SZ定义使用TTBR0_ELx时,VA地址的size
(2)TCR_ELx.T1SZ定义使用TTBR1_ELx时,VA地址的size
在这里插入图片描述

Translation Regime

MMU模型

在这里插入图片描述

Translation regimes模型

有9类Translation regime
在这里插入图片描述
Secure EL1&0 translation regime:当EL2被禁用时,这是一个单步转换机制,支持两个虚拟地址范围,使用TTBR0_EL1和TTBR1_EL1寄存器。
在这里插入图片描述
Secure EL3 translation regime:在最高异常级别,这是一个单步转换机制,只支持一个虚拟地址范围,使用TTBR0_EL3寄存器。
在这里插入图片描述
Non-secure EL1&0 translation regime:与Secure EL1&0类似,但用于非安全状态,同样支持两个虚拟地址范围。
在这里插入图片描述
Secure EL2&0 translation regime:当EL2被启用时,这是一个两步转换机制,也支持两个虚拟地址范围,使用TTBR0_EL2和TTBR1_EL2寄存器。
在这里插入图片描述
在这里插入图片描述

Secure and Non-secure addresses

在这里插入图片描述
Secure侧的可以通过页表去访问非安全的内存

Two Stage Translations

VA——》stage1——》IPA——》stage2——》PA
在这里插入图片描述
只有EL0和EL1,并且Hypervisor打开的时候才有stage1和stage2。

Stage1 Translation regimes

在这里插入图片描述

Stage2 Translation regimes

6

页表翻译的过程

页表有多少级

无论有多少级最高级就是L3,可以到L-1,L-2。

在里插入图片描述

需要告诉MMU的信息

在这里插入图片描述

Translation Tables 总结

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

Armv8/Armv9内存属性

只有两个,外设和ddr都可以配置成Normal memory或者是Device memory,这是由软件来决定和配置的。

Normal memory

Shareability attributes for Normal memory
- Inner Shareable, and Outer Shareable Normal memory
- Non-shareable Normal memory

Cacheability attributes for Normal memory

  • Write-Through Cacheable.
  • Write-Back Cacheable.
  • Non-cacheable.
    在这里插入图片描述
Device memory

• Device-nGnRnE:处理器必须严格按照代码中内存访问来进行、必须严格执行program order(无需重排序)、写操作的ack必须来自最终的目的地
• Device-nGnRE:处理器必须严格按照代码中内存访问来进行、必须严格执行program order(无需重排序)、写操作的ack可以来自中间的write buffer
• Device-nGRE:处理器必须严格按照代码中内存访问来进行、内存访问指令可以进行重排、写操作的ack可以来自中间的write buffer
• Device-GRE:处理器对多个memory的访问是否可以合并、内存访问指令可以进行重排、写操作的ack可以来自中间的write buffer。

➨Gathering和non Gathering(G or nG):表示对多个memory的访问是否可以合并,如果是nG,表示处理器必须严格按照代码中内存访问来进行,不能把两次访问合并成一次。例如:代码中有2次对同样的一个地址的读访问,那么处理器必须严格进行两次read transaction(访问内存是否可以合并)
➨Reordering(R or nR):表示是否允许处理器对内存访问指令进行重排。nR表示必须严格执行program order(是否可以重新排序)
➨Early Write Acknowledgement(E or nE):PE访问memory是有问有答的(更专业的术语叫做transaction),对于write而言,PE需要write ack操作以便确定完成一个write transaction。为了加快写的速度,系统的中间环节可能会设定一些write buffer。nE表示写操作的ack必须来自最终的目的地而不是中间的write buffer。

在这里插入图片描述

内存的shareable属性

在这里插入图片描述
在这里插入图片描述
00代表non-shareable
01不用
10代表Outer shareable
11代表Inner shareable
只有TCR_EL1.DS=0时,SH[9:0]就做为shareability属性位;否则就做为物理地址位,

MAIR_Elx中的cacheable属性

图1
AttrIndx中的0-2三个bit正好可以表示8个Attr
在这里插入图片描述

在这里插入图片描述

每个Attr8个bit,如果前面四个是0后面两个是0,就表示Device memory;然后再看dd的部分,分别对应四种。
如果前面四个是0,后面两个不是0,就没用。
如果是ooooiiii,就代表Normal memory,分发的意义如下图所示。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
D_table代表这条entry指向的不是物理页面,而是下一级页表的基地址;
D_page指向的是一个物理页面,D_page中可以读取一个物理地址,D_page中还有权限管理的信息和内存属性的配置(有shareable和cacheable属性)。

• TCR的ORGN0、IRGN0、ORGN1、IRGN1表示Translation Table Walk访问页表的缓存策略
• TCR的SH0、SH1表示Translation Table Walk访问页表的共享策略
• 当TCR_EL1.DS=1时,TCR的SH0、SH1也表示CPU访问内存的共享策略
• 页表descriptor的attrIndex指向的mair属性表示CPU访问内存的缓存策略
• 页表descriptor的SH位表示CPU访问内存的共享策略(前提TCR_EL1.DS=0)

domain

在这里插入图片描述

Inner shareable:在每一个Inner shareable中都有一组观察者,在这个Inner shareability domain内他们看到的内存属性一致的。
shareability domain由硬件ASIC定义,软件不能修改。一般来讲,会把系统里的AP都定义成Inner shareability domain
在这里插入图片描述

stage1和stage2以及属性的叠加

stage1在这里插入图片描述

stage2在这里插入图片描述
有上可知每个stage中都可以配置SH属性、读写属性等,但如果一个VA到PA时需要两个阶段,但是两个阶段配置的属性不相同怎么办,这就是接下来我们要说的属性的叠加。
stage2的后MenAttr[3:0]表示cacheability属性,如下图所示:
在这里插入图片描述

Cacheable属性的叠加

在这里插入图片描述
总结:只要stage1或stage2中有一个是Non-cacheable,最后的结果就是Non-cacheable;只要有一个是Write-Through最后结果就是Write-Through。

Device内存的叠加

在这里插入图片描述
总结:以限制最多的那个为最后的结果

数据访问权限叠加

  • 如果stage1阶段就禁止访问,不用看stage2,结果就是禁止访问。
  • 如果stage1阶段允许访问,stage2禁止访问,结果就是禁止访问。
  • 如果stage1、stage2都允许访问,结果就是允许访问。

执行权限的叠加

  • 如果去取一个指令,stage1不允许,不管stage2;
  • 如果stage1允许,不管stage2不允许,不管stage1;
  • 如果都允许,就是允许。

Shareable属性叠加

在这里插入图片描述
总结:有Outer Shareable的最后结果就是Outer Shareable;在Inner Shareable和Non-Shareable中,最后结果就是Inner Shareable。以共享权限策略最大的为准。

读写权限叠加

在这里插入图片描述

页表不同层次的属性叠加

在这里插入图片描述
PXNTable=0表示允许特权指令的执行;PXNTable=1表示不允许特权指令的执行。
在图中,Level0是higher level entries,Level2是lower level entries.如果在lower level entries中置1,则override该比特位;如果在lower level entries中清0,则不影响,相当于没修改。

Descriptor

Translation regimes

在这里插入图片描述
Table Walk Unit会从memory中读取Translation Tables(就是从虚拟地址到物理地址的翻译规则)
页表项、descriptor和entry都是一个意思。

一条entry的展开如下图所示。中间空的17-49表示物理地址
在这里插入图片描述
此图中的所有属性:特权/非特权还是读/写都在上图中配置
在这里插入图片描述

descriptor

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

stage1Descriptor格式

在这里插入图片描述
• UXN , bit[54] :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] :指向MAIR系统寄存器,cache的缓存策略属性
在这里插入图片描述
11代表Table entry
01代表block entry(page entry)

UXN PXN配置内存的可执行权限

在这里插入图片描述

UXN , bit[54] :Unprivileged execute-never field
PXN, bit[53] :Privileged execute-never
AP[2:1], bits[7:6] :Data Access Permissions bits,

配置内存的读写权限

在这里插入图片描述

Contiguous

Translation table entry 是连续的,多条翻译可以存在一个TLB Entry中

AF

• 如果使用software management机制
AF=0时,表示该Translation descriptor没有缓存到TLB中的,然后在读写该地址时(会将 Translation descriptor缓存到TLB中),同时还会产生一个fault,要求软件将该比特改为1, 而且必须使用独占指令更新该比特
• 如果开启了hardware management机制那么AF=0时,表示该Translation descriptor没有缓存到TLB中的,然后在读写该地址时将不会产生fault,硬件会自动将AF比特改成1.
在这里插入图片描述

DBM

必须是 hardware management AF enabled的时候,DMB才会被enabled
DMB=0,内存被修改过,暗示没有写权限

nG

缓存在TLB中的翻译是否使用ASID标识

  • 20
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值