Cache知识记录

Cache本质就是一个硬件hash表(Tag RAM)+SRAM(DATA RAM),一般来说Cache的大小指的是DATA RAM的数据规模,并不包括Tag RAM的物理空间。

Cache的属性
line:代表一个cacheline,cache中最小访问单元,常见的cache line大小是32/64 Byte,从主存向cache迁移数据都是按照linesize为单位替换的。(上图红色线条)
set(组):相同index的cache line组成的一个组。(上图绿色方框)
way(路):在组相联的cache中,cache被分成大小相同的几个快,一个cache块就是一个way。(上图蓝色方框)

举例来说,data cache: 32-KB, 8-way set associative, 64-byte line size:
Cache总大小为32KB,8路组相连,所以每路有32K/8 = 4KB大小;

每个line的大小为64Byte,可以得出每路包含4K/64=64 个Cacheline,也就是说总共有64个组(Set)。

Cache的映射方式

Cache 的映射方式有direct-mapping(直接映射)、set-associative(组相联)和 full-associative(全相联)3 种方式。

直接映射(一个路,多个组,每个组包含一个cache line)——选中组之后不需要和组中的每个line比对,缺点是多个组索引(Index)指向相同的cacheline,容易导致cache颠簸(Cache thrashing)
组相联(多个路,多个组,每个组包含多个cache line)——常用方式
全相联(一个组,多个路,这个组包含cache的所有cache line)——只有一个组,不用hash来确定组,直接挨个比对高位地址,来确定是否命中。这种方式不适合大的缓存,因为需要维护更庞大的cache查找表(Tag字段);例如4M 的大缓存,linesize为32Byte,采用全相联的话,就意味着4*1024*1024/32 = 128K 个line挨个比较。

Cache如何寻址
处理器访问cache时,cache电路会将CPU地址进行解码,分成3个部分,分别是:
offset: 用于某个cache line——字抽取
index: 用于匹配某个cache line——组选择
tag: 用于判断匹配到的cache line存放的数据是否和处理器想要的一致——行匹配

以下图为例,Cache总大小为32KB,4路组相连,linesize为32Byte,一共有32K/4/32=256个组。
对于32位的内存地址,每个line有2^5 = 32Byte,所以地址的【0,4】区分line中的那个字节,属于offset字段。Cache一共有256个组, 取内存地址中间8位来hash查找地址属于那个组,即内存地址的【5,12】属于Index字段

组确定了之后,【13,31】的内存地址与组中256个line挨个比对,如果【13,31】位与某个line一致,并且这个line为有效,那么缓存命中,属于tag字段

从上图可以看出,每个Cache line旁边都有一个蓝色的Tag单元,称之为 tag array,tag array和data array一一对应。每一个cache line都对应唯一一个tag,tag中保存的是整个地址位宽去除index和offset使用的bit剩余部分。

tag、index和offset三者组合就可以确定一个唯一的地址了。因此,当我们根据地址中index位找到cache line后,取出当前cache line对应的tag,然后和地址中的tag进行比较,如果相等,这说明cache命中。如果不相等,说明当前cache line存储的是其它地址的数据,这就是cache缺失(cache miss)。

从图中看到tag左边有一个Vbit 即valid bit,这个bit用来表示cache line中数据是否有效(例如:1代表有效;0代表无效)。当系统刚启动时,cache中的数据都应该是无效的,因为还没有缓存任何数据。cache控制器可以根据valid bit确认当前cache line数据是否有效。所以,上述比较tag确认cache line是否命中之前还会检查valid bit是否有效。只有在有效的情况下,比较tag才有意义。如果无效,直接判定cache缺失。另外,cache line 右边还有一个D(dirty) bit,这一个dirty bit表明cache中的数据是否与主存中的数据一致,以决定是否需要更新主存。

典型Cache架构

上图是一个典型的Cache架构。处理器在访问存储器时,会把地址传给TLB和cache,TLB是一个存储虚拟地址到物理地址转换的小缓存。处理器先使用EPN(effective page number,有效页帧号)在TLB 中查找最终的RPN(Real Page Number,实际页帧号)。如果在这期间发生TLB Miss, 处理器需要继续访问MMU并且查询页表; 假设这里TLB Hit, 此时很快获得合适的RPN,并得到相应的物理地址PA(Physical Address)。
同时,处理器通过Cache编码地址可以很快找到相应的Cache line组。但是这里的Cache block数据不一定是处理器所需要的,因此需要进行检查,将Cache line中存放的地址和通过虚拟地址转换的物理地址进行比较,如果相同则会发生cache命中,那么处理器通过字节选择和偏移部件,就可以获取到最终数据。如果发生Cache miss,处理器需要用物理地址进一步访问不主存储器获得最终数据。

Data Cache的组织方式

处理器在进行存储器访问时,处理器访问的地址是虚拟地址,经过MMU的转换,得到物理地址。那么查询cache组是用虚拟地址还是物理地址的Index域呢?当找到cache组时,使用虚拟地址,还是物理地址的Tag域来匹配cache line呢?
VIVT(Virtual Index Virtual Tag):使用虚拟地址Index域和虚拟地址Tag域
VIPT(Virtual Index Physical Tag):使用虚拟地址Index域和物理地址Tag域
PIPT(Physical Index Physical Tag):使用物理地址Index域和物理地址Tag域

VIVT/VIPT/PIPT的优缺点分析:
VIVT:多个VA可能映射到同一PA,导致多个cache line组(VA不同,index域不同,查找到的cache 组则不同)映射到同一物理地址,这种现象叫做cache alias(高速缓存别名)。一旦一个VA到PA的映射关系改变,cache内容将会写回物理内存。此时,由于物理内存内容的变化需要同步到cache,就需要clean和invalidate(这两个操作结合起来就叫做flush)其余同名cache line,导致系统性能下降。
VIPT:如果index域位于地址的bit0~bit11(因为linux kernel以4KB(12bit位宽)大小为页面进行物理内存管理),就不会引起cache alias,否则还是会引起该问题。因为对于一个页面来说,虚拟地址和物理地址的低12bit是完全一样的,如果index域位于bit0~bit11,此时VIPT等价于PIPT。
PIPT:就不会存在cache alias问题,但是结构更复杂。ARM Cortex-A系列处理器使用的是PIPT方式

原文作者:DF11G

原文地址:Cache知识记录 - DF11G - 博客园(版权归原文作者所有,侵权联系删除)

 

  • 18
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值