当 cache size = 16 bytes 且 cache line size = 4 bytes,并且是 direct-mapped cache (直接映射缓存) 时,可以根据以下规则配置缓存:
1. 基本计算
- 总缓存大小 = 16 bytes(整个缓存可以存储的字节数)。
- Cache line 大小 = 4 bytes(每一行存储的字节数)。
- 总行数 = Cache size Cache line size = 16 4 = 4 \frac{\text{Cache size}}{\text{Cache line size}} = \frac{16}{4} = 4 Cache line sizeCache size=416=4行。
- 每个 cache line 存储 4 bytes 的数据。
- 因为是 direct-mapped cache,每个内存块只能映射到唯一的一行。
2. 配置缓存结构
一个缓存行需要以下几个部分:
- Valid Bit:表示该行是否有效(占用 1 bit)。
- Tag:用来唯一标识内存地址的高位部分。
- Data:存储从内存中加载的数据。
地址分解:
假设系统的地址总线是 8 位(即内存地址范围为 0-255),我们将地址划分为以下部分:
- Offset (块内偏移):
- 决定数据在 cache line 内的具体位置。
- 每行 4 bytes,需要 log 2 ( 4 ) = 2 \log_2(4) = 2 log2(4)=2bits。
- Index (行号):
- Tag (标签):
- 剩下的高位部分,用来区分同一个缓存行不同地址。
- 地址总共 8 位,减去 offset 和 index 后,Tag 占 ( 8 - 2 - 2 = 4 ) bits。
3. 配置细节
Cache Line | Valid | Tag (4 bits) | Data (4 bytes) |
---|---|---|---|
Line 0 | 0/1 | xxxx | [Byte 0, Byte 1, Byte 2, Byte 3] |
Line 1 | 0/1 | xxxx | [Byte 4, Byte 5, Byte 6, Byte 7] |
Line 2 | 0/1 | xxxx | [Byte 8, Byte 9, Byte 10, Byte 11] |
Line 3 | 0/1 | xxxx | [Byte 12, Byte 13, Byte 14, Byte 15] |
4. Direct-Mapped 缓存的映射规则
内存地址的结构如下(假设地址是 8 位):
[ Tag (4 bits) | Index (2 bits) | Offset (2 bits) ]
- Index:决定内存块映射到哪一行。
- 例如:
- 地址
0b00000000
的 Index 是00
(对应 Line 0)。 - 地址
0b00000100
的 Index 是01
(对应 Line 1)。 - 地址
0b00001000
的 Index 是10
(对应 Line 2)。 - 地址
0b00001100
的 Index 是11
(对应 Line 3)。
- 地址
- 例如:
- Offset:决定读取或写入该缓存行内的具体字节。
- Tag:区分不同的内存块。
5. 示例映射
假设访问以下内存地址:
- 地址 ( \text{0b00000000} ):
- Index =
00
,Tag =0000
。 - 被加载到 Line 0。
- Index =
- 地址 ( \text{0b00000100} ):
- Index =
01
,Tag =0000
。 - 被加载到 Line 1。
- Index =
- 地址 ( \text{0b00010000} ):
- Index =
00
,Tag =0001
。 - 会替换 Line 0 中的数据。
- Index =
6. 总结
- Cache 大小:16 bytes。
- Cache 行数:4 行。
- 每行数据大小:4 bytes。
- 映射规则:
- 根据地址中的 Index 决定缓存行。
- 使用 Tag 区分不同块。
- 根据 Offset 确定块内偏移。