cache组相连,页着色

粗略的了解了下cache的结构:

cache分为全相联,直接相连,组相连。重点讲讲组相连。

什么是cache行?cache是以行为单位进行存储的,如每个cache行为连续的32B。当然,每个cache行前面还有一些标记信息用来判定cache存的是内存哪部分的信息,是否有效等。

组相连是将cache分组,同时内存也分组。每次将内存的一个组存到cache中(这是由于局部性原理,最近访问的数据可能会被重复访问,他的邻居也极可能被访问,那把他们都放入cache最有效了)。具体如下:

设cache是n路组相连,将每n个连续的cache行编为一组(同时内存中也分成相同大小的组),假设分成了m个组。内存也分成n*(每cache行大小的组)的组,假设分成了p个组。用p%m来进行cache组和内存组之间的对应。对应好后,组的内部的cache行与内存行之间用全相连。


页着色的问题:

上文说了,cache行前是有信息来用于判定存的是内存的哪部分的,比如tags信息。tags存的是当前cache行映射的内存的部分物理地址。

为了加快判断cache是否命中,cpu一般会分两步走:1,使用tlb将线性地址转化为物理地址;2,等不及1步完成以便用物理地址来判断cache是否命中,先使用线性地址来进行cache是否命中的初步处理;到2步后期使用1步物理地址来确定是否命中。

假设内存4K一页,cache 32B一行,64KB,32位系统,4路组相连。

下面主要讲第二步:

本来,我们使用物理地址来找cache的,现在为了加快速度,我们使用线性地址来找对应的cache,这样更快,但是也会有相应的问题。。。

4k页的话,线性地址和物理地址的低12位(0~11)为页内偏移地址,他们是相等的无需映射。

32B的cache行的话,需要线性地址的5位(0~4)的cache行内偏移地址。

由于是64K的cache,cache行32B,4路组相连,故需64K/32*4共2^9个组。需9位来区分是那个cache组。需5~13,共9位线性地址。

这样就可以选定那个cache组,这时候tlb算物理地址也完成了,用物理地址&tags来判定选中的是组内的那个cache行。因为一个组只有4行,故最多只需判断4次,节约了时间。

那这里就出现了个问题,12~13这两位是线性地址,且与物理地址不一样(本来找cache是用物理地址的)。这样就会产生这种情况,本来要找的数据存在cache的a地址,但是线性地址的12~13位不可靠,不是物理地址,这样会有2个问题:

1,命中错误的cache行(设为地址b),误以为要找的数据没有在cache中,这样就会就数据在放到b中来。这样就会有同一数据在cache中的多个备份。(cache别名问题)

2,命中了错误的cache行,误以为那是正确的数据,导致数据错误。(当然后面会用1步算好的物理地址在去匹配一下,故这个错误不太可能发生)

故需页着色,4路组相连中,线性地址的12~13位必须和物理地址的12~13位相等——这可能需要在MMU等方面下足功夫才能保证。(嘿嘿,页着色解决的是cache别名的问题,但是解决方法和cache没有半毛钱关系)

同时也可以使内存分成16K来克服上述问题。还有一起其他的方法也可以解决页着色的问题。


  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值