多级cache之间的替换(缓存)策略

引流关键词:缓存,高速缓存,cache, CCI,CMN,CCI-550,CCI-500,DSU,SCU,L1,L2,L3,system cache, Non-cacheable,Cacheable, non-shareable,inner-shareable,outer-shareable, optee、ATF、TF-A、Trustzone、optee3.14、MMU、VMSA、cache、TLB、arm、armv8、armv9、TEE、安全、内存管理、页表…

快速链接:
.
个人博客笔记导读目录(全部)

  • ARMv8/ARMv9架构精选系列–目录
  • ARMV8/ARMV9/Trustzone/TEE安全课程

目录

        • 1、DynamIQ架构中L1 cache的替换策略(以cortex-A710为例)
        • 2、core cache的替换策略(以cortex-A710为例)
          • 2.1、L1 data cache 遵从MESI协议
          • 2.2、L1 instruction cache 没有遵从MESI协议
          • 2.3、MESI协议的介绍
        • 3、cluster cache 之间的替换策略
        • 4、总结
        • 参考

思考:
1、L1 cache的替换策略是什么,L2和L3的呢
2、哪些的替换策略是由硬件决定的(定死的,软件不可更改的),哪些的替换策略是软件可以配置的?
3、在经典的 DynamIQ架构 中,数据是什么时候存在L1 cache,什么时候存进L2 cache,什么时候又存进L3 cache,以及他们的替换策略是怎样的? 比如什么时候数据只在L1? 什么时候数据只在L2? 什么时候数据只在L3? 还有一些组合,比如什么时候数组同时在L1和L3,而L2没有? 这一切的规则是怎样定义的?
说明:
本文讨论经典的DynamIQ的cache架构,忽略 big.LITTLE的cache架构

在这里插入图片描述


1、DynamIQ架构中L1 cache的替换策略(以cortex-A710为例)

我们先看一下DynamIQ架构中的cache中新增的几个概念:

  • (1) Strictly inclusive: 所有存在L1 cache中的数据,必然也存在L2 cache中
  • (2) Weakly inclusive: 当miss的时候,数据会被同时缓存到L1和L2,但在之后,L2中的数据可能会被替换
  • (3) Fully exclusive: 当miss的时候,数据只会缓存到L1

其实inclusive/exclusive属性描述的正是是 L1和L2之间的替换策略,这部分是硬件定死的,软件不可更改的。

我们再去查阅 ARMV9 cortex-A710 trm手册,查看该core的cache类型,得知:
在这里插入图片描述

  • L1 I-cache和L2之间是 weakly inclusive的
  • L1 D-cache和L2之间是 strictly inclusive的

也就是说:

  • 当发生D-cache发生miss时,数据缓存到L1 D-cache的时候,也会被缓存到L2 Cache中,当L2 Cache被替换时,L1 D-cache也会跟着被替换
  • 当发生I-cache发生miss时,数据缓存到L1 I-cache的时候,也会被缓存到L2 Cache中,当L2 Cache被替换时,L1 I- cache不会被替换

再次总结 : L1 和 L2之间的cache的替换策略,I-cache和D-cache可以是不同的策略,每一个core都有每一个core的做法,请查阅你使用core的手册。

2、core cache的替换策略(以cortex-A710为例)

为了能够将DynamIQ架构和bit.LITTLE架构的cache放在一起介绍,我们将DynamIQ架构中的L1/L2 cache看做成一个单元统称Core cache,bit.LITTLE架构中的L1 Cache也称之为core cache.
DynamIQ架构中DSU中的L3 cache称之为cluster cache,bit.LITTLE架构中SCU中的L2 cache也称之为cluster cache。

2.1、L1 data cache 遵从MESI协议

在L1 data cache TAG中,有记录MESI相关比特, 然后将一个core内的cache看做是一个整体,core与core之间的缓存一致性,就由DSU执行MESI协议来维护
在这里插入图片描述

2.2、L1 instruction cache 没有遵从MESI协议

因为对于Instruction cache来说,都是只读的,cpu不会改写I-cache中的数据,所以也就不需要硬件维护多核之间缓存的不一致
在这里插入图片描述

2.3、MESI协议的介绍

MESI这四种状态:
在这里插入图片描述
MESI状态之间的切换:
在这里插入图片描述

