ARMv8 - 高速缓存(cache)

基础知识

一个经典的arm64体系结构处理器系统包含了多级的高速缓存。
在这里插入图片描述
如上图每个CPU内核都有自己的L1高速缓存。L1高速缓存采用分离的两部分高速缓存。d-cache表示L1数据高速缓存, i-cache表示指令高速缓存。每个CPU内核共享一个L2 高速缓存,L2高速缓存采用混合的方式,不再区分指令和数据cache,此时还外接了一个扩展的L3高速缓存。

cache工作方式

在这里插入图片描述

处理器在访问存储器时,会把地址同时传递给TLB(Translation Lookaside Buffer)和cache。TLB是一个用于存储虚拟地址到物理地址转换的小缓存,处理器先使用EPN(effective page number)在TLB中进行查找最终的RPN(Real Page Number)。如果这期间发生TLB miss,将会带来一系列严重的系统惩罚,处理器需要查询页表。假设这里TLB Hit,此时很快获得合适的RPN,并得到相应的物理地址(Physical Address,PA)。

同时,处理器通过cache编码地址的索引域(Cache Line Index)可以很快找到相应的cache line组。但是这里的cache block的数据不一定是处理器所需要的,因此有必要进行一些检查,将cache line中存放的地址和通过虚实地址转换得到的物理地址进行比较。如果相同并且状态位匹配,那么就会发生cache命中(Cache Hit),那么处理器经过字节选择和偏移(Byte Select and Align)部件,最终就可以获取所需要的数据。如果发生cache miss,处理器需要用物理地址进一步访问主存储器来获得最终数据,数据也会填充到相应的cache line中。

在这里插入图片描述

cache地址编码:处理器访问cache时的地址编码,分成3个部分,分别是偏移域(Offset)、索引域(Index)和标记域(Tag)。

cache 基本结构如上图。上图中,存在4路(way,黄框所示为一个way),每一路中有4Line(绿色填充的为一个cache line),每一Line有4个Wrod,假设每个Word有4个Byte。
四个绿色填充的位于不同Way 的Line,组成一个组(Set)。

在查找某个地址索对应的cache 时,使用地址中的index 位找到对应Line,offset 找到对应Word,bytes 位找到对应Word 中的某个Byte。然后使用地址中的tag 位(其实就是高位地址),与cache 中的tag 位对比,如果一致,则命中。

可以看出,具有相同index 的两个不同地址,会索引到相同的Cache Line。如果只有一个Way,在两个地址频繁交替访问的场景下,这两个地址势必频繁cache 未命中。多个way 相连则可以解决这个问题,组相连的意义就是在此。

cache index & tag
处理器在进行存储器访问时,处理器访问地址是虚拟地址(virtual address,VA),经过TLB和MMU的映射,最终变成了物理地址(physical address,PA)。那么查询cache组是用虚拟地址,还是物理地址的索引域(Index)呢?当找到cache组时,我们是用虚拟地址,还是物理地址的标记域(Tag)来匹配cache line呢?

cache可以设计成通过虚拟地址或者物理地址来访问,这个在处理器设计时就确定下来了,并且对cache的管理有很大的影响。cache可以分成如下3类。

VIVT(Virtual Index Virtual Tag):使用虚拟地址索引域和虚拟地址的标记域。

VIPT(Virtual Index Physical Tag):使用虚拟地址索引域和物理地址的标记域。

PIPT(Physical Index Physical Tag):使用物理地址索引域和物理地址的标记域。

在早期的ARM处理器中(比如ARM9处理器)采用VIVT的方式,不用经过MMU的翻译,直接使用虚拟地址的索引域和标记域来查找cache line,这种方式会导致高速缓存别名(cache alias)问题。例如一个物理地址的内容可以出现在多个cache line中,当系统改变了虚拟地址到物理地址映射时,需要清洗(clean)和无效(invalidate)这些cache,导致系统性能下降。

ARM11系列处理器采用VIPT方式,即处理器输出的虚拟地址同时会发送到TLB/MMU单元进行地址翻译,以及在cache中进行索引和查询cache组。这样cache和TLB/MMU可以同时工作,当TLB/MMU完成地址翻译后,再用物理标记域来匹配cache line。采用VIPT方式的好处之一是在多任务操作系统中,修改了虚拟地址到物理地址映射关系,不需要把相应的cache进行无效(invalidate)操作。

ARM Cortex-A系列处理器的数据cache开始采用PIPT的方式。对于PIPT方式,索引域和标记域都采用物理地址,cache中只有一个cache组与之对应,不会产生高速缓存别名的问题。PIPT的方式在芯片设计里的逻辑比VIPT要复杂得多。

采用VIPT方式也有可能导致高速缓存别名的问题。在VIPT中,使用虚拟地址的索引域来查找cache组,这时有可能导致多个cache组映射到同一个物理地址上。以Linux kernel为例,它是以4KB大小为一个页面进行管理的,那么对于一个页来说,虚拟地址和物理地址的低12bit(bit [11:0])是一样的。因此,不同的虚拟地址映射到同一个物理地址,这些虚拟页面的低12位是一样的。如果索引域位于bit [11:0]范围内,那么就不会发生高速缓存别名。例如,cache line是32Byte,那么数据偏移域offset占5bit,有128个cache组,那么索引域占7bit,这种情况下刚好不会发生别名。另外,对于ARM Cortex-A系列处理器来说,cache总大小是可以在芯片集成中配置的。如表1.1所示,列举出了Cortex-A系列处理器的cache配置情况。

在这里插入图片描述

1.15 core to memory

在这里插入图片描述
ARM处理器的内存管理单元(Memory Management Unit, MMU)包括TLB和Table Walk Unit两个部件。TLB是一块高速缓存,用于缓存页表转换的结果,从而减少内存访问的时间。一个完整的页表翻译和查找的过程叫作页表查询(Translation table walk),页表查询的过程由硬件自动完成,但是页表的维护需要软件来完成。页表查询是一个相对耗时的过程,理想的状态下是TLB里存有页表相关信息。当TLB Miss时,才会去查询页表,并且开始读入页表的内容。

cache coherency和memory consistency
cache coherency高速缓存一致性关注的是同一个数据在多个cache和内存中的一致性问题,解决高速缓存一致性的方法主要是总线**协议,例如MESI协议等。而memory consistency关注的是处理器系统对多个地址进行存储器访问序列的正确性,学术上对内存访问模型提出了很多,例如严格一致性内存模型、处理器一致性内存模型,以及弱一致性内存模型等。弱内存访问模型在现在处理器中得到广泛应用,因此内存屏障指令也得到广泛应用

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值