Cortex-A510——Cache
小狼@http://blog.csdn.net/xiaolangyangyang
1、Cortex-A510 Cache组织结构
以cache-size为32k,cache-line为32Byte为例:
- 组相连(常用结构):4-way,256-set
- 直接映射:相当于1-way,1024-set的组相连
- 全相连:相当于1024-way,1-set的组相连
2、组相连
如果一个数据可以放在n个line,则称这个Cache是n路组相连的Cache(n-wayset-associativeCache),如下图所示为4-way,4-set的Cache。
组相连结构图
组相连映射图
- offset:确定cache-line中数据位置,offset为图中Word+Byte;
- set:确定way中cache-line位置,即哪个组,如果数据被缓存,则V标志为1;
- tag:确定cache中way的位置,如果数据被缓存,tag中保存有地址信息,与处理器地址进行比对;
- V:cache-line有效标记;
- D:脏数据标记。
组相连映射硬件逻辑图
3、VIVT/VIPT/PIPT
VIVT(Virtual Index Virtual Tag):使用虚拟地址Index域和虚拟地址Tag域
多个VA可能映射到同一PA,导致多个cache line组(VA不同,index域不同,查找到的cache 组则不同)映射到同一物理地址,这种现象叫做cache alias(高速缓存别名)。一旦一个VA到PA的映射关系改变,cache内容将会写回物理内存。此时,由于物理内存内容的变化需要同步到cache,就需要clean和invalidate(这两个操作结合起来就叫做flush)其余同名cache line,导致系统性能下降。
VIPT(Virtual Index Physical Tag):使用虚拟地址Index域和物理地址Tag域
如果index域位于地址的bit0~bit11(因为linux kernel以4KB(12bit位宽)大小为页面进行物理内存管理),就不会引起cache alias,否则还是会引起该问题。因为对于一个页面来说,虚拟地址和物理地址的低12bit是完全一样的,如果index域位于bit0~bit11,此时VIPT等价于PIPT。
PIPT(Physical Index Physical Tag):使用物理地址Index域和物理地址Tag域
就不会存在cache alias问题,但是结构更复杂。ARM Cortex-A系列处理器使用的是PIPT方式。
4、Cache硬件替换策略
常用策略有:PLRU、NRU、Fifo、Round-Robin
5、Cache一致性
MESI协议:
- M:这行数据有效,数据已被修改,和内存中的数据不一致,数据只存在于该高速缓存中
- E:这行数据有效,数据和内存中数据一致,数据只存在于该高速缓存中
- S:这行数据有效,数据和内存中数据一致,多个高速缓存有这行数据的副本
- I:这行数据无效
6、Cache操作指令
7、Cache寄存器
8、提高Cache命中率
- 优化数据访问模式,是得数据的访问更加局部化、减少Cache Miss的次数;
- 合理配置Cache的大小和映射方式,以满足特定应用程序的需求;
- 使用高效的替换算法,如LRU(Least Resently Used),以最大程度地保留对最近访问数据的缓存;
- 避免频繁的写入操作,尽可能地延迟写操作以提高写入命中率。
9、疑问
- Cache的内部组织架构是怎么样的?能否画出一个cache的layout图?什么是set,way?
- 直接映射,全关联和组相联之间有什么区别?优缺点是啥?
- 重名问题是怎么发生的?
- 同名问题是怎么发生的?
- VIPT会不会发生重名问题?
- 什么是inner shareability 和outer shareability?怎么区分?
- 什么是PoU?什么是PoC?
- 什么是cache一致性?业界解决cache一致性都有哪些方法?
- MESI状态转换图,我看不懂。
- 什么cache伪共享?怎么发生的,如何避免?
- DMA和cache为啥会有cache一致性问题?
- 网卡通过DMA收数据和发数据,应该怎么操作cache?
- 对于self-modifying code,怎么保证data cache和指令cache的一致性问题?
Cache知识记录
Arm64 Cache
Linux内存管理:ARM64体系结构与编程之cache(3):cache一致性协议(MESI、MOESI)、cache伪共享