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

【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是disabledMMU是disabled,cache是enabled

大多数用前两种

MMU和SMMU是同一份页表

多核架构中,不同CPU使用的页表一般是同一份,也可以不是同一份

MMU的好处:

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

MMU的主要功能

地址翻译权限管理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

页表翻译的过程

页表有多少级

无论有多少级最高级就是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属性

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标识

相关创作

企业vi设计一般多少钱
365时政

企业vi设计一般多少钱

07-06 👁 4914
万科淘宝合卖房:淘宝上花多少 买房就能省多少
365彩票官方下载手机

万科淘宝合卖房:淘宝上花多少 买房就能省多少

08-05 👁 4500