MMU总览
armv8 的 MMU 为 code 增加了一个新概念 : 虚拟地址 , 在这个概念之上, 加了很多限制
目前好像是无法在物理地址上直接加限制的
相关的限制
size : 有效位数 颗粒度
内存属性 : 共享 缓冲缓存 内存顺序模型(普通/ 设备)
权限 : el0/ 1 读写执行
相关的控制
寄存器
直接寄存器
TTBL0/ TTBL1
TCR
SCTLR
间接寄存器
MAIR
页表
L0
L1
L2
L3
MMU限制
size
ARMv8 有两套页表机制, 索引了两套页表
TTBR1_EL1
TTBR0_EL1
第一个size相关 : TCR.TGx
TGx 字段
0 b00 : 4 KB
0 b01 : 16 KB
0 b11 : 64 KB
第二个size相关 : TCR.TxSZ
TxSZ 字段:
va最大地址 : 2 ^ ( 64 - TxSZ)
第三个size 相关 : TCR.IPS
用来配置 地址转换( va-> pa) 后, 得到的 物理地址( pa) 的最大值
内存属性
Level 2
内存顺序模型
Device : 更严格的访存方式
Normal : 比较宽松的访存方式
在实际应用中, Device/ Normal 是 Cacheability & Shareability 的 封装
Device
Outer Shareable
Non- cacheable
Normal
Non- Shareable 或 Inner Shareable 或 Outer Shareable
Non- cacheable 或 Write- Through Cacheable 或 Write- Back Cacheable
Memory attribute summary P2468
1. 为什么把他设置为这个属性
2. 实际应用中怎么配置
3. 设置了这个属性之后,mmu遇到后会怎么处理
Level 1 Shareability
Shareability
不共享 : 只能被本地cpu能观察到
内部共享 : 只能被 具有"内部共享属性的高速缓存" 的CPU 观察到
外部共享 : 能被外部共享的观察者( cpu, gpu, dma) 观察到
page. SH[ 1 : 0 ] :
0 b00 没有共享性
0 b01 保留
0 b10 外部可共享
0 b11 内部可共享
-- -
1. 为什么把他设置为这个属性
想让其缓存到哪一层cache
2. 实际应用中怎么配置
应该根据 内存的不同位置来配置
3. 设置了这个属性之后,mmu遇到后会怎么处理
如果将block的内存属性配置成 non- shareable, 那么core0访问该内存时
数据缓存的到Core0的L1 d- cache 和 cluster0的L2 cache,不会缓存到其它cache中
如果将block的内存属性配置成 inner- shareable, 那么core0访问该内存时
数据只会缓存到core 0 和core 1 的L1 d- cache中, 也会缓存到clustor0的L2 cache,不会缓存到clustor1中的任何cache里。
如果将block的内存属性配置成 outer- shareable, 那么core0访问该内存时
数据会缓存到所有cache中
Level 1 Cacheability
cache 有 共享性 , 和 内存的共享性有什么关系?
TODO
Cacheability
TODO
SCTLR. I
开关icache高速缓存
SCTLR. C
开关data高速缓存
page. AttrIndx[ 2 : 0 ] :
索引 MAIR寄存器的 第 N 个内存属性
-- -
1. 为什么把他设置为这个属性
因为想要读写的时候会不会缓存, 什么时候缓存
2. 实际应用中怎么配置
如果是设备内存, 必须配置 Non- Cacheable
3. 设置了这个属性之后,mmu遇到后会怎么处理
遇到 Non- Cacheable 的时候, 直接写入内存, 从内存读取
遇到 Write- Through Cacheable 的时候, 直接写入cache, 同时写入内存
遇到 Write- Back Cacheable 的时候, 写入cache, 等cache失效的时候写入内存
如果将block的内存属性配置成Non- cacheable,那么数据就不会被缓存到cache,那么所有observer看到的内存是一致的,也就说此时也相当于Outer Shareable。
其实官方文档,也有这一句的描述:
在B2. 7.2 章节 “Data accesses to memory locations are coherent for all observers in the system, and correspondingly are treated as being Outer Shareable”
如果将block的内存属性配置成write- through cacheable 或 write- back cacheable,那么数据会被缓存cache中。write- through和write- back是缓存策略。
Cacheability 和 Shareability 的自由组合
translation table walks 涉及的内存的内存属性
translation table walk 时, 会涉及到 页表 所在的内存
这些内存 的 Shareability 由 TCR. SHx 设置
这些内存 的 Cacheability 由 TCR. ORGNx/ TCR. IRGNx 设置
TCR. SHx : 设置默认 Shareability
配置TTBRx 页表相关内存的高速缓存共享属性
0 b00 : 不共享
0 b10 : 外部共享
0 b11 : 内部共享
TCR. ORGNx : 设置默认 Cacheability
配置TTBRx 页表相关内存 中的 外部共享内存
0 b00 : 普通内存, 外部共享, 不高速缓存
0 b01 : 普通内存, 外部共享, 高速缓存策略是 回写 写分配/ 读分配
0 b10 : 普通内存, 外部共享, 高速缓存策略是 写直通 写不分配/ 读分配
0 b11 : 普通内存, 外部共享, 高速缓存策略是 回写 写不分配/ 读分配
TCR. IRGNx : 设置默认 Cacheability
配置TTBRx 页表相关内存 中的 内部共享内存
0 b00 : 普通内存, 内部共享, 不高速缓存
0 b01 : 普通内存, 内部共享, 高速缓存策略是 回写 写分配/ 读分配
0 b10 : 普通内存, 内部共享, 高速缓存策略是 写直通 写不分配/ 读分配
0 b11 : 普通内存, 内部共享, 高速缓存策略是 回写 写不分配/ 读分配
权限
MMU 控制
寄存器
MAIR
描述 Cacheability
64 bit寄存器, 每8 个bit描述一个memory type , 共可设置 8 个 memory type ( 8 个框)
用来被 page. AttrIndx[ 2 : 0 ] 索引 8 个框 中的哪一个
TCR
TTBL0/TTBL1
SCTLR
页表
最大支持 4 级别( L0 L1 L2 L3)
64 KB 的颗粒度为什么不从L0开始, 而是从L1开始
因为 最后一个肯定是 L3, 且最大为3 级别, 所以只能从L1开始
L3 和 L0/ 1 / 2 定义不同 , L0/ 1 / 2 定义相同
所有可能存在的页表
最大级数 颗粒度 L0 L1 L2 L3 索引页面大小 4 4KB 1 512GB(不支持) 4 4KB 1 1 1GB 4 4KB 1 1 1 2MB 4 4KB 1 1 1 1 4KB 4 16KB 1 512TB(不支持) 4 16KB 1 1 128TB(不支持) 4 16KB 1 1 1 32MB 4 16KB 1 1 1 1 16KB 3 64KB 1 4TB(ARMv8.2-LPA) 3 64KB 1 1 512MB 3 64KB 1 1 1 64KB
L0/1/2 页表的描述
4级别(颗粒度为4/16KB)的L0/1/2 3级别(颗粒度为64KB)的L1/2
L3 页表的描述
Linux 对MMU的应用
linux 对MAIR的应用
ARM64中的 MAIR中的8 bit, 可以有 2 ^ 8 个排列组合. 存在于 8 个 框中
但是 linux 只用到了五个框, MT_XXX 是 index ( 索引了MAIR) , 并不是 MAIR 中的编码
-- -
132 #define MT_NORMAL 0
133 #define MT_NORMAL_TAGGED 1
134 #define MT_NORMAL_NC 2
135 #define MT_DEVICE_nGnRnE 3
136 #define MT_DEVICE_nGnRE 4
封装的API
-- -- -- -- -- -- -- --
MT_NORMAL
PROT_SECT_NORMAL
PROT_SECT_NORMAL_EXEC
PROT_NORMAL
PAGE_KERNEL
PAGE_KERNEL_RO
PAGE_KERNEL_ROX
PAGE_KERNEL_EXEC
PAGE_KERNEL_EXEC_CONT
_PAGE_DEFAULT
PAGE_NONE
PAGE_SHARED
PAGE_SHARED_EXEC
PAGE_READONLY
PAGE_READONLY_EXEC
PAGE_EXECONLY
MT_NORMAL_TAGGED
pgprot_tagged 和 pgprot_mhp
PROT_NORMAL_TAGGED -> 无
MT_DEVICE_nGnRE
pgprot_device
PROT_DEVICE_nGnRE -> ioremap
| -> FIXMAP_PAGE_IO
MT_DEVICE_nGnRnE
pgprot_noncached
PROT_DEVICE_nGnRnE -> ioremap_np
MT_NORMAL_NC
pgprot_writecombine
PROT_NORMAL_NC -> ioremap_wc
Linux 对 内存属性(Shareability & Cacheability) 的应用