aarch64中,有一个专门配置内存属性表的寄存器,为MAIR,本文基于MAIR寄存器讲解其作用
对于虚拟内存地址,我们知道其分布如下
这里我们只关注AttrIndx[2:0],可以知道描述如下:
这里stage 1就说ttbrx到pte的过程,这里的bits [4:2]指示的是MAIR寄存器中attr的索引。而MAIR寄存器如下 以el1为例
这里mair有8个attr,如下
这里的attr的值含义如下
其中熟悉可以分为设备内存和正常内存,如下
通过dd位区分,如下
这里我们看到GRE三个概念,解释如下
关于memory的shareable补充如下:
在TCR_EL1寄存器中,关注sh1 bit[29:28]如下:
这里可以看到
对于aarch64,cpu按照cluster划分,根据cluster的share规则如下
这里的inner指的是一个cluster内,outer指的非一个cluster内
而对于Normal Memory,通过0booooiiii来区分,如下解释
这里oooo是高位,iiii是低位。可以看到,这里对于Normal memory而言,我们看到了cacheable的如下属性
这里写通指的是内存写操作,直接更新到缓存和内存中,也就是缓存和内存数据是一致的
这里写回指的是内存写操作,只更新到缓存中,推迟对内存的更新,直到该缓存行被替换时才写回内存,这种情况下我们可以跟踪dirty bit,如果脏位是1,则缓存和内存的数据不一致
处理cacheable的write方式,还有transient 标志位
如果带有transient ,则表示内存使用时间很短,可以利用此标志来优先更新cache line
除了这些,我们还可以注意到RW标志,如下解释
这里的RW分别是 Read-allocate和Write-allocate,解释如下:
如果都是0,则代表No allocate,解释如下
假设我设置的MAIR_EL1的值是0xffffffffff440400,这里计算如下
可以知道,dd也是00,便知道这里是如下:
也就是 设备内存,不执行合并,不执行指令重排,不执行提前写应答
可以知道,dd是01,便知道如下:
也就是 设备内存,不执行合并,不执行指令重排,可以提前写应答
0x44,对应如下
对于oooo如下:
对于iiii如下:
也就是 正常内存,cluster内和cluster之间 都是non-cacheable的,所以的读写操作都是没有cache的。
0xff,对于如下
对于oooo如下:
对于iiii如下:
这里rw也是11,如下解释
这里是 正常内存,非短暂内存,读 allocate, 写 allocate。 简单来说就是所有的内存带cache,读写操作都经过cache