10.4 存储器地图与缓存基础
第 10.3 节用分体和芯片组构建了存储硬件。软件需要更简单的视图:每个地址都应该标识一个预期目标。存储器地图(memory map)记录每个器件占用的闭区间地址范围。
构建完整且互不重叠的存储器地图
8086 使用 20 位物理地址,因此地址空间从 00000H 延伸到 FFFFFH。设计者把这片空间划分为已分配、保留和尚未分配的区域。对每个已分配区域:
必须加 1,因为两个端点都属于该区域。一种合理的地图可以把 256 KiB RAM 放在 00000H–3FFFFH,把 40000H–5FFFFH 保留给扩展设备,让 60000H–EFFFFH 暂不分配,并把 64 KiB ROM 放在 F0000H–FFFFFH。8086 复位后从物理地址 FFFF0H 开始取指,因此该地址必须指向顶部 ROM 中的启动代码。
两个已分配范围不能重叠,否则读操作可能让多个器件同时驱动总线,写操作也可能同时修改多个器件。空洞(hole)则不同:其中没有器件响应。空洞可以是有意保留的,但软件不能误把它当作存储器。
因此,检查存储器地图时要核对闭区间容量、译码器所要求的二的整数次幂对齐、重叠、空洞,以及复位位置等特殊体系结构地址。
缓存用容量换取速度
最初的 8086 有一个六字节指令预取队列,但它没有片上缓存。本节引入缓存术语,作为学习后续处理器的基础。
缓存(cache)是小而快的存储器,保存从更大、更慢存储器中复制出的近期数据块。它利用两类局部性:
- 时间局部性(temporal locality):刚刚访问过的数据很可能再次被访问。
- 空间局部性(spatial locality):靠近最近地址的数据很可能很快被访问。
在简单的直接映射缓存(direct-mapped cache)中,每个主存块只能放入一个确定的缓存行。若块大小和缓存行数都是二的整数次幂:
索引用来选择一条缓存行。当该行有效且保存的标记(tag)匹配时,访问命中(hit);否则访问未命中(miss),所需块会替换该行。首次访问从未装入的块会发生强制未命中。若多个活跃块映射到同一索引,它们可能反复驱逐彼此,产生冲突未命中。
第 10 章从存储单元技术出发,依次学习了芯片选择、分体构建、完整系统映射和缓存基本思想。现在,你已经能够沿着一个 CPU 地址追踪到最终响应它的具体存储结构。