1. ARMv8缓存包含策略基础解析
第一次接触缓存包含策略时,我也被那些专业术语绕得头晕。直到在调试Cortex-A55的DMA传输问题时,才真正理解这些策略对系统性能的影响有多大。简单来说,缓存包含策略决定了多级缓存之间数据如何存放和同步,就像图书馆里如何摆放热门书籍——是每层阅览室都放同一本书(Inclusive),还是确保每本书只出现在一个固定位置(Exclusive)。
Inclusive策略最显著的特点是上级缓存(如L2)会完整包含下级缓存(如L1)的所有数据。这就好比总图书馆的畅销书架会复制所有分馆的热门书籍。当L1需要驱逐某条数据时,L2早已有备份,因此无需额外操作。但反过来,如果L2要驱逐数据,就必须通知所有L1同步删除对应内容,否则就会破坏"包含"的约定。
Exclusive策略则像严格的图书调拨制度——同一本书要么在分馆要么在总馆,绝不会同时存在。当CPU需要的数据在L2命中时,这条数据会从L2"搬家"到L1,同时L1原本的某条数据会被交换到L2。这种策略下,L2实际上扮演着"避难所"角色,专门收留被L1驱逐的数据,因此也被称为Victim Cache。
我在调试海思Hi3559AV100芯片时发现,它的L1指令缓存采用Inclusive策略而数据缓存用Exclusive。这种混合设计很有意思——指令通常被多个核心共享,适合Inclusive;而数据访问模式更复杂,Exclusive能提高有效缓存容量。
2. 策略实现细节与操作流程
2.1 Inclusive缓存实战行为分析
假设我们有个L1/L2采用Inclusive策略的双核系统,初始状态所有缓存为空。当Core0首次读取地址0x8000的数据X时,会发生以下精确步骤:
- L1查tag阵列发现miss,向L2发起请求
- L2同样miss,从DDR读取128字节cache line
- 数据同时写入L1和L2的way0,状态设为Shared
- Core0获得所需数据
此时若Core1也读取X,流程会有所不同:
- Core1的L1 miss但L2 hit
- 直接从L2拷贝数据到Core1的L1
- 两核的L1都标记为Shared
关键点在于:当Core0的L1因冲突需要驱逐X时,只需简单丢弃即可。但若L2要驱逐X,
解锁全文
加入我们的会员,获取最新、最热、最精彩的开发者技术内容