文章目录
- 随机访问存储器
- SRAM
- 传统 DRAM
- 内存模块
- 增强的 DRAM
- 访问主存
随机访问存储器
SRAM
SRAM 将每个位存储在一个双稳态的存储器单元里,这样的电路可以无限期地保持在两个不同的电压配置或状态之一。其他任何状态都是不稳定的——从不稳定状态开始,电路会迅速地转移到两个稳定状态中的一个。类似于钟摆的状态。
当钟摆倾斜到最左边或最右边时它是稳定的。从其他任何位置,钟摆都会倒向一边或另一边。原则上,也能在垂直的位置无限期保持稳定,但是这个状态是亚稳态的——最细微的扰动也能使它倒下,而且一旦倒下就永远不会在恢复到垂直的位置。由于 SRAM 存储单元的双稳态特性,只有有电,它就会永远保持它的值。即使有干扰来扰乱电压,当干扰消除时,电路就会恢复到稳态。
传统 DRAM
:::color1
DRAM 芯片中的单元(位)被分成$ d∗ ∗ 个超单元( s u p e r c e l l ),每个超单元都由 ∗ ∗ ** 个超单元(supercell),每个超单元都由 **∗∗个超单元(supercell),每个超单元都由∗∗w∗ ∗ 个 D R A M 单元组成。一个 ∗ ∗ ** 个 DRAM 单元组成。一个 **∗∗个DRAM单元组成。一个∗∗d \times w∗ ∗ 的 D R A M 总共存储了 ∗ ∗ ** 的 DRAM 总共存储了 **∗∗的DRAM总共存储了∗∗dw∗ ∗ 位信息。超单元被组织成一个 ∗ ∗ ** 位信息。超单元被组织成一个 **∗∗位信息。超单元被组织成一个∗∗r∗ ∗ 行 ∗ ∗ ** 行 **∗∗行∗∗c∗ ∗ 列的长方形阵列,这里 ∗ ∗ ** 列的长方形阵列,这里 **∗∗列的长方形阵列,这里∗∗rc = d∗ ∗ 。每个超单元有形如 ∗ ∗ **。每个超单元有形如 **∗∗。每个超单元有形如∗∗(i, j)∗ ∗ 的地址,这里 ∗ ∗ ** 的地址,这里 **∗∗的地址,这里∗∗i∗ ∗ 表示行,而 ∗ ∗ ** 表示行,而 **∗∗表示行,而∗∗j $表示列。
:::
例如,图 6-3 展示的是一个 $ 16 \times 8 $ 的 DRAM 芯片的组织,有 $ d = 16 $ 个超单元,每个超单元有 $ w = 8 $ 位,$ r = 4 $ 行,$ c = 4 $ 列。带阴影的方框表示地址 $ (2, 1) $ 处的超单元。信息通过称为引脚(pin)的外部连接器流入和流出芯片。每个引脚携带一个 1 位的信号。图 6-3 给出了两组引脚:8 个 data 引脚,它们能传送一个字节到芯片或从芯片传出一个字节,以及 2 个 addr 引脚,它们携带 2 位的行和列超单元地址。其他携带控制信息的引脚没有显示出来。
要从该 DRAM 中读出超单元(2,1),内存控制器发送行地址 2。DRAM 的响应是将行 2 的整个内容都复制到一个内部行缓冲区。接下来,内存控制器发送列地址 1,DRAM 的响应是从行缓冲区复制出超单元(2,1)中的 8 位,并把它们发送到内存控制器。
降低芯片上地址引脚数量。
例如,如果 128 位 DRAM 被组织成一个 16 个超单元的线性数组,地址位 0~15,那么芯片会需要 4 个地址引脚而不是 2 个。二维阵列组织的缺点是必须分两步发送地址,这增加了访问时间。
'内存模块
DRAM 芯片封装在内存模块(memory module)中,它插到主板的扩展槽上。Core i7 系统使用的是 240 个引脚的双列直插内存模块(Dual Inline Memory Module, DIMM),它可以以 64 位为块传送数据到内存控制器和从内存控制器传出数据。
示例模块用 8 个 64 Mbit 的 8 M $ \times $ 8 的 DRAM 芯片,总共存储 64MB(兆字节),这 8 个芯片编号为 0~7。每个超单元存储主存的一个字节,而用相应超单元地址为 $ (i, j) $ 的 8 个超单元来表示主存中字节地址 A 处的 64 位字。在图 6-5 的示例中,DRAM 0 存储第一个(低位)字节,DRAM 1 存储下一个字节,依此类推。
要取出内存地址 A 处的一个字,内存控制器将 A 转换成一个超单元地址 $ (i, j) $,并将它发送到内存模块,然后内存模块再将 $ i $ 和 $ j $ 广播到每个 DRAM。作为响应,每个 DRAM 输出它的 $ (i, j) $ 超单元的 8 位内容。模块中的电路收集这些输出,并把它们合并成一个 64 位字,再返回给内存控制器。
通过将多个内存模块连接到内存控制器,能够聚合成主存。在这种情况下,当控制器收到一个地址 A 时,控制器选择包含 A 的模块 $ k $,将 A 转换成它的 $ (i, j) $ 的形式,并将 $ (i, j) $ 发送到模块k kk。
增强的 DRAM
有许多种 DRAM 存储器,而生产厂商试图跟上迅速增长的处理器速度,市场上就会定期推出新的种类。每种都是基于传统的 DRAM 单元,并进行一些优化,提高访问基本 DRAM 单元的速度。
:::warning
- 快页模式 DRAM(Fast Page Mode DRAM, FPM DRAM)。传统的 DRAM 将超单元的一整行复制到它的内部行缓冲区中,使用一个,然后丢弃剩余的。FPM DRAM 允许对同一行连续地访问可以直接从行缓冲区中得到服务,从而改进了这一点。例如,要从一个传统的 DRAM 的行i ii中读 4 个超单元,内存控制器必须发送 4 个 RAS/CAS 请求,即使是行地址i ii在每个情况中都是一样的。要从一个 FPM DRAM 的同一行中读取超单元,内存控制器发送第一个 RAS/CAS 请求,后面跟三个 CAS 请求。初始的 RAS/CAS 请求将行 $ i $ 复制到行缓冲区,并返回 CAS 寻址的那个超单元。接下来三个超单元直接从行缓冲区获得,因此返回得比初始的超单元更快。
- 扩展数据输出 DRAM(Extended Data Out DRAM, EDO DRAM)。FPM DRAM 的一个增强的形式,它允许各个 CAS 信号在时间上靠得更紧密一点。
- 同步 DRAM(Synchronous DRAM, SDRAM)。就它们与内存控制器通信使用一组显式的控制信号来说,常规的、FPM 和 EDO DRAM 都是异步的。SDRAM 用与驱动内存控制器相同的外部时钟信号的上升沿来代替许多这样的控制信号。我们不会深入讨论细节,最终效果就是 SDRAM 能够比那些异步的存储器更快地输出它的超单元的内容。
- 双倍数据速率同步 DRAM(Double Data-Rate Synchronous DRAM, DDR SDRAM)。DDR SDRAM 是对 SDRAM 的一种增强,它通过使用两个时钟沿作为控制信号,从而使 DRAM 的速度翻倍。不同类型的 DDR SDRAM 是用提高有效带宽的很小的预取缓冲区的大小来划分的:DDR(2位)、DDR2(4位)和 DDR3(8位)。
- 视频 RAM(Video RAM, VRAM)。它用在图形系统的帧缓冲区中。VRAM 的思想与 FPM DRAM 类似。两个主要区别是:1)VRAM 的输出是通过依次对内部缓冲区 的整个内容进行移位得到的;2)VRAM 允许对内存并行地读和写。因此,系统可以在写下一次更新的新值(写)的同时,用帧缓冲区中的像素刷屏幕(读)。
:::
访问主存
数据流通过称为总线(bus)的共享电子电路在处理器和 DRAM 主存之间来来回回。每次 CPU 和主存之间的数据传送都是通过一系列步骤来完成的,这些步骤称为总线事务(bus transaction)。
- 读事务(read transaction)从主存传送数据到 CPU。
- 写事务(write transaction)从 CPU 传送数据到主存。
总线是一组并行的导线,能携带地址、数据和控制信号。取决于总线的设计,数据和地址信号可以共享同一组导线,也可以使用不同的。同时,两个以上的设备也能共享同一总线。控制线携带的信号会同步事务,并标识出当前正在被执行的事务的类型。例如,当前关注的这个事务是到主存的吗?还是到诸如磁盘控制器这样的其他 I/O 设备?这个事务是读还是写?总线上的信息是地址还是数据项?
计算机系统配置主要部件是CPU 芯片、我们将称为I/O 桥接器(I/O bridge)的芯片组(其中包括内存控制器),以及组成主存的 DRAM 内存模块。这些部件由一对总线连接起来,其中一条总线是系统总线(system bus),它连接 CPU 和 I/O 桥接器,另一条总线是内存总线(memory bus),它连接 I/O 桥接器和主存。I/O 桥接器将系统总线的电子信号翻译成内存总线的电子信号。正如我们看到的那样,I/O 桥接器也将系统总线和内存总线连接到 I/O 总线,像磁盘和图形卡这样的 I/O 设备共享 I/O 总线。
CPU 执行加载操作——读事务movq A,%rqx地址 A 的内容被加载到寄存器 %rax 中。CPU 芯片上称为总线接口的电路在总线上发起读事务。
- CPU 将地址 A 放到系统总线上,I/O 桥将信号传递到内存总线。
- 主存感觉到内存总线上的地址信号,从内存总线读地址,从 DRAM 取出数据字,并将数据写到内存总线。I/O 桥将内存总线信号翻译成系统总线信号,然后沿着系统总线传递。
- CPU 感觉到系统总线上的数据,从总线上读数据,并将数据复制到寄存器%rax。
movq %rax,A寄存器%rax 的内容写到地址 A,CPU发起写事务。
- CPU 将地址放到系统总线上。内存从内存总线读出地址,并等待数据到达。
- CPU 将%rax 中的数据字复制到系统总线。
- 主存到内存总线读出数据字,并且将这些位存储到 DRAM 中。