2016-11-30 217 views
0

首先,第一个缓存有16个单字块。作为一个例子,我将使用0x03内存引用。索引有4位(0011)。很明显,位等于3mod16(0011 = 0x03 = 3)。不过,我正在使用这个mod方程式来弄糊涂,以确定具有偏移位的缓存中的块位置。当直接映射缓存中存在偏移量时,如何将内存地址映射到块?

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

+0

你必须修改索引,而不是整个地址。 –

+0

我有点困惑。我认为索引是映射到块:S –

+0

我的意思是说你必须修改偏移量以上的位来获得索引。 (即去除标签位)。偏移位不影响地址映射到缓存中的哪一行,因此它们/它不是计算的一部分。 –

回答

2

其全部在地址中。你得到地址,然后屏蔽掉从最后的位数,原因如下。

  1. 缓存行中的字数。如果你有2个字的缓存行(需要一点点,4个字-2磅等)
  2. 然后你有多少个缓存行条目。 (如果是1024缓存行,则取10位,这10位是您的索引,其余位是您的标记)

现在,您还需要考虑'WAY'。如果它的直接映射缓存,如上所述。如果它是一个2路组相联高速缓存,你没有1024行,你有512块,每块有2行。这意味着你只需要9位来确定块的索引。如果它的4种方式,你有256块,其中有4行,这意味着你只需要8位索引。

在集合关联缓存中,索引用于选择一个块,一旦选择了块,在缓存未命中的情况下,使用可以使用类似LRU的策略来填充条目。命中率是通过比较所选块中的标记来确定的。

底线,块位置不是由地址决定的,只有一个块被地址选中,然后它的标签比较才能找到数据。