[Cache]页着色小结


学习了很长时间关于页着色的概念,特记录下。


page coloring只对大cache有意义,也就是L2,L3这些动辄上M的cache有意义。
还有就是面向的是PIPT way/set组织的data cache。如果是Virtually indexed的话,没意义。

首先说cache的一些名词

cache entry:
包括tag,flag bits以及cache line的cache row

cache line:
大小为若干字的与内存相对应的cache数据。

cache way/set:
将cache line等分成如干个set,每个set包括way个cache line
每个cache way包含cache size/way/cache line个cache set。

cache bin:
在基于set/way的高端cpu中,给定一块连续的OS或者应用程序分配的物理内存,
会按照一定的映射算法,落在一块连续的cache set中。这个连续的Cache set集合
就是cache bin。

对于一个物理地址,其在OS和cache的角度来看是不同的:
在OS看来(4K页):
[ 页帧号(20位) ] [ 页内偏移(12位) ]

在Cache看来(32字节,4路,2M cache):
[ TAG(13位) ] [ index(14位) ] [ cache line offset(5位) ]

对于一个页来说,其5到11位(页内偏移)和12到18为(页帧号)对应了
同一个index,在cache看来,相同的index也就是意味着该物理页属于
同一个set当中,他们的区别在与tag。

5到11位(7位)对应页内偏移,页内偏移是连续的,那么这128个32字节刚好
对应了128个连续set。

12到18位(7位)对应页帧号,4K页中,其页帧号不变。对于同一个index,这
7位是相同的。也就是说第0页框和第128页框位于同一个index。也就是:
128 * j + i(j = 1,2,3,4...) 和 i页框位于同一个index中。

我们把位于同一个cache bin的页框称为同一颜色,也就是说同一颜色的页框
的物理页在cache看来,他们的index是相同的。

下面说什么是color bits,对于上述32字节cache line,4way,2Mcache来说
其color bits就是12到18位。这个概念等价于cache bin,因为color bits相同
的页属于同一个cache bin集合。

OS在采用某个固定分页(比如4K)的时候,只有12到18位可以进行控制。那么
OS在进行内存分配的时候就可以对cache的行为进行控制:

具有相同color bits的物理页可能会发生冲突导致应用性能下降。
换言之就是尽可能分配不同颜色的物理页!

除此之外,对于应用程序还有另一层含义。比如某应用程序使用512K连续物理内存的
数据结构(后面把这个结构看做是页)。那么对于上述cache会如何呢?

应用程序角度:
[ 页帧号(13位) ] [ 页内偏移(19位) ]

那么此时Cache角度不变:
[ TAG(13位) ] [ index(14位) ] [ cache line offset(5位) ]

此时的color bits就是第19位(1位)。那么情况就是:

如果系统有五个这样的结构(4路),那么他们在系统的cache上肯定会出现冲突。

******************************************************************************
Cache 类型

1. PIPT (一般用于D cache)

该种类型避免上下文切换时候要flush cache,但是由于皆采用物理地址,每次判断命中都必须进行地址转换
速度较慢

2. VIVT (老式缓存)

该种类型避免判断Cache命中时的地址转换,但是上下文切换后虚拟地址映射发生改变,就必须flush cache。
效率不高

3. VIPT (一般用于新式I cache)

上面两个极端的折中。在cache通过index查询正确的set的时候,TLB可以完成虚拟地址到物理地址的转换,在cache
比较tag的时候,物理地址已经准备就绪,也就是说physical tag可以和cache并行工作。虽然延迟不如VIVT但是不需要
上下文切换的时候flush cache。

*******************************************************************************
Cache 同名问题

同名问题指的是两个不同的VA被映射到了同一个PA上了。虽然是同一份资料但是因为虚拟地址不同,在cache中就有可能
存在多个备份。注意,这里cache是VIVT或VIPT(index不同)。这称为Cache同名问题。

现在来考虑这个问题,某个PA被映射到了两个不同的VA上。虽然VA不同,但是由于PA相同,VA和PA之间有映射关系,那么
VA应该有相同之处。

考虑物理地址被映射到了两个页当中,那么必然两个的页偏移地址应该是一样的,那么也就是低12位应该是相同的。
这个时候判断是否有同名问题就要判cache的index被采用哪几个位:

考虑一个64K,四路组相连,32字节Cache Line的L1 Cache,采用VIPT。
set = 64K/4/32 = 512(9)

在Cache角度下地址应该是这样的:
31   14 13          5 4        0
[ tag ] [ index     ] [ offset ]
 
           
对于这样的Cache考虑其VA(4K l2-tbl)
31      20 19      12 11       0     
[ l1-tbl ] [ l2-tbl ] [ offset ]
    12         8          12
index和offset占14位,而在VA中offset占12位,l2-tbl中占2位也就是12位,13位。
两个映射了同一个页的VA,其offset肯定相等,那么index中不相等的就是12位和13位。

此时index bit落入了l2-tbl中,说明该系统可能出现同名问题。

下面讨论如何解决同名问题:

很简单:

软件角度:在构建页表的时候,当PA映射到多个VA时,这多个VA的12-13位必须和PA的12-13位相等。
也就是说,我们构建页表时候进行强制对齐,对于上面的例子,如果我们的页都是按照16K对齐,那么问题就解决了。

硬件角度:限制Cache大小,也就是减少index数目,可以让index完全落入PA中,这样就避免了同名问题。

你可能感兴趣的:(系统结构细节)