1.2 Cache tags和物理地址
每个cache line都有一个tag与之相关,该tag记录了与cache line相关的外部内存的物理地址。Cache line的大小是由实现定义的。但是,由于内部互连所有的core需要有相同大小的cache line。
访问的物理地址用来决定数据在cache中的位置。最低位用于选择cache line中的相关项。中间位作为index用来选在cache组中的特定的line。最高位用于标识地址的其他部分,并用于与该line存储的标识进行比较。在ARMv8中,数据cache通常为PIPT(物理index物理tag),但也可以为无别名的VIPT(虚拟index物理tag)。
Cache中每个cache line包含:
- 相关物理地址的tag值;
- 有效位用来表明该line是否在cache中,即tag是否有效。如果cache的一致性跨越多个core时有效位也可以为MESI的状态位;
- Dirty数据位表明是否cache line中的数据和外部内存中的数据保持一致;
ARM cache为组相连。这意味着对于给定的地址有多个可能的cache位置或路。一个组相连的cache明显减少cache thrashing的可能性且改善程序执行速度,但代价为增加硬件复杂度和对功耗有轻微增加。
一个简单的4路组相连的32KB L1 cache(比如Cortex-A57处理器的数据cache),16word cache line长度,如下图所示:
1.3 包含和独占caches
考虑一个简单的内存读,比如在单个core处理器上执行LDR X0, [X1]。
(1)如果X1指向内存中的一个位置,它被标记为可cacheable,然后再L1数据cache中会有cache查找;
(2)如果在L1 cache中找到地址,然后数据从L1 cache中读取并返回给core;
(3)如果在L1 cache中没有找到地址,但在L2 cache中,cache line会从L2 cache加载到L1 cache中,然后数据返回到core。这会导致cache line从L1中被回收腾出空间,但仍在L2 cache中存在;
(4)如果地址既不在L1 cache也不再L2 cache中,数据被同时从外部内存加载到L1和L2 cache中,然后返回给core。这也会导致cache line被回收。
这是相当简化后的视角。对于多核和多cluster系统中,在从外部内存加载之前,需要检查L2 cache或在cluster中的L1 cache或其他cluster。另外,在这里没有考虑L3 cache或系统cache。
这就是包含cache模型,这里相同的数据可能在L1和L2 cache中同时存在。在独占cache中,数据只能在一种cache中存在,地址不能够同时在L1和L2 cache中存在。