Events:
RH = Read Hit
RMS = Read miss, shared
RME = Read miss, exclusive
WH = Write hit
WM = Write miss
SHR = Snoop hit on read
SHI = Snoop hit on invalidate
LRU = LRU replacement


Bus Transactions:
Push = Write cache line back to memory
Invalidate = Broadcast invalidate
Read = Read cache line from memory

3、cluster cache 之间的替换策略

说实话,core cache / cluster cache / 这个名字可能不好,感觉叫private cache 和 share cache也会更好,我也不知道官方一般使用哪个,反正我们能理解其意思即可吧。

那么他们之间的替换策略是怎样的呢?

我们知道MMU的页表中的表项中,管理者每一块内存的属性,其实就是cache属性,也就是缓存策略。
其中就有cacheable和shareable、Inner和Outer的概念。如下是针对 DynamIQ 架构做出的总结,注意哦,仅仅是针对 DynamIQ 架构的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是缓存策略。

  • 如果将block的内存属性配置成 non-shareable, 那么core0访问该内存时,数据缓存的到Core0的L1 D-cache / L2 cache (将L1/L2看做一个整体,直接说数据会缓存到core0的private cache更好),不会缓存到其它cache中。

  • 如果将block的内存属性配置成 inner-shareable, 那么core0访问该内存时,数据只会缓存到core 0的L1 D-cache / L2 cache和 DSU L3 cache,不会缓存到System Cache中(当然如果有system cache的话 ) , (注意这里MESI协议其作用了)此时core0的cache TAG中的MESI状态是E, 接着如果这个时候core1也去读该数据,那么数据也会被缓存core1的L1 D-cache / L2 cache 和DSU0的L3 cache(白字黑字,绝不瞎说,请参见文末的[1] DSU TRM片段), 此时core0和core1的MESI状态都是S

  • 如果将block的内存属性配置成 outer-shareable, 那么core0访问该内存时,数据会缓存到core 0的L1 D-cache / L2 cache 、cluster0的DSU L3 cache 、 System Cache中, core0的MESI状态为E。如果core1再去读的话,则也会缓存到core1的L1 D-cache / L2 cache,此时core0和core1的MESI都是S。这个时候,如果core7也去读的话,数据还会被缓存到cluster1的DSU L3 cache. 至于DSU0和DSU1之间的一致性,非MESI维护,具体怎么维护的请看DSU手册,本文不展开讨论。

Non-cacheable write-through
cacheable
write-back
cacheable
non-shareable 数据不会缓存到cache
(对于观察则而言,又相当于outer-shareable)
core0访问该内存时,数据缓存的到Core0的L1 D-cache / L2 cache (将L1/L2看做一个整体,直接说数据会缓存到core0的private cache更好),不会缓存到其它cache中 同左侧
inner-shareable 数据不会缓存到cache
(对于观察则而言,又相当于outer-shareable)
core0访问该内存时,数据只会缓存到core 0的L1 D-cache / L2 cache和 DSU L3 cache,不会缓存到System Cache中(当然如果有system cache的话 ) , (注意这里MESI协议其作用了)此时core0的cache TAG中的MESI状态是E, 接着如果这个时候core1也去读该数据,那么数据也会被缓存core1的L1 D-cache / L2 cache 和DSU0的L3 cache, 此时core0和core1的MESI状态都是S 同左侧
outer-shareable 数据不会缓存到cache
(对于观察则而言,又相当于outer-shareable)
core0访问该内存时,数据会缓存到core 0的L1 D-cache / L2 cache 、cluster0的DSU L3 cache 、 System Cache中, core0的MESI状态为E。如果core1再去读的话,则也会缓存到core1的L1 D-cache / L2 cache,此时core0和core1的MESI都是S
思考:那么此时core7去读取会怎样?
同左侧

4、总结

  • dynamIQ 架构中 L1和L2之间的替换策略,是由core的inclusive/exclusive的硬件特性决定的,软无法更改
  • core cache之间的替换策略,是由SCU(或DSU)执行的MESI协议中定义的,软件也无法更改。
  • cluster cache之间的替换策略,是由于MMU页表中的内存属性定义的(innor/outer/cacheable/shareable),软件可以修改

参考

  • [1] DSU TRM片段
    在这里插入图片描述

你可能感兴趣的:(ARM,缓存,cache,MMU,ARM,ARMV9)