【问题标题】:How do I map a memory address to a block when there is an offset in a direct-mapped cache?当直接映射缓存中有偏移量时,如何将内存地址映射到块?
【发布时间】:2016-11-30 16:15:27
【问题描述】:

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

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

【问题讨论】:

  • 你必须修改索引,而不是整个地址。
  • 我有点困惑。我认为索引是到块的映​​射:S
  • 我的意思是你必须修改偏移量以上的位才能获得索引。 (即删除标签位)。偏移位对地址映射到缓存中的哪一行没有影响,因此它们/它当然不是计算的一部分。
  • 我还是有点困惑 :( 偏移量 (LSB) 之前的位不包括索引位和标记位吗?我书中的声明说“块由(块地址)模(缓存中的块数)”。我猜“块”不等于索引?
  • 黑色位置不总是等同于索引吗?我一直认为索引是块位置地址。

标签: caching memory cpu-architecture cpu-cache


【解决方案1】:

全部在地址中。您获取地址,然后从末尾屏蔽掉位数,原因如下。

  1. 高速缓存行中的字数。如果你有 2 字高速缓存线(取出一点,4 字 - 2 bts 等)
  2. 那么你有多少缓存线条目。 (如果是 1024 缓存行,则取出 10 位。这 10 位是您的索引,其余位用于您的标签)

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

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

归根结底,块的位置不是由地址决定的,只是通过地址选择一个块,然后与它的Tag比较来查找数据。

【讨论】:

    猜你喜欢
    • 2018-06-24
    • 2023-03-03
    • 2018-05-24
    • 2015-07-07
    • 2012-04-11
    • 2020-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多