目录
[1. 计算地址总位数](#1. 计算地址总位数)
[2. 计算块内偏移量](#2. 计算块内偏移量)
[3. 计算 Cache 组数与组号位数](#3. 计算 Cache 组数与组号位数)
[4. 计算标记位(Tag)位数](#4. 计算标记位(Tag)位数)
[5. 地址划分结果](#5. 地址划分结果)
[主存块与 Cache 行的映射关系](#主存块与 Cache 行的映射关系)
[1. 映射规则](#1. 映射规则)
[2. 示例映射](#2. 示例映射)
[CPU 访问主存单元 0240CH 的过程](#CPU 访问主存单元 0240CH 的过程)
[1. 地址分解](#1. 地址分解)
[2. 访问流程](#2. 访问流程)
组相联映射



主存地址划分
1. 计算地址总位数
主存容量 256KB = 2^8 × 2^10 B = 2^18 B,因此主存地址总长度为 18 位。
2. 计算块内偏移量
块大小 64B = 2^6 B,因此块内偏移占 6 位,用于定位块内字节。
3. 计算 Cache 组数与组号位数
- Cache 总块数:
1KB / 64B = 16块 - 2 路组相联 → 每组 2 行 → 组数 =
16 / 2 = 8 = 2^3组 - 因此组号占 3 位,用于定位 Cache 组。
4. 计算标记位(Tag)位数
标记位 = 地址总位数 - 组号位数 - 块内偏移位数 = 18 - 3 - 6 = 9位,用于唯一标识主存块。
5. 地址划分结果
| 地址段 | 位数 | 作用 |
|---|---|---|
| 标记位(Tag) | 9 位 | 标识主存块,与 Cache 组内各行标记比较 |
| 组号(Index) | 3 位 | 定位 Cache 中的目标组 |
| 块内偏移(Offset) | 6 位 | 定位主存块内的具体字节 |
主存块与 Cache 行的映射关系
1. 映射规则
- 主存块号 = 主存地址 / 块大小
- 组号 = 主存块号 mod 组数
- 主存块只能映射到对应组内的任意一行(2 路组相联 → 每组 2 行可选)
2. 示例映射
以主存块号 i 为例:
- 组号
g = i mod 8 - 可映射到第
g组的第 0 行或第 1 行 - 若组内两行均已满,则需按替换算法(如 LRU)替换其中一行
CPU 访问主存单元 0240CH 的过程
1. 地址分解
将十六进制地址 0240CH 转换为 18 位二进制:0240CH = 0000 0010 0100 0000 1100B
- 块内偏移(低 6 位):
000011B→0CH - 组号(中间 3 位):
010B→2组 - 标记位(高 9 位):
000000100B→04H
2. 访问流程
- 地址拆分:CPU 将 18 位地址拆分为 9 位标记、3 位组号、6 位块内偏移。
- 组定位 :根据组号
2定位到 Cache 的第 2 组。 - 标记比较 :将标记
04H与第 2 组内两行的标记并行比较:- 若某行标记匹配且有效位为 1 → Cache 命中
- 若未匹配或有效位为 0 → Cache 缺失
- 命中处理 :根据块内偏移
0CH,从命中行中读取目标字节并返回 CPU。 - 缺失处理 :
- 向主存请求读取包含
0240CH的整个主存块(64B)。 - 将主存块加载到第 2 组的空闲行中;若组内无空闲行,按替换算法淘汰一行。
- 更新该行标记为
04H,有效位置 1。 - 根据块内偏移
0CH读取目标字节并返回 CPU。
- 向主存请求读取包含