第四章 存储器

4.1 概述

一、存储器分类

  1. 按存储介质分类

    • 半导体存储器 (TTL、MOS)
    • 磁表面存储器 (磁头、载磁体)
    • 磁芯存储器 (硬磁材料、环状元件)
    • 光盘存储器 (激光、磁光材料)
  2. 按照存取方式分类

    • 存取时间与物理地址无关(随机访问)
      • 随机存储器(RAM):在程序执行过程中可读可写
      • 只读存储器(ROM):在程序执行过程中只读
    • 存取时间与物理地址有关(串行访问)
      • 顺序存取存储器:磁带
      • 直接存取存储器:磁盘
  3. 按在计算机中的作用分类

    按照在计算机中的作用进行分类,存储器可以分为主存储器和辅存储器。其中主存储器可以分为随机存储器(RAM)和只读存储器(ROM)。一般用户到数据和程序是存储在RAM中,一些系统参数则保存在ROM中。RAM还可以进一步的分类:分为静态RAM和动态RAM。ROM还可以进一步分为:MROM(掩模只读存储器)、PROM(可编程的只读存储器)、EPROM(电可编程只读存储器)、EEPROM(带电可擦可编程只读存储器)。

    辅助存储器和主存储器之间还可以放上一层flash memory,常用的U盘就是flash memory来做的,是半导体存储器,它的速度比磁盘要快,但比主存储器要慢。由于主存和辅存之间速度差异比较大,因此flash memory可以作为辅助存储器的缓冲。

    另外还有一种 高速缓冲存储器(cache),它是放在主存储器和CPU之间的,速度很高。(通常来说,cache就是使用静态RAM来做的)。

    辅助存储器:磁盘、磁带、光盘。

二、存储器的层次结构

  1. 存储器三个主要特征的关系

    存储器的三个主要特征:速度、容量、价格。

    价格则是由高到低。

    为什么会出先这么多种的存储器呢?

    因为任何一种单一的存储器都不能满足用户的要求。用户需要的是高速度、大容量、低价格的存储器。那么解决的办法就是采用这种层次结构,形成一个存储体系。所谓存储体系是指:把两种或者两种以上的存储介质构成的存储器用软件、硬件或者软硬件相结合的方式把不同的存储介质连接成一个整体,使得从某一级程序员的角度去看,这个整体具有高速度、大容量、低价格的特征。

  2. 缓存-主存层次和主存-辅存层次

    计算机的主机由CPU和主存构成,CPU可以在主存中读信息,也可以把运行的结果保存在主存中,但是主存的容量是有限的,因此需要我们的辅助存储器。但是程序的是在主存中运行的,一个程序要运行就要掉入到主存中,因此主存储器和辅助存储器之间也是有信息交换的。因此主存储器和辅助存储器构成了一个存储层次。在这个存储层次上,利用软硬件相结合的方法把主存储器和辅助存储器构成了一个整体,这个整体有主存储器的速度、辅助存储器的容量和价格。

    另外,主存储器的速度和CPU的速度也是有差异的。为了解决这个问题,我们在CPU和主存储器之间加上了一层缓存(cache)。CPU可以直接访问缓存,通过缓存来访问主存储器;缓存和主存储器之间也进行信息交换。如果把CPU常用的指令、数据都放到缓存当中,计算机的速度就会得到很大的提升。在这个地方用到了一个原理:程序的局部性原理

    我们把现代计算机当中的各种存储设备、存储元件分为了两个层次:缓存-主存层次和主存-辅存层次。其中缓存-主存层次是采用硬件方法把其连接成一个整体,主存-辅存层次采用软硬件相结合的方式连接成一个整体。

    缓存-主存层次主要是解决速度问题,主存-辅存层次主要是解决容量问题。这也就决定了缓存-主存层次要采用硬件方法来连接成一个整体。

    主存储器和辅助存储器构成了一个整体,一般来说,我们把其称为虚拟存储器。那么就有一个问题:虚拟存储器的地址空间是如何来定义的呢?是使用主存储器的地址空间,还是使用辅助存储器的地址空间?在这个层级就给出了新的地址空间,叫做虚地址

    缓存和主存储器这个层次用的就是主存储器的地址空间,主存储器用到的地址称为实地址

4.2 主存储器(重点)

