cache的工作方式

时间:2024-03-30 18:02:00

带有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 要复杂得多