arm64高速缓存(Cache)学习笔记
高速缓存:
- 基本单位是缓存行(cache line)。一个缓存行64字节。
- 具体cacheline结构是
valid|tag - cacheline|dirty。- tag: 物理地址高位; (不计入缓存行大小)
- cacheline: 缓存行内容,缓存大小只计入缓存行。
- valid和dirty: 有效和写脏标志位。(不计入缓存行大小)
- 路(way)和组(set):
- 是对整体Cache的平分,一个4路的Cache,每一路,正好1/4大小。
- 一个组是已索引路。在一个4路的Cache,一个组有包括4个可能项。
- Cache索引方式: 两级索引
- 访问内存地址分为高位、地位。 高位(tag):低位(index):偏移;
- 第一级使用低位作为index去搜索。同一个index有重复项,一个4路的结构有4个重复项。
- 第二级使用tag。匹配tag。找到唯一的缓存行。
- 直接映射和组相连映射效果
- 如果cache仅仅是通过低位去查找,有很多重复项目;当两片低位地址相同时(实际不在一片数据区),后一个发生缓存分配的会把前一个替换掉。
- 如果是同时基于tag的匹配; 则低位相同时,被干扰的概率降低。
- 一个4路(way)的缓存结构,重复概率只有1/4。
rk3588的高速缓存结构。cortex-a76有:
- L1: 私有。64K指令缓存 + 64K数据缓存。4路组相连。
- 地址索引区段: 26(tag):8(index):6(行内偏移)
- L2: 私有。512K指令+数据缓存。
- 地址索引区段: 24(tag):10(index):6(行内偏移)
- L3: 共享。3M指令+数据缓存。
有:
- 只有L1级别指令缓存和数据缓存结构是分离的;后续级别是一体的。
- cache的地址类型策略
- L1 D-Cache,遵循VIPT机制;即index索引使用的是虚拟地址,但是tag使用的是物理地址。
- L2/L3完全采用PIPT策略。即index和tag都是物理地址。
arm64按发起主体的缓存分类():
- 指令缓存。CPU取指。只读。
- 数据缓存。CPU通过msr/src进行内存读写。
- 页表遍历缓存。MMU单元在遍历页表时所使用的缓存。
缓存一致性点和统一点:
- PoC一致性点: 多核、dma、外设看到的统一视图点。
- rk3588因为L3是共享结构,所以对于多核PoC点就是L3;
- 一部分高速外设如gpu、npu是缓存一致性设计,属于ACE硬件一致性域,和多核一样的一致性点。在编程时理论上不需要缓存维护操作。
- 另一部分低速外设如磁盘dma,不具有硬件一致性设计,只能直接读物理内存。此时一致性点是主存DRAM。需要缓存维护操作
- DMA_FROM_DEVICE从设备读取,必须先无效化
- DMA_TO_DEVICE: 向设备写入,必须先刷新;
- PoU统一点:在单核内,取指、访存、TLB页表遍历所看到的统一视图的缓存层级。
- rk3588因为在L2达到了指令和数据缓存不区分,因此L2就是指令和数据的统一点。同时TLB页表遍历也是使用L2。因此L2同时是三者的一致性点。
缓存操作:
- clean: 清脏。上一级的缓存内容,写入下一级。
- invalidate: 使无效。上面多级的缓存,都不再用了。
- 数据缓存指令:
- dc cvac。刷新(清脏数据)到一致性点L3。即L1-Dcache → L2 → L3
- dc cvau。刷新到统一点。L1-Dcache → L2。
- dc ivac。无效到一致性点。(L1-Dcache, L2)。注意不包括L3
- 指令缓存
- ic ivau。无效到统一点。值只包括L1-Icache。
关于缓存操作
- 实际上是对L1、L2、L3的主动控制操作。
- 没有缓存操作指令主动控制L3→ 主存。是完全由硬件控制的。

浙公网安备 33010602011771号