直接映射(Direct Mapping)是一种Cache地址映射方式,其核心规则是:主存中的每个数据块只能映射到Cache中唯一确定的行(Cache line),即通过主存地址中的“索引位(Index)”直接计算出该块应存放的Cache位置。
- ✅ 优点:硬件实现简单、查找速度快(只需比较1个Cache行的标记Tag);
- ❌ 缺点:存在**冲突失效(Conflict Miss)**风险高——即使Cache未满,若多个常用主存块映射到同一Cache行,会频繁相互驱逐,降低命中率。
例如:若Cache有64行,则主存块号 mod 64 决定其映射到哪一行;块号0、64、128…均映射到第0行。
在直接映射Cache中,主存地址被划分为三个字段:Tag(标记)、Index(索引)和Block Offset(块内偏移),划分依据由Cache的三个关键参数决定:
- Cache总大小(Capacity):如 32 KB
- 行(Line/Block)大小(Block Size):如 64 字节
- Cache行数(Number of Lines):= Capacity ÷ Block Size(对直接映射,也等于“组数”,因每组仅1行)
✅ 划分规则如下(从低地址到高地址,即右→左):
| 字段 | 位宽 | 计算方式 | 作用 |
|---|---|---|---|
| Block Offset | b=log2(Block Size)b = \log_2(\text{Block Size})b=log2(Block Size) | 由块内字节数决定 | 定位块内具体字节(如64B →b=6b = 6b=6位) |
| Index | i=log2(Number of Lines)i = \log_2(\text{Number of Lines})i=log2(Number of Lines) | 由Cache行数决定 | 直接选择Cache中哪一行(如2048行 →i=11i = 11i=11位) |
| Tag | 剩余高位 | t=主存地址总位数−i−bt = \text{主存地址总位数} - i - bt=主存地址总位数−i−b | 用于与Cache行的Tag字段比对,确认是否命中 |
🔹 示例:32位主存地址,Cache容量 16 KB,块大小 32 字节
- Block Size = 32 B →b=log232=5b = \log_2 32 = 5b=log232=5位(Offset)
- Number of Lines =16 KB÷32 B=51216\,\text{KB} ÷ 32\,\text{B} = 51216KB÷32B=512→i=log2512=9i = \log_2 512 = 9i=log2512=9位(Index)
- Tag位数t=32−9−5=18t = 32 - 9 - 5 = 18t=32−9−5=18位
因此地址格式为:[Tag: 18位] [Index: 9位] [Offset: 5位]
注意:Index字段不经过哈希或计算,而是直接作为Cache行号使用;Tag存储在Cache行中,匹配时需完全一致才命中。