Appearance
题目
某计算机主存按字节编址,由 4 个 64M×8 位的 DRAM 芯片采用交叉编址方式构成,并与宽度为 32 位的存储器总线相连,主存每次最多读写 32 位数据。若 double 型变量 x 的主存地址为 804001AH,则读取 x 需要的存储周期数是( )。
错因
A
以为"交叉编址 + 4 个体" = 一次能并行取 4 字节 × 双向 = 8 字节,恰好装 double。但总线宽度只有 32 位 = 4 字节——一次最多取 4 字节,不是 8 字节。即使 4 个体并行启动,受总线宽度限制,每个存储周期最多送 4 字节出去。
B
按"地址对齐"想:以为 double 起始地址刚好是 4 字节边界,8 字节 = 2 个 32 位字,2 个存储周期搞定。但题给地址 0x0804_001A——末位 A 的二进制 1010,不是 4 字节对齐(4 字节对齐要求末 2 位为 00)。错位起始 → 跨 3 个 32 位字。
D
可能算式:8 字节 / 2(每周期有效字节数)= 4 周期,把第一个和最后一个字的"部分有效"算成"全部只能拿 2 字节"。或者把每次只能取一个字节误当结论。错在没区分"一个存储周期能传 4 字节"和"该 4 字节里有几字节属于 x"。
总解析
第一步:理清两个关键约束
| 约束 | 含义 |
|---|---|
| 总线宽度 32 位 | 一个存储周期最多传 4 字节 |
| 4 个 DRAM 体低位交叉编址 | 末 2 位地址决定体号;4 个体可并行启动 |
| 总线"一次取一个字" | 取的是 4 字节对齐的字(地址末 2 位 = 00 的字) |
第二步:列出 double 变量 x 占用的字节地址
double = 8 字节,从 0x0804_001A 起:
| 字节序号 | 字节地址 | 末 2 位 |
|---|---|---|
| 0 | 0x0804_001A | 10 |
| 1 | 0x0804_001B | 11 |
| 2 | 0x0804_001C | 00 |
| 3 | 0x0804_001D | 01 |
| 4 | 0x0804_001E | 10 |
| 5 | 0x0804_001F | 11 |
| 6 | 0x0804_0020 | 00 |
| 7 | 0x0804_0021 | 01 |
第三步:每个存储周期取一个 4 字节对齐的字,看 x 跨了哪些字
4 字节对齐 = 末 2 位 = 00。把 8 个字节地址按对齐边界分组:
| 对齐字(基址) | 字范围 | 包含 x 的字节 | x 占多少字节 |
|---|---|---|---|
| 0x0804_0018 | 0x...18 ~ 0x...1B | 0x...1A, 0x...1B | 2 字节 |
| 0x0804_001C | 0x...1C ~ 0x...1F | 0x...1C ~ 0x...1F | 4 字节 |
| 0x0804_0020 | 0x...20 ~ 0x...23 | 0x...20, 0x...21 | 2 字节 |
x 跨了 3 个 32 位字 —— 即使第一个字和最后一个字都只贡献 2 字节,也必须完整读出整个 4 字节字才能拿到那 2 字节,每个字一个存储周期。
最终答案是 C(3)。
对照内存视图直观看:
字节地址末位: 8 9 A B | C D E F | 0 1 2 3
字界限: ─────第1字──── ────第2字───── ────第3字────
x 占用: ▓ ▓ | ▓ ▓ ▓ ▓ | ▓ ▓
└─2字节─┘ └──4字节──┘ └─2字节─┘
存储周期: 周期 1 周期 2 周期 3易错点速查:
- "交叉编址 4 个体" ≠ "一次取 4 字节字宽 × 4 = 16 字节",仍受总线宽度限制
- 地址不对齐 → 跨界访问 → 多 1 个周期;double 起始末 2 位 = 10,必然跨字
- 哪怕一个 4 字节字里只用到 1~2 字节,仍要消耗 1 个完整存储周期