当直接映射缓存中存在偏移量时,如何将内存地址映射到块?

How do I map a memory address to a block when there is an offset in a direct-mapped cache?

首先,第一个缓存有 16 个单字块。作为示例,我将使用 0x03 内存引用。索引有 4 位 (0011)。很明显,这些位等于 3mod16 (0011 = 0x03 = 3)。但是,我对使用这个 mod 方程来确定具有偏移位的高速缓存中的块位置感到困惑。

第二个缓存的总大小为八个双字块。这意味着有 1 个偏移位。由于现在有 8 个块,因此只有 3 个索引位。作为示例,我将采用相同的内存引用 0x03。但是现在我无法使用我之前使用的 mod 方程映射到块。我尝试 3mod8 是 3,但是在这种情况下,因为有一个偏移位,索引位是 001。001 不等于 3,所以做了什么我做错了吗?有偏移位时mod不生效吗?我的印象是 mod 方程总是等于索引位。

全在地址里。你得到了地址,然后屏蔽掉末尾的位数,原因如下。

  1. 缓存行中的字数。如果你有 2 字缓存行(取出一点,4 字 - 2 bts 等)
  2. 那么你有多少缓存行条目。 (如果是1024的cacheline,你取出10bits。这10bits是你的索引,剩下的bits是你的Tag)

现在,您还需要考虑'WAY'。如果它是一个直接映射的缓存,则以上内容适用。如果它是一个 2 路组关联缓存,你没有 1024 行,你有 512 个块,每个块有 2 行。这意味着你只需要 9 位来确定块的索引。如果它是 4 路,你有 256 个块,其中有 4 行,这意味着你的索引只需要 8 位。

在集合关联缓存中,索引是用来选择一个块的,一旦选择了一个块,就可以使用像LRU这样的策略来填充一个条目,以防缓存未命中。通过比较所选块中的标签来确定命中。

最重要的是,块位置不是由地址确定的,只有一个块由地址选择,然后通过其标签比较来查找数据。