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按发起主体的缓存分类():

  1. 指令缓存。CPU取指。只读。
  2. 数据缓存。CPU通过msr/src进行内存读写。
  3. 页表遍历缓存。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→ 主存。是完全由硬件控制的。
posted @ 2026-08-31 23:38  happysc  阅读(8)  评论(0)    收藏  举报