第5章存储系统和结构5.1基本内容要求 存储系统是由几个容量、速度和价格各不相同的存储器构成的系统。设计一个容量大、速度快、成本低的存储系统是计算机发展的一个重要课题。本章重点讨论主存储器的工作原理、组成方式以及运用半导体存储芯片组成主存储器的一般原则和方法,此外还介绍了高速缓冲存储器和虚拟存储器的基本原理。 学习要求  了解存储器的各种分类方法。  了解存储系统的两个层次(Cache主存层次,主辅存层次)。  了解主存储器的基本结构。  理解主存储器的有关术语(如位、存储字、存储单元、存储体等)。  理解主存储器的主要技术指标。  掌握字节编址存储器的各种访问方法,将不同长度的数据按要求存放在存储器中。  了解半导体随机存储器(静态RAM和动态RAM)不同的基本存储原理。  理解动态RAM的3种不同刷新方式的特点。  了解RAM芯片的基本结构。  理解各种不同ROM的特点。  理解主存储器中包括RAM和ROM两种形式。  掌握主存储器容量的各种扩展方法,使用若干存储芯片构成存储器。  掌握存储芯片的地址分配和片选信号的产生。  理解主存储器和CPU的软连接(读写操作)。  了解主存的奇偶校验和ECC。  理解PC系列微机的存储器接口。  了解提高RAM芯片速度的技术。  了解并行交叉存储技术。  理解Cache的特点和Cache的实现技术。  理解虚拟存储器的概念。存储系统和结构第 5 章计算机组成原理教师用书(第4版)5.2教师授课参考 存储器是一个记忆装置,用来存放程序和数据,它是计算机五大功能部件中的重要部件,是计算机能够实现“存储程序控制”的基础。现代计算机系统都以存储器为中心,存储器在系统中的地位越来越重要。通常,将两个或两个以上速度、容量和价格各不相同的存储器用硬件、软件或硬件与软件相结合的方法连接起来形成存储系统。这个系统对应用程序员透明,即从应用程序员角度看,它是一个大的“存储器”,这个“存储器”的速度接近速度最快的存储器,存储容量与容量最大的存储器相等,单位容量的价格接近最便宜的存储器。 本章内容主要涉及三级存储系统中的主存储器和高速缓冲存储器,对于辅助存储器的讨论将在第8章中进行。本章的重点和难点比较多,如主存储器的组成和结构、主存容量的扩展、高速缓冲存储器的特点和实现技术等,特别是使用若干存储芯片构成主存储器、实际存储芯片与CPU的连接等问题对于初学者来说往往比较困难,需要花费比较多的时间介绍。在教学过程中要注意把握重点,如在讲解存储芯片与CPU的连接时,要关注存储空间的地址分配及片选逻辑的形成;在讲解Cache主存映像时,要关注Cache地址和主存地址的关系;等等。总之,要教会学生分析问题和解决问题的方法,使学生能运用基本原理和基本方法解决实际问题,而不是让学生死记硬背基本概念。 根据教育部发布的《全国硕士研究生入学统一考试计算机科学与技术学科联考计算机学科专业基础考试大纲》对计算机组成原理部分的要求看,本章对应考研大纲中的第四部分——存储器层次结构。 (一) 存储器的分类 (二) 存储器的层次化结构 (三) 半导体随机存取存储器 1. SRAM存储器 2. DRAM存储器 3. 只读存储器 4. Flash存储器 (四) 主存储器与CPU的连接 (五) 双口RAM和多模块存储器 (六) 高速缓冲存储器(Cache) 1. Cache的基本工作原理 2. Cache和主存之间的映射方式 3. Cache中主存块的替换算法 4. Cache写策略 (七) 虚拟存储器 1. 虚拟存储器的基本概念 2. 页式虚拟存储器 3. 段式虚拟存储器 4. 段页式虚拟存储器 5. TLB(快表) 考试的试题既可以以选择题形式出现,也可以以综合应用题形式出现,灵活运用基本原理和基本方法,对实际问题进行分析、设计是考查的热点,也是难点。这部分的综合应用题往往比较灵活,考生需要仔细分析试题才能解答。 5.3误点疑点解惑1. 存储系统和存储器在同一台计算机中,有各种工作速度、存储容量、访问方式、用途等均不相同的存储器,这些存储器构成一个层次结构,如图51所示。从上到下,各种存储器的存储容量越来越大,每位价格越来越便宜,但存取周期越来越长。 图51存储器的层次结构 需要提醒学生注意的是,并非将各种用途不同的存储器放在一起就构成了一个存储系统。存储系统是指两个或两个以上速度、容量和价格各不相同的存储器用硬件、软件或硬件与软件相结合的方法连接起来的一个系统。这个系统对应用程序员透明,可以把它看作一个“存储器”,其速度接近速度最快的存储器,存储容量与容量最大的存储器相等或接近,单位容量的价格接近最便宜的存储器。 所以,存储系统和存储器是两个完全不同的概念,如果在一台计算机中只有存储器,甚至有多种存储器,但没有存储系统,这台计算机的性能将会很差,这些存储器的性能也不可能得到充分发挥。 2. 主存储器组织 主存储器的核心是存储体,程序和数据都存放在存储体中。存储体是由若干存储单元组成的,存储单元的编号称为地址,地址和存储单元之间有一对一的对应关系。这就像一座大楼有许多房间,而每个房间都有其唯一房间号一样。 位是二进制数的最小单位,是半导体存储器的基本记忆单元。存储字由若干二进制位组成,可以作为一个整体存入或取出。一个存储单元可能存放一个字,也可能存放一个字节,这是由计算机的结构确定的。对于字编址的计算机,最小寻址单位是一个字,相邻的存储单元地址指向相邻的存储字;对于字节编址的计算机,最小寻址单位是一个字节,相邻的存储单元地址指向相邻的存储字节。所以,存储单元是CPU对主存可访问操作的最小存储单位,根据存储单元的地址可以找到相应存储单元的内容。 3. 字节编址计算机的大端方案和小端方案 许多数据格式使用多个字节表示一个数值,有两种常用的多字节数据排列顺序,即每个字中的字节顺序可以从左到右或从右到左编排,前者称为大端方案,后者称为小端方案。Intel 80x86是采用小端方案的机器,IBM 370、Motorola 680x0和大多数RISC计算机则采用大端方案,Power PC是一个既支持大端方案又支持小端方案的计算机。图52(a)描述的是使用大端方案的32位计算机的一段主存。图52(b)描述的是使用小端方案的32位计算机的一段主存。图中每个存储单元上的数字表示字节顺序。 图52大端方案和小端方案 例如,十六进制数01020304H从存储单元100H开始存储,则存储结果见表51。依照大端方案,最高字节存储在100H中,次高字节存储在101H中……;依照小端方案,最低字节存储在单元100H中,次低字节存储在101H中……。表51大端方案和小端方案存储结果大 端 方 案小 端 方 案存储器地址数据(十六进制)存储器地址数据(十六进制)1000110004101021010310203102021030410301大端方案和小端方案存放ASCII码字符串和BCD码数据的顺序相反,但是必须指出的是,不管是上述哪个系统,表示一个32位整数时两个方案是一致的。如6,都是在最右边的(最低位)3位上存放有110,前面29位都是0。也就是说,在大端方案中,110这3位应该放在字节3(或7、11等)中,而在小端方案中,110这3位应该放在字节0(或4、8等)中。 如果计算机只用来存放整数,就不会有任何问题,然而,许多应用中要存放的是整数、字符串和其他数据类型的混合结构,这就可能出现混乱。这个问题的解决方法是在每个数据项前面加上一个头描述其后的数据类型和数据长度,使接收方可对数据进行必要的转换。 对于字节和字而言,无论使用哪种排列组织方式,都不会影响CPU和计算机系统的性能。只要设计CPU处理一种特定的格式,就不存在谁比谁强的问题,主要问题在于具有不同排列组织方式的CPU之间传输数据的问题。例如,如果一个小端方案结构的计算机传输01020304H的数据给一个大端方案结构的计算机,而没有转换数据,那么该大端方案计算机读出的值为04030201H。有程序可以将两种数据文件进行格式转换,并且某些处理器有特殊的指令可以执行这种转换。 4. 主存储器的存储容量和存取速度 描述主存储器性能的主要技术指标是存储容量和存取速度。 1) 存储容量 存储容量是指整个主存储器所能存放的二进制信息的总位数,可以这样定义: SM=W×L其中,W为存储字数,L为存储器字长。 例如,某存储器字长16b,共有1024个存储字,那么该存储器的容量为 1024×16b=16 384b=2048B 需要注意的是,在存储器中常称16 384B为16Kb或2KB,这是因为,存储器中的1K不是1000,而是1024(210);1M不是1 000 000,而是1 048 576(220)。 2) 存取速度 主存的存取速度通常由存取时间Ta、存取周期Tm和主存带宽Bm等参数描述。 存取时间Ta是执行一次读操作或写操作的时间,即从地址传送给主存开始到数据能够被使用为止所用的时间间隔。存取周期Tm是指两次连续的存储器操作(如两次连续的读操作)之间所需要的最小时间间隔。一般情况下,Tm>Ta,对于破坏性读出的存储器,Tm=2Ta。 主存带宽Bm是指连续访问主存时主存所能提供的数据传送率。例如,对于SDRAM而言,若工作频率为100MHz,其数据传输率可以达到800MB/s(100×64÷8=800);若工作频率为133MHz,其数据传输率可以达到1.06GB/s(133×64÷8=1064)。对于DDR SDRAM而言,由于在同一个时钟的上升沿和下降沿都能传输数据,所以工作频率在200MHz时,数据传输率可以达到3.2GB/s(200×64×2÷8=3200)。 5. 边界对齐的数据存放方法 多字节字的一个值得关注的问题是对齐问题。现代微处理器在某一时刻可以读出多个字节的数据。例如,M68040微处理器能同时读入4个字节的数据,然而,这4个字节必须在连续的单元中,它们的地址除了最低两位不同之外,其余的位均相同。该CPU可以同时读单元100、101、102和103,但不能同时读单元101、102、103和104,后者需要两个读操作,一个操作读单元100(不需要的)、101、102和103,另一个操作读单元104、105(不需要的)、106(不需要的)和107(不需要的)。 在采用字节编址的存储器中,数据有3种不同的存放方法,其中边界对齐的存放方法是最有效的方法。边界对齐简单地说就是使存储多字节值的起始单元刚好是某个多字节读取模块的开始单元,所以边界对齐的数据存放方式对数据的存放位置有下列要求: 8位数据,占用1个存储单元,其地址为×…××××(任意)。 16位数据,占用2个存储单元,存放数据的起始地址为×…×××0(2的整倍数)。 32位数据,占用4个存储单元,存放数据的起始地址为×…××0 0(4的整倍数)。 64位数据,占用8个存储单元,存放数据的起始地址为×…×0 0 0(8的整倍数)。 例51某机字长32位,主存储器按字节编址,现有4种不同长度的数据(字节、半字、单字、双字),请采用一种既节省存储空间,又能保证任何长度的数据都在单个存取周期内完成读写的方法,将一批数据顺序存入主存,画出主存中数据的存放示意图。 这批数据一共有10个,它们依次为字节、半字、双字、单字、字节、单字、双字、半字、单字、字节。 解: 根据题干可以知道4种长度的数据分别为: 字节数据8位,半字数据16位,单字数据32位,双字数据64位。因为要保证任何长度的数据都在单个存取周期内完成读写,所以该机的存储字长应为64位。要特别注意的是,本例中数据字长(32位)和存储字长(64位)是不同的。 题干中要求采用一种既节省存储空间,又能保证任何长度的数据都在单个存取周期内完成读写的方法来顺序存入一批数据,所以只能选用边界对齐的存放方法,双字数据从字节地址为8的整倍数的地方开始存放,单字数据从字节地址为4的整倍数的地方开始存放,半字地址从字节地址为2的整倍数的地方开始存放。主存中数据的存放示意图如图53所示。 图53主存中数据的存放示意图 6. 动态随机存储器的刷新 动态随机存储器(DRAM)利用栅极电容存储信息,电容上的电荷会随着时间的推移泄漏,必须定时刷新。 在讨论刷新问题时,首先要清楚刷新和重写(再生)这两个完全不同的概念。重写是随机的,某个存储单元只有在破坏性读出之后才需要重写。而刷新是定时的,即使许多记忆单元长期未被访问,若不及时补充电荷,信息也会丢失。重写是按存储单元进行的,破坏性地读出了哪个单元就只对这个单元重写,而不需要涉及其他的存储单元;刷新则不论某个单元是否被读出,均需要进行,所以是以存储体矩阵中的一行为单位进行的。 刷新的方式主要有集中式、分散式和异步式3种。其中异步刷新方式是一种比较实用的刷新方式,它的死区比较小,且刷新次数比较少。 刷新通常是一行一行地进行的,每一行中各记忆单元同时被刷新,故仅需要行地址,不需要列地址。由刷新控制电路中的刷新计数器产生行地址,刷新操作类似于读出操作,但仅有RAS信号。 整个存储器中的所有芯片同时被刷新。考虑刷新问题时,应当从单个芯片的存储容量着手,而不是从整个存储器的容量着手。这是学生比较容易犯的一个错误,需要特别强调。 7. 各类半导体存储芯片的特点 半导体存储器包括半导体随机存储器(RAM)和半导体只读存储器(ROM)。RAM多用MOS型电路组成,MOS RAM按电路结构不同,又可分为静态RAM(SRAM)和动态RAM(DRAM)。 RAM是可读、可写的存储器,CPU可以对RAM的内容随机地读写访问。SRAM的存取速度快,但集成度低,功耗也较大,所以一般用来组成高速缓冲存储器和小容量主存系统;DRAM集成度高,功耗小,但存取速度慢,一般用来组成大容量主存系统。 ROM是只能随机读出而不能写入的存储器,用来存放不需要改变的信息。ROM的结构比RAM简单,集成度高,功耗低,可靠性高。 半导体存储芯片通过地址线、数据线和控制线与外部连接,地址线的数目与芯片容量有关;数据线的数目与芯片数据位数有关;控制线有读写控制线和片选线等。3种不同类型的半导体存储芯片的对外连接信号有所不同,根据芯片的引脚图就可以区分这是哪种类型的芯片,并且能知道此芯片容量的大小和数据的位数。下面以几个常见的存储芯片为例,讨论各种不同类型存储芯片的特点。 (1) SRAM芯片(如Intel 2114)的引脚如下:  地址线——Ai。  数据线——I/Oi。  片选线——CS。  读写控制线——WE。  Vcc——+5V,工作电源。  GND——地。 (2) DRAM芯片(如Intel 2164/4164)的引脚如下:  地址线——Ai。  数据线——DIN和DOUT。  行地址选通线——RAS。  列地址选通线——CAS。  读写控制线——WE。  Vcc——+5V,工作电源。  GND——地。 由于DRAM芯片集成度高,容量大,为了减少芯片引脚数量,DRAM芯片采用了地址复用技术,把地址线分成相等的两部分,分两次从相同的引脚送入。两次输入的地址分别称为行地址和列地址,行地址由行地址选通信号RAS送入存储芯片,列地址由列地址选通信号CAS送入存储芯片。因此,DRAM芯片每增加一条地址线,实际上是增加了两位地址,即增加了4倍的容量。 (3) EPROM芯片(如Intel 2732/2764/27128/27256)的引脚如下:  地址线——Ai。  数据线——Oi。  片选线——CE。  输出允许线——OE。  编程控制线——PGM。  Vcc——+5V,工作电源。  Vpp——编程电源。  GND——地。 读方式时,Vcc、Vpp都接+5V,CE和OE都接低电平(或负脉冲)。 编程方式时,Vpp接+21V,Vcc接+5V,CE为低,OE为高,PGM端应输入一个宽50ms的低电平脉冲,这是写一个存储单元的时间。 例52图54是某存储芯片的引脚图,请回答: 图54某存储芯片的引脚图 (1) 这个存储芯片的类型(是RAM,还是ROM)及容量。 (2) 若地址线增加一根,存储芯片的容量将变为多少? (3) 这个芯片是否需要刷新?为什么? 解: (1) 从芯片的引脚图可以看出,这是一个DRAM芯片,其容量为64K×1。 (2) 由于DRAM采用地址复用技术,故地址线增加一根,容量增加4倍,此时存储容量应为256K×1。 (3) 此芯片需要刷新,因为DRAM是利用栅极电容存储信息的,电容上的电荷会随着时间推移泄漏掉,必须定时刷新。 8. 存储芯片的地址译码系统 存储芯片的地址译码系统有单译码和双译码两种。 单译码方式仅有一个地址译码器。若译码器的输入线数为n,则输出线数为2n,即有2n条驱动线(又称字线)对应2n个存储单元。每个存储单元由一条字线选择。 双译码方式有两个译码器: 一个是X方向(行)译码器,一个是Y方向(列)译码器。这种方式将存储器地址分成两部分: X地址(nx)和Y地址(ny),即n=nx+ny;若nx=ny,每个译码器的输入为k=n2条线,输出为2k条线,每个译码器有2k条驱动线(驱动器)。每根驱动线驱动一行(列)存储单元,也就是说,每个存储单元由一条X方向驱动线和一条Y方向驱动线选择。 设n=16,nx=ny=8。对于单译码方式,需要一个16位输入的地址译码电路,输出65 536条驱动线(驱动器),对应65 536个存储单元。对于双译码方式,需要2个8位输入的地址译码器,X方向有256条驱动线(驱动器),Y方向也有256条驱动线(驱动器),共512条驱动线(驱动器)。双译码方式与单译码方式相比,驱动线(驱动器)减少了99.2%。 9. 存储容量的扩展及存储芯片与CPU的连接 主存储器是整个存储系统的核心,通常分为随机存储器(RAM)和只读存储器(ROM)两大部分,RAM和ROM在主存中是统一编址的。有些学生误认为主存中就只有RAM,这是不正确的。RAM用来存放供用户随机读写的用户程序和数据,也可以作为系统程序的工作区;ROM用来存放系统程序。不管是RAM,还是ROM,通常都是由许多个不同容量的芯片组成的,其芯片的数量取决于各个存储区域的容量和每个芯片容量的大小。 存储容量的扩展有位扩展、字扩展、字和位同时扩展3种。当所用存储芯片中每个单元的位数小于CPU访存的字长时,采用位扩展法;当所用存储芯片中每个单元的位数与CPU访存的字长相同,但所要求的存储容量大于一片芯片的存储容量时,采用字扩展法;当所用存储芯片的容量和每个单元的位数均不能满足要求时,不仅要位扩展,还需要字扩展,这就是字和位同时扩展。 简单掌握以上3种扩展方式并不是很困难的问题,真正的难点在于,如何利用不同类型(RAM和ROM)、不同容量的各种存储芯片组成符合特定要求的主存储器。在解决用若干存储芯片构成存储器的问题时,首先要清楚对存储器规模的基本要求,然后要了解可供使用的存储芯片的规格,至此就可以确定这个系统需要多少个芯片,并知道应当采用位扩展、字扩展,还是字和位同时扩展的方法。此时应把注意力主要放在地址空间的分配和片选逻辑的形成上,这是用存储芯片构成存储器的关键。 对于字扩展、字和位同时扩展的方法,必须考虑各个芯片或各组芯片的地址空间分配问题,建议先依次写出各个芯片或各组芯片在最大存储空间中的地址范围(最低地址和最高地址),接下来再根据地址分配列出芯片的片选逻辑,最后画出连接图。 由存储芯片构成存储器并与CPU连接时,要完成:  地址线的连接;  数据线的连接;  控制线的连接。 每个存储芯片上的引脚都与芯片的类型和容量对应,要注意连接到芯片上的地址线、数据线的数量和方向,尤其是当选用的多个芯片容量不同、位数不同时,更要特别小心。片选逻辑通常会用到译码器或其他的门电路,这要求学生有一定的数字电路的基础。还有一点需要提醒的是,ROM是只读存储芯片,芯片上没有读写控制引脚,因此不能将CPU的读写控制线接到ROM芯片上。 10. 选片地址的全译码和部分译码 CPU访问主存时需要首先给出地址码,一般将地址码分成片内地址和选片地址两部分。片内地址由低位的地址码构成,其长度取决于所选存储芯片的字数,选片地址由高位的地址码构成,用于选择存储芯片,大多数情况下由选片地址通过译码后产生存储芯片的片选信号。 选片地址的译码有全译码和部分译码之分。除去片内地址以外的全部地址位都参加译码的方法称为全译码,仅使用高位地址码的部分位参加译码的方法称为部分译码。 对于实际使用的存储空间小于CPU可访问的最大存储空间的情况,全译码意味着实际使用的存储空间的地址范围被严格地限定在最大允许的存储空间中某个一定的区间内,而其他的区域将是空闲的。也就是说,译码器的一些输出端将闲置,不接任何存储芯片。全译码方式的最大特点是使用的存储芯片的地址范围是唯一的,不存在地址重叠的问题。 对于实际使用的存储空间小于CPU可访问的最大存储空间的情况,部分译码仅使用高位地址码的部分位译码,剩余的地址位不参与译码,此时存储芯片的地址范围不再是唯一的,而出现了重叠的地址。其地址重叠区的个数取决于没有参加译码的高位地址码的位数: 如果有2位地址没有参加译码,就会出现4个地址重叠区;有3位地址没有参加译码,就会出现8个地址重叠区…… 11. 数据Cache和指令Cache 讨论存储系统时,通常认为指令和数据共享存储层次结构中的各级存储器的空间。对于主存储器和虚拟存储器来说,这种想法一般是正确的,但是对于Cache来说,数据和指令经常分别存储在独立的数据Cache和指令Cache中。之所以采用这种被称为哈佛结构的Cache,是因为这种结构允许处理器同时从指令Cache中提取指令和从数据Cache中提取数据。若某个Cache同时包含指令和数据时,就称它为统一Cache。 将指令Cache与数据Cache分开的另一优点是: 程序一般不会修改自己的指令,这样就可以把指令Cache设计成只读型设备,不允许对它所包含的指令进行修改,这意味着没有写回主存的问题。将指令Cache和数据Cache分开,还可以避免指令块与数据块之间产生冲突。但是,将指令Cache与数据Cache分开的缺点是: 编写自修改程序会变得更加困难。当某个程序想修改自己的指令时,这些指令就会被当作数据存储在数据Cache中,而不是存储在指令Cache中。要执行已被修改的指令,该程序必须利用特定的Cache刷新操作,以确保该指令的原始版本不会出现在指令Cache中。这样,在执行这些已修改的指令之前,该程序必须从主存储器中提取这些指令的修改版本。当数据Cache是写回式Cache时,还需要执行额外的Cache刷新操作,以确保在将已被修改的指令写入指令Cache中之前,已经将它们写回主存中。 某个系统的指令Cache通常会明显小于数据Cache(前者是后者的1/2~1/4),这是因为程序中的指令一般要比该程序中的数据占用的存储空间小得多,所以设计人员通常会选择将更多的芯片面积用于数据Cache,而不是用于指令Cache。 在许多系统中,存储层次结构中有多级存储器都是采用Cache实现的。最常见的情况是,将第1级Cache(它最接近处理器)作为独立指令Cache和数据Cache实现,而将其他各级Cache作为统一Cache实现。 12. 数据Cache的实现 数据Cache通常包含一个标记阵列和一个数据阵列,还有一个命中/缺失逻辑。标记阵列包含Cache中所含数据的地址,而数据阵列中包含的是数据本身。将Cache分成独立的标记阵列和数据阵列,可以减少Cache的访问时间,因为标记阵列通常要比数据阵列包含相对较少的位数,所以访问它要比访问数据阵列或者数据阵列和标记阵列的某种组合快得多。 一般来说,标记阵列被组织成二维结构,该结构中包括的每一行标记项都代表着Cache中的每一组,其列数等于Cache的相联度。图55显示了一个4路组相联Cache的标记阵列结构。 图554路组相联Cache的标记阵列结构 每个标记项描述一个数据Cache块。标记项由标记字段、有效位以及脏位(仅适用于写回式Cache)3部分组成,如图56所示。Cache块的大小又称为Cache的行长。 图56标记项 标记阵列需要占用的存储空间由以下因素决定: Cache中的块数、每项需要的标记字段位数、有效位和脏位。