cache的工作方式

带有cache的CPU一般是先从cache中取出数据 而不是从内存里取数据

而CPU是怎么访问cache的

cache访问cache使用的类似的地址编码方式。

处理器访问存储器时 会把地址传递给TLB和cache
cache的工作方式
cpu把虚拟地址
页帧号传递给TLB 行索引(index)传递给cache匹配到相关的cache line

TLB里是一个用于存储虚拟地址到物理地址转换的小缓存 处理器先使用EPN在TLB中查找出最终的RPN 如果这期间发生TLB miss 就要查询页表 如果TLB HIT就很快获得RPN 获得相应的物理地址

然后去和cache line中的物理地址比较 如果比较不成功就会发生cache miss 这时需要去主存储器中获得最终的数据 然后填充在cache中 如果匹配成功就找到这个cache line的数据

cache的工作方式

cache 地址编码:处理器访问cache 时的地址编码,分成3 个部分,分别是偏移域
(Offset)、索引域(Index)和标记域(Tag)。
�� Cache Line:cache 中最小的访问单元,包含一小段主存储器中的数据,常见的cache
line 大小是32Byte 或64Byte 等。
�� 索引域(Index):cache 地址编码的一部分,用于索引和查找是在cache 中的哪一行。
�� 组(Set):相同索引域的cache line 组成一个组。
�� 路(Way):在组相联的cache 中,cache 被分成大小相同的几个块。
�� 标记(Tag):cache 地址编码的一部分,用于判断cache line 存放的数据是否和处
理器想要的

cache 的映射方式有full-associative(全关联)、direct-mapping(直接映射)和
set-associative(组相联)3 种方式
在一个32KB 的4 路组相联的cache 中,其中cache line 为32Byte,请画出这个
cache 的cache line、way 和set 的示意图。
在Cortex-A7 和Cortex-A9 的处理器上可以看到32KB 大小的4 路组相联cache。下面
来分析这个cache 的结构图。
cache 的总大小为32KB,并且是4 路(way),所以每一路的大小为8KB:
way_size = 32 / 4 = 8(KB)
cache Line 的大小为32Byte,所以每一路包含的cache line 数量为:
num_cache_line = 8KB/32B = 256
所以在cache 编码地址Address 中,bit[4:0]用于选择cache line 中的数据,其中bit [4:2]
可以用于寻址8 个字,bit [1:0]可以用于寻址每个字中的字节。bit [12:5]用于索引(Index)
选择每一路上cache line,其余的bit [31:13]用作标记位(Tag),

处理器访问存储器的时候 处理器访问的地址可能是虚拟地址 也可能是物理地址
这个要看处理器 通常有三种格式
VIVT(Virtual Index Virtual Tag):使用虚拟地址索引域和虚拟地址的标记域。
��VIPT(Virtual Index Physical Tag):使用虚拟地址索引域和物理地址的标记域。
PIPT(Physical Index Physical Tag):使用物理地址索引域和物理地址的标记域

比如arm9采用的就是VIVT 这样会出现高速缓存别名的问题 系统性能下降 arm11采用的是VIPT方式 也就是之前那个框架 发送虚拟地址到TLB和cache
ARM Cortex-A 系列处理器的数据cache 开始采用PIPT 的方式。对于PIPT 方式,索引
域和标记域都采用物理地址,cache 中只有一个cache 组与之对应,不会产生高速缓存别名
的问题。PIPT 的方式在芯片设计里的逻辑比VIPT 要复杂得多