一、主存储器概述

  1. 主存的基本组成

    在前面我们了解到主存储器主要由MAR、MDR、存储体构成,我们的指令和数据都保存在存储体中。其实主存储器的结构要更加复杂。MAR中保存了我们要访问的存储单元的地址,必须经过译码器译码以后,我们才可以选定指定的存储单元。MDR中保存了我们要读出或者写入的数据,这个数据到底是读出还是写入是由读写电路和控制电路来控制的。如果是写入数据,那么就会把MDR中保存的数据写入带MAR指定的存储单元中;如果是读出数据,指定的存储单元中的内容就会被送入到MDR。

  2. 主存和CPU的联系

    CPU和主存之间的连接信号分成了三类:数据总线、地址总线、控制总线

    数据总线完成了CPU和主存之间的数据传输,因此数据总线连接在MDR寄存器上(双向);

    地址总线连接在MAR寄存器和主存的地址总线之间,给出了要访问的内存单元的地址,所以它是单向的,从CPU送到主存。

    控制总线给出了两个:读出或者写入,都是单向的。由CPU送给主存储器。

    疑问:第一章给出的存储器结构图中,MAR、MDR是在存储器中的,但是现在又画在CPU中?

    答:可以确定的回答是MAR、MDR是在CPU中的。至于在内存中的那张图可以理解为:MDR和MAR是配置给主存使用的,但是实际物理存在 不是在主存中。因此也有人回答说:逻辑上属于主存,物理上集成在CPU里。

  3. 主存中存储单元地址的分配

    存储单元中二进制代码的组合称为存储字。存储单元中二进制代码的位数称为存储字长。

    :“位(bit)”是电子计算机中最小的数据单位。每一位的状态只能是0或1。字节:8个二进制位构成1个“字节(Byte)”,它是存储空间的基本计量单位。1个字节可以储存1个英文字母或者半个汉字,换句话说:1个汉字占据2个字节的存储空间。“字”由若干个字节构成字的位数叫做字长,不同档次的机器有不同的字长。例如一台8位机,它的1个字就等于1个字节,字长为8位。如果是一台16位机,那么,它的1个字就由2个字节构成,字长为16位。字是计算机进行数据处理和运算的单位。KB:K表示1024,也就是2的10次方。1KB表示1K个Byte,也就是1024个字节。

    假设主存储器的存储字长为32位,意味着对这个存储器的某个存储单元每次最多可以读取或者写入32个0或者1.

    那么12345678H这个16进制数如何在主存储器中进行存储?

    有两种方式:一、大端/大尾方式,二、小端/小尾方式。

    对于大端方式:高位字节地址为字地址,高位字节在前,低位字节在后,这是人类读写数值的方法。

    对于小端方式:低位字节地址为字地址,低位字节在前,高位字节在后。

    还有一个比较形象的图:

    首先,为什么会有小端字节序?答案是,计算机电路先处理低位字节,效率比较高,因为计算都是从低位开始的。所以,计算机的内部处理都是小端字节序。但是,人类还是习惯读写大端字节序。所以,除了计算机的内部处理,其他的场合几乎都是大端字节序,比如网络传输和文件储存。计算机处理字节序的时候,不知道什么是高位字节,什么是低位字节。它只知道按顺序读取字节,先读第一个字节,再读第二个字节。如果是大端字节序,先读到的就是高位字节,后读到的就是低位字节。小端字节序正好相反。理解这一点,才能理解计算机如何处理字节序。

  4. 主存的技术指标

    • 存储容量:主存存放二进制代码的总位数
    • 存储速度
      • 存取时间
      • 存取周期
    • 存储器的带宽

二、半导体存储芯片简介

  1. 半导体存储芯片的基本结构

    地址线(单向):由CPU指向存储器或者由IO设备的控制器指向存储器;

    数据线(双向):完成数据的读/写。

    芯片容量:地址线决定了存储矩阵有多少存储单元,数据线决定了每个存储单元的存储字长为几位。举个例子:地址线为10位,数据线位为8位。那么存储矩阵有1K个存储单元,每个存储单元有8位,因此芯片容量位1K * 8 = 8K。

    片选线:芯片选择线,本次访问的数据在哪几个芯片中,是由片选线确定的。(CS/CE,低电平有效)

    读写控制线:表示本次对半导体芯片的操作是读操作还是写操作。(可以是一根线也可以是两根线)

  2. 半导体存储芯片的译码驱动方式

    (1) 线选法

    地址线A0-A3说明有16个存储单元,数据线D0-D7说明每个存储单元有8位。

    工作过程:如果地址线的输入为0000,那么经过译码器译码之后,只有0的这条线是有效的,其余15条线均无效。如果是现在进行是一个读操作,那么读信号会控制控制电路将通路打开,使数据可以从存储矩阵送到数据总线。

    存在的问题:对于容量稍大一些的芯片来说需要集成的字线会相当多。比如1M * 8的芯片,需要的地址线位20根,字线要有100多万条。不合适。因此有了下面的“重合法”。

    (2) 重合法

    对于1M * 8的芯片,线选法只有一个译码器,地址线20根,需要字线1M条字线。对于重合法,可以将20根地址线分为10根行地址,10根列地址。这样需要的字线一共就2K条。相比于1M条线,少了很多。

三、随机存取存储器(RAM)

随机存储器可以分为两类:静态RAM和动态RAM。

  1. 静态RAM(SRAM)

    • 静态RAM基本电路(双稳态触发器存储0和1)

      双稳态触发器是一种具有记忆功能的逻辑单元电路,它能储存一位二进制码。它有两个稳定的工作状态,在外加信号触发下电路可从一种稳定的工作状态转换到另一种稳定的工作状态。

      后续课程中以Intel 2114为例介绍了静态RAM矩阵的读操作和写操作。

  2. 动态RAM(DRAM)

    • 动态RAM基本单元电路(电容有无电荷存储0和1)

      (三管动态RAM和单管动态RAM)

      三管动态RAM读出的信息与原信息相反,写入与输出信息相同。单管动态RAM读出时数据线有电流位“1”,写入时电容充电为“1”,放电为“0”。

      对于三管动态RAM以Intel 1103(1k * 1位)为例介绍了读操作和写操作。

      在行地址译码器这个地方参加译码的不仅仅是地址同时还有读写控制信号。

      对于单管动态RAM以Intel 4116(16K* 1位)为例介绍其读操作和写操作。

      按理来说16k * 1位需要14根地址线,但是4116芯片只有7根地址线,它的地址是分两次传入的,第一次芯片的7位地址线接收到的是7位的行地址,放到行地址缓存器;第二次接收到的是7位列地址,放到列地址缓存器。

  3. 动态RAM刷新

    动态RAM是利用电容存储电荷的方式来保存信息的,电容非常小,很容易漏电,一段时间内如果我们不对电容中的信息进行再生的话,电容的信息就会丢失。这就是为什么要对动态RAM刷新。

    刷新与行地址有关,与列地址无关。也就是说每一次刷新是刷新一行所有的基本单元电路。

    动态RAM刷新的方式有3种:

    • 集中刷新(假设存取周期为0.5微秒)

      以128 * 128的芯片矩阵为例,假设刷新周期为2ms

      在刷新时,无论是CPU还是IO都无法与动态RAM进行数据交换,因此刷新这一段时间称为死区:05微秒 * 128 = 64微秒。

    • 分散刷新(假设存取周期位1微秒)

      以128 * 128的芯片矩阵为例

      tm是原来的读写周期位0.5微秒,tr也为0.5微秒,专门用于某一行的刷新。tc=tm+tr,这样就把读写周期变为原来的2倍。集中式刷新是2ms刷新128行,现在是每个微秒刷新一行,刷新128行需要128微秒,那么2ms每一行就被刷新了15.6次。无死区。

    • 异步刷新(分散刷新和集中刷新相结合)

      对于128 * 128的存储芯片(存取周期位0.5微秒)每隔15.6微秒刷新一行

      相对于单个15.6微秒,这属于集中刷新。但相对于整个2ms的刷新周期来说,属于分散刷新。死区为0.5微秒,将刷新安排在指令译码阶段,不会出现死区。

  4. 动态RAM和静态RAM比较

    所以一般DRAM是做主存,SRAM做Cache。因为SRAM速度快,但是功耗高、价格高,不适合大规模使用。

四、只读存储器(ROM)

  1. 掩膜ROM(MROM)

    掩膜ROM只可以进行读,里面的任何信息都无法修改。

  2. PROM(一次性编程)

    一次性、破坏性进行编程

  3. EPROM(多次性编程,电可编程只读存储器)

    N型沟道浮动栅MOS电路。

    通过紫外线照射进行擦除。

  4. EEPROM(多次性编程,带电可擦可编程只读存储器)

    电可擦写、局部擦写、全部擦写

  5. Flash Memory(闪速型存储器)

    • EPROM 价格便宜、集成度高
    • EEPROM 电可擦洗重写
    • Flash Memory 比EEPROM速度快,具备RAM功能

五、CPU和主存储器的连接

CPU的地址线条数比较多,寻址范围也比较大。要构成一个主存储器需要多个存储芯片共同组成。

  1. 存储器容量的扩展

    • 位扩展(增加存储字长)

      用2片1K * 4位 存储芯片 组成 1K * 8位的存储器。需要地址线10根、数据线8根。

      这两个芯片的片选信号CS和读写信号WE一定要连接在一起。

    • 字扩展(增加存储字的数量)

      用2片1K * 8位 存储芯片组成 2K * 8位的存储器。

      需要11根地址线、8根数据线。但这两个芯片不能同时工作,因为都连着D0-D7的数据线。所以A0-A9作为地址线,第11根地址线A10作为片选信号来决定选取哪一个芯片。

    • 字、位扩展

      用8片1K * 4位存储芯片组成4K * 8位的存储器。需要12根地址线、8根数据线。其中A0-A9作为地址信号送入芯片,剩余的两根A10、A11作为片选信号决定选取哪一组芯片。

  2. 存储器和CPU的连接

    • 地址线的连接

      存储芯片的容量不同,其地址线数也不同,CPU的地址线数往往比存储芯片的地址线数多。通常总是将CPU地址线的低位与存储芯片的地址线相连。CPU地址线的高位或在存储芯片扩充时用,或做其他用途,如片选信号。

      test:

4.3 高速缓冲存储器(重点)

4.4 辅助存储器

参考文章