Content #
cache line 是缓存进行管理的一个最小存储单元,也叫缓存块。从内存向缓存加载数据也是按缓存块进行加载的,一个缓存块和一个内存中相同容量的数据块(下称内存块)对应。
我们先来看看缓存块的内部结构:
其中,V(valid)表示这个缓存块是否有效,或者说是否正在被使用;
M(modified)表示这个缓存块是否被写,也就是“脏”位;B 表示缓存块的
bit 个数。
假设要寻址一个 32 位的地址,缓存块的大小是 64 字节,缓存组织方式是 4 路组相连,缓存大小是 8K。经过计算我们得到缓存一共有 32 个组(8×1024÷64÷4=32)。那么对于任意一个 32 位的地址 Addr ,它映射到缓存的组号(set index)为 Addr 对组数 32 取模,组号同时也等于 Addr 的第 6~10 位( (Addr >> 6) & 0x1F ),Addr 的低 6 位很好理解,它是缓存块的内部偏移(26 为 64 字节),那么高 21 位是用来干嘛的呢?我们接着往下看。
确定需要被映射到哪个组之后,我们需要在该组的路中进行查询。查询方式也很简单,直接将每个缓存块 tag 的 bit 位和地址 Addr 的高 21 位逐一进行匹配。如果相等,就说明该内存块已经载入到缓存中;如果没有匹配的 tag,就说明缓存缺失,需要将内存块放到该组的一个空闲缓存块上;如果所有路的缓存块都正在被使用,那么需要选择一个缓存块,将其移出缓存,把新的内存块载入。
上面这个过程涉及到缓存块状态转换,而状态转换又涉及到有效位 V、脏位 M、标签 tag。总体来讲,缓存的状态转换有以下几种情况: