文章目录
- Cache Coherence 背景
- 1.1 内存顺序模型简介(Memory Model)
- 1.1.1 Normal Memory
- 1.1.2 Device Memory
- 1.2 Cache 一致性问题解决方案
- 1.2.1 Shareability 属性
- 1.2.2 Non-Shareable 属性
- 1.2.3 Inner-Shareable 属性
- 1.2.4 Out-Shareable 属性
- 1.3 Shareability 和 PoC/PoU 关系
- 1.3.1 PoU(处理器缓存一致性角度度)
- 1.3.2 PoC(全局缓存一致性角)
上篇文章:ARM Cache 系列文章 1 – Cache基础概念学习
下篇文章:ARM Cache 系列文章 3 – Cache 与 MPU关系学习
Cache Coherence 背景
所谓的 Cache 一致性问题, 主要指的是由于 Cache 存在时,当在有多个 Master(典型的如 MCU 的 Core, DMA 、PCIE、I2C2APB 等)访问同一块内存时, 由于数据会缓存在 Cache 中而没有更新实际的物理内存,导致的问题。在了解缓存一致性前需要先了解内存顺序模型。
1.1 内存顺序模型简介(Memory Model)
arm memory 类型分为 normal memory 和 device memory。
内存顺序模型更详细内容
1.1.1 Normal Memory
Normal memory就是我们平常所说的内存,对该种memory访问时无副作用(side effect),即第n次访问与第n+1次访问没有任何差别。
1.1.2 Device Memory
device memory 是外设对应的物理地址空间,对该部分memory访问时,可能存在副作用(side effect),比如:
- 某些状态寄存器可能 read clear;
- 某些寄存器有写入顺序(否则写入不成功);
- 设备fifo地址固定不变,但是每次访问,内部的移位寄存器就会将下一个数据移出来[1],因此访问同一地址第n次访问与第n+1 次访问结果是不同的。
1.2 Cache 一致性问题解决方案
一.所有的共享存储器都定义为共享属性(Shareability),共享意味着需要硬件保证一个内存位置中的内容对一定范围内可访问该位置的多个处理器是一致。
二.通过软件进行cache的维护, 如使用 cache invalidate 和 cache clean进行维护。
1.2.1 Shareability 属性
Shareability 的由来为了支持数据一致性协议,需要增加硬件很多开销,会降低系统的性能,同时也会增加系统的功耗。但是,很多时候并不需要系统中的所有模块之间都保持数据一致性,而只需要在系统中的某些模块之间保证数据一致性就行了。因此,需要对系统中的所有模块,根据数据一致性的要求,做出更细粒度的划分。
1.2.2 Non-Shareable 属性
配置为 non-shareable 属性的内存位置一般只能被唯一处理器访问, 如果还有其他处理器能访问该位置,需要软件用缓存一致性指令来保证缓存一致性。
比如:在单核的场景下,cpu 往某一块配置为non-shareable (同时配置了cacheable)属性的内存写一段数据,由于这段内存只对cpu可见,所以如果当使用DMA来搬运这块内存中的数据时,需要先进行 cache clean 将缓存中的数据刷入memory中,否者dma搬运的数据可能会有一些stale data。
1.2.3 Inner-Shareable 属性
该内存位置可以被 Inner Shareability domain 中的所有处理器访问,并且硬件保证该位置在这些处理器间的数据一致性,Inner Shareability domain中的处理器一般被同一个虚拟机监视器或操作系统控制,如下图中的两个 cluseter 都在 inner shareability domain中。一般不同的cluseter会共享L2 cache。
1.2.4 Out-Shareable 属性
能被外部共享的观察者(cpu, gpu, dma) 观察到,它适用于内部可共享和外部可共享域。一个outer shareable domain 可以由一个或多个 inner shareable domain组成,并且当一个操作影响到outer shareable domain时,也会影响到其下所有的 inner shareable domain。
note: 只有配置为 Normal Memory 内存属性的内存才能设置 inner 和 outer shareability,device memory 是不能设置 Shareability。
1.3 Shareability 和 PoC/PoU 关系
1.3.1 PoU(处理器缓存一致性角度度)
是指对于某一个核Master,附属于它的指令,数据缓存和 TLB,如果在某一点上,它们能看到一致的内容,那么这个点就是PoU。如下图右侧,MasterB包含了指令,数据缓存和TLB,还有二级缓存。指令,数据缓存和TLB的数据交换都建立在二级缓存,此时二级缓存就成了PoU。
而对于下图左侧的MasterA,由于没有二级缓存,指令,数据缓存和TLB的数据交换都建立在内存上,所以内存成了PoU。
还有一种情况,就是指令缓存可以去监听数据缓存,此时,不需要二级缓存也能保持数据一致,那一级数据缓存就变成了PoU。
1.3.2 PoC(全局缓存一致性角)
是指 对于系统中所有Master(注意是所有的,而不是某个核),如果存在某个点,它们的指令,数据缓存和TLB能看到同一个源,那么这个点就是PoC。如下图右侧,二级缓存此时不能作为PoC,因为MasterB在它的范围之外,直接访问内存。所以此时内存是PoC。在左图,由于只有一个Master,所以内存是PoC。
简而言之,PoU/PoC定义了指令和命令的所能抵达的缓存或内存,在到达了指定地点后,Inner/Outer Shareable定义了它们被广播的范围。
上篇文章:ARM Cache 系列文章 1 – Cache基础概念学习
下篇文章:ARM Cache 系列文章 3 – Cache 与 MPU 关系学习