天天看点

【Cache篇】Cache的映射方式

????????????博主主页:​​MuggleZero​​ ????????????

《ARMv8/v9架构一问一答》专栏地址:​​《ARMv8/v9架构一问一答》​​

前文:

​​【Cache篇】初见Cache​​

前面我们已经初步了解了Cache是什么。

现在我们知道Cache是以组的形式组成的,因此根据每组的Cache Line数量,可以分为两种类型的Cache。下面我们就来看看是哪两种类型。

直接映射型

对于直接映射型的cache来说,每组只有一片Cache Lines。

如下图所示的cache演示,这个cache只有4个Cache Line,每行有4个字,1个字是4字节。Cache控制器根据地址中的Bit[5:2]来选择Cache中的字,使用Bit[13:6]作为索引,来选择4个Cache Line中的1个,Bit[43:14]存储标记值。

查询这个Cache时,当Index和Tag值与查询地址相等并且此Cache包含有效数据时,则发生Cache Hit,然后使用offset值来寻找Cache中的数据。如果这个Cache包含有效数据但是Tag中表示其他地址的值时,那么就需要替换这个Cache Line。由于这个时候出现了频繁的Cache换入换出,就会产生严重的Cache thrashing(颠簸),严重降低系统性能。

【Cache篇】Cache的映射方式
【Cache篇】Cache的映射方式

组相联型(Set)

为了解决直接映射型cache中的颠簸问题,现代处理中广泛使用组相联型cache。

如下图的2路组相联cache为例,每一路包括4片Cache Lines,因此每个Set有两个Cache Line用于替换,他们分别来自Way0和Way1。地址0x00、0x40、0x80的数据可以映射到同一Set的不同Cache Line。因此它们有一半的几率可以不被替换。

【Cache篇】Cache的映射方式

以A57中的一个32KB大小,4路组相联的L1 Cache为例,我们来看看这个Cache的结构。

由于Cache大小为32KB且为4路(4个Way),因此每路Cache的大小为8KB,一共有256个Cache Line,每行大小32字节。

在Cache编码的地址中,Bit[5:0]用于选择Cache Line中的数据,Bit[5:2]可以寻址16个字;Bit[1:0]用于寻址每个字中的字节;Bit[13:6]用于在索引域中选择哪一行的Cache Line;Bit[43:14]用与标记域。V表示有效位,D表示脏位。

【Cache篇】Cache的映射方式
欢迎我的个人微信公众号,一起交流学习嵌入式开发知识!