1、十六位微机原理及接口技术 第8页 存储器 §3-1 存储器的概述 §3-1-1 存储器的分类 存储器的种类很多,可以从不同角度对其进行分类,如按所使用的存储介质分、按在计算机中的作用分、按存取方式分类等。 1. 按存储介质分类 凡是具有两种不同物理状态的物质和元件都可以用来作为存储器的存储介质,以记忆“0”和“1”。目前使用的存储介质主要是半导体器件和磁性材料,用半导体器件做成的存储器称为半导体存储器,用磁性材料做成的存储器称为磁表面存储器,如磁盘存储
2、器和磁带存储器。本章主要讨论半导体存储器。 2.按在计算机系统中的作用分类 按存储器在计算机系统中所起的作用或用途,可分内存储器、外存储器、缓冲存储器和控制存储器。 (1)内存储器 简称内存,位于计算机主机内部,是计算机的主要存储器,所以,也称主存储器或主存。用来存放CPU当前使用的或经常使用的程序和数,CPU可以随时直接对主存进行访问(读/写),内存通常由半导体存储器组成。内存的特点是速度快,但容量相对于外存要小。 (2)外存储器 外存储器也称辅助存储器,简称外存,外存储器由磁表面存储器构成。目前主要使用的外存有软盘、硬盘、光盘等。外存的特点是:存储容量大,速度慢,CPU不能直接
3、访问,要由专用设备(如磁盘驱动器)来管理。 外存储器的容量可以很大,如CD-ROM光盘,其容量可达650MB,硬盘容量已达几十GB,而且其容量还在增加,故也称外存为海量存储器。外存常用来存放系统软件和大型数据文件及数据库或不经常使用的数据和程序。通常将外存储器归入到计算机外部设备一类,外存所存放的信息只有调入内存后CPU才能使用。控制存储器用于微程序控制中存放微程序,关于缓冲存储器将在3-4节中介绍。 3.按存取方式分类 按存储器的存取方式(或读写方式)来分,存储器可分为随机存取存储器(RAM)和只读存储器外(ROM)两大类。 (1)随机读写存储器RAM RAM也称读写存储器,即CP
4、U在运行过程中能随时进行数据的读出和写入。RAM中存放的信息当关闭电源时会全部丢失,所以,RAM是易失性存储器,只能用来存放暂时性的输入输出数据、中间运算结果、用户程序,也常用它来与外存交换信息或用做堆栈。通常人们所说的微机内存容量就是指RAM存储器的容量。 按照RAM存储器存储信息的电路原理的不同,RAM又分为静态RAM和动态RAM两种。 SRAM集成度不易做的很高,功耗也较大。一般,常用作微型计算机系统的高速缓冲存储器(Cache)。 DRAM集成度可以做得很高,成本低,功耗少,但它需外加刷新电路。DRAM工作速度要比SRAM慢很多,一般微机系统中的内存储器多采用DRAM。 (2)
5、只读存储器ROM ROM是一种当写入信息后,就只能读出而不能改写的固定存储器。断电后,ROM中所存的信息仍保持不变,所以,ROM是非易失性存储器。因此,微机系统中常用ROM来存放固定的程序和数据,如监控程序、操作系统中的BIOS(基本输入输出系统)、BASIC解释程序或用户需要固化的程序。 按照构成ROM的集成电路内部结构的不同,ROM又可分为以下几种: ●掩膜ROM ●PROM 可编程ROM(Programable ROM)。该存储器在出厂时器件中不存入任何信息,是空白存储器,由用户根据需要,利用特殊方法写入程序和数据,但只能写入一次,写入后就不能更改,它类似于掩膜ROM,适合小批
6、量生产。 ●EPROM 可擦除可编程ROM(Erasable PROM),如2723(4K×8)、2764(8K×8),该存储器允许用户按规定的方法和设备进行多次编程,如编程之后想修改,可用紫外线灯制作的抹除器照射约20分钟左右,使存储器全部复原,用户可再次写入新的内容。这对于工程研制和开发特别方便,应用较广。 ●EEPROM/E2PROM 电可擦除可编程ROM(Elecbically Erasable PROM) E2PROM的特点是:能以字节为单位进行擦除和改写,而不是像EPROM那样整体擦除,也不需要把芯片从用户系统中拔下来用编程器编程,在用户系统即可进行。随着技术的发展,E2
7、PROM的擦写速度将不断加快,容量将不断提高,可作为非易失性的RAM使用。 无论是哪一种形式的ROM,在使用时只能读出,不能写入,断电时,存放的ROM中的信息都不会丢失,所以,是一种非易失性的存储器。 §3-1-2存储器的一般结构 图3-2所示为内存储器的组成示意图。它由存储体、地址寄存器、地址译码驱动电路、读写电路、数据寄存器和控制逻辑等六部分组成。 随着大规模集成电路的发展,已将地址译码驱动电路,读写电路和存储体集成在一个芯片内,称为存储器芯片。芯片通过地址总线、数据总线和控制总线与CPU相连接。 地址寄存器 译码驱动电路 读写电路 数据寄存器 存储体
8、 ··· 从CPU来 有关部件 控制逻辑 启动 读写 图3-2 存储器的基本组成 存储体——是存储单元的集合体。它由若干个存储单元组成,每个存储单元又由若干个基本存储单元(或称存储元)组成,每个存储元可存放一位二进制信息。通常,一个存储元为一个字节,存放8位二进制信息,以字节来组织。为了区分不同的存储单元和便于读写操作,每个存储单元有一个地址(称为存储单元地址),CPU访问时按地址访问。为了减少存储器芯片的封装引线数和简化译码器结构,存储体总是按照二维矩阵的形式来排列存储元电路。体内基本存储元的排列结构通常
9、有两种方式:一种是“多字一位”结构(简称位结构),即将多个存储单元的同一位排在一起,即容量表示成N字×1位。例如1K×1位,4K×1位。另一种排列是“多字多位”结构(简称字结构),即将一个单元的若干位(如4位、8位)共若干个单元连在一起,其容量表示为N字×4位/字或N字×8位/字,如静态RAM的6116为2K×8,6264为8K×8等。 地址寄存器——用来存放CPU访问存储单元的地址,经译码驱动后指向响应的存储单元。通常在微型计算机中,访问地址由地址锁存器提供,如8086/8088CPU中的地址锁存器8282,存储单元地址由地址锁存器输出后,经地址总线送到存储器芯片内直接译码。 译码驱动电
10、路——该电路实际上包含译码器和驱动器两部分。译码器将地址总线输入的地址码转换成与它对应的译码输出线上的高电平或低电平,以表示选中了某一单元,并由驱动器提供驱动电流去驱动相应的读、写电路,完成对被选中单元的读写操作。 读/写电路——包括读出放大器、写入电路和读写控制电路,用以完成对被选中单元中各位的读出和写入操作。存储器的读写操作是在CPU的控制下进行的,只有当接受到来自CPU的读写命令RD 和WR后,才能实现正确的读写操作。 数据寄存器用来暂时存放从存储单元读出的数据或从CPU或I/O端口送出的要写入存储器的数据,暂存的目的是为了协调CPU和存储器间在速度上的差异,故又称之为存储器数据缓
11、冲器。 控制逻辑接收来自CPU的启动、片选、读/写及清除命令,经控制电路综合和处理后,发出一组时序信号来控制存储器的读写操作。 虽然现在微型机的存储器多由芯片构成,但是任何存储器结构都保留着这六部分的骨架,只是在组成各种结构时作一些相应的调整而已。 §3-1-3存储器的主要技术指标 衡量半导体存储器性能的指标很多,诸如功耗、可靠性、容量、价格、电源种类、存取速度等,但从功能和接口的角度来看,最重要的指标是存储器芯片的容量和存取速度。 (1)存储容量 存储容量是指存储器(或存储器芯片)存放二进制信息的总位数,即存储器容量=存储单元数×每个单元的位数(或数据线位数)。 存储容量也常以
12、字节或字为单位,微型机中均以字节B为单位,如存储容量为64KB,512KB,1MB等。外存中为了表示更大的容量,用MB、GB、TB为单位,其中,1KB=210B,1MB=1000KB=220B,1GB=1000MB=230B,1TB=1000GB=240B。由于一个字节(1B)定义为8位二进制信息,所以,计算机中一个字的长度通常是8的倍数。存储容量这一概念反映了存储空间的大小。 (2)存取时间 存取时间是反映存储器工作速度的一个重要指标,它是指从CPU给出有效的存储器地址启动一次存储器读写操作,到该操作完成所经历的时间,称为存取时间。具体来说,对一次读操作的存取时间就是读出时间,即从地址有
13、效到数据输出有效之间的时间,通常在几十到几百ns之间;对一次写操作,存取时间就是写入时间。 (3)存取周期 是指连续启动两次独立的存储器读写操作所需要的最小间隔时间,对于读操作,就是读周期时间;对于写操作,就是写周期时间。通常,存储周期要大于存取时间,因为存储器在读出数据之后还要用一定的时间来完成内部操作,这一时间称为恢复时间。读出时间和恢复时间加起来才是读周期。所以,存取时间和存取周期是两个不同的概念。 §3-2高速缓冲存储器 32位以上的微处理器和微型计算机可以有很高的工作频率,如果访问存储器插入等待周期,这等于是降低CPU的工作速度。系统设计者所追求的是在不插入等待周期(即
14、在零等待状态)条件下高速运行。为了加快处理器运行速度,普遍在CPU和常规主存储器之间增设了一级或两级告诉小容量存储器,称之为高速缓冲存储器,简称Cache。 高速缓冲存储器的存取速度要比主存快一个数量级,大体与CPU的处理速度相当。Cache中存放着主存的一部分副本,可被CPU直接访问,是解决计算机系统速度瓶颈的切实可行的办法。 Cache处于CPU和主存之间,和主存组成“Cache——主存”层次的存储器系统,在该存储器系统中,运行程序存放在主存中,而在Cache中存放着最近访问和将要访问的指令和数据,它们是主存中相应内容的副本。当CPU访问存储器时,高速缓冲存储器首先验证被访问存储单元的
15、内容是否已在Cache中,若已在Cache中,则立即访问Cache进行存取,称此次访问高速缓存命中(hit),若要访问的存储单元内容不在Cache 中,则就要作一次常规的存储器访问,同时,将所访问的内容及相关数据块复制到Cache中,这时称为访问Cache未命中(miss)。当高速缓存已爆满时,则应按某种调度算法更新高速缓存中的内容;如果重新被分配的高速缓存单元已被修改过,则还需将其写入主存中。 命中率是命中Cache的访问次数与CPU访问次数的百分比。它与Cache的容量和物理结构、缓存淘汰算法以及运行程序等有关。通常当Cache容量为32KB时,其命中率达86﹪,而当容量为64KB时,命
16、中率接近92﹪。一般来说,CPU对Cache访问的命中率在90﹪以上,甚至高达99﹪。为了提高命中率,高速缓存控制器将主存划分成块(页),Cache与主存间交换信息总是以字块(或页)为单位,Cache中可容纳一定数量的字块(或页)。 高速缓存及其控制逻辑都是由硬件实现的,例如,在80386微机中配有32K或64K字节的SRAM作为Cache,并配有高速缓存控制器82385;80486则将一个配有82385控制器和8KB高速缓存与80486微处理器一起集成于同一个处理器芯片内;Pentium微处理器内含有两个8KB的高速缓存用作指令Cache和数据Cache。因此,Cache对用户来说是透明的
17、不必用户自己去控制和操作。 §3-3 存储器的层次结构 随着计算机软、硬件系统的不断发展,计算机应用领域的不断扩大,对存储器的要求越来越高,如要求存储器的存储容量要大,存取速度要快,成本价格要低。这种要求本身是相互矛盾的,也是相互制约的。在同一个存储器中,要求同时兼顾这三方面是困难的。半导体存储器虽然有较高的存取速度,但它容量有限。磁盘、磁带存储器存储容量大,但存取速度慢。因此,要取得一个兼有大容量、高速度、低成本的存储系统,应该按照一定的体系结构综合利用各种存储器的特长优势,将它们有机地组合起来,构成一个较为合乎理想的存储系统。目前各类计算机系统中,广泛采用三级存储器结构,即高速缓冲存
18、储器、内存储器和外存储器。从上到下分为三级,其存储容量是逐级增大,而速度逐级降低。整个结构可以分为二个层次:主存——辅存(外存)层次和Cache——主存层次。采用这样的结构后,结构中的每种存储器不再是孤立的存储部件,它们已组成一个有机的整体,对这个结构整体而言,可大致看成是具有Cache的速度和辅存的容量。 §3-3-1 主存—辅存层次 在主存——辅存层次中,根据主存、辅存的特点,可以把CPU所需的现行程序和数据存放在存取速度快、容量有限的主存中,供CPU直接使用,主存必须具有与CPU相匹配的工作速度才能保证整个计算机运算速度的提高。一般前述的MOS存储器(特别是DRAM)无论从速度、容
19、量、每位价格上均可满足要求。 主存——辅存构成的存储层次。从这个层次的整体上看,它具有接近主存的存取速度,又有辅存的容量和接近于辅存的每位平均价格。较好地解决了大容量和低成本的矛盾。辅存只与主存交换信息,CPU不直接访问辅存,因此,允许辅存的速度慢一些。当采用可卸式的磁盘磁带作辅存时,则这一层次的容量可看成是无限的。 §3-3-2 CACHE—主存层次 上述的主存——辅存层次较好地解决了存储器的大容量要求和低成本之间的矛盾,而Cache——主存层次主要是用以弥合CPU与主存间在速度上的差异,通常主存的速度要比CPU的工作速度差一个数量级,如果在CPU与主存间增设一级存储容量不大,但速度
20、很高的高速缓冲存储器(Cache),借助于辅助硬件把Cache和主存构成一个整体。就能弥补主存的速度不足。从CPU的角度看,Cache——主存层次具有接近Cache的速度、主存的容量和接近主存的每位平均价格,因此,较好地解决了速度和成本之间的矛盾。 根据Cache、主存、CPU三者之间的关系,在这个层次中,不仅具有CPU«Cache«主存的数据通路,还有CPU«主存的直接通路。具有这个存储层次的计算机,必须事先把CPU在某一小段时间所要执行的程序从主存调入Cache中,当CPU要执行这些程序时,就直接在Cache中取存,因此,大大提高了CPU的执行速度。 Cache——主存间的地址映象和调
21、度同主存——辅存层次所采用的技术相仿,所不同的是其速度要求高,完全是由硬件实现的,而不需要辅助软件干预,因此,它是透明的。 在现代计算机中,大多数系统都同时采用上述两级存储层次,从而构成了高速缓存——主存——辅存三级存储层次的典型结构,实质上是主存——辅存和Cache——主存两个两级结构。 §3-4 8088CPU的存储器组织 §3-4-1 存储器的分段和物理地址的形成 1. 存储器的分段 在前面介绍段寄存器时曾指出,8086/8088的可寻址空间为1M字节,因此,对整个存储器空间寻址需要20位的地址码,而8086/8088CPU内的所有寄存器都是16位,只能寻址64K字节,为了
22、能对1M字节的存储器进行寻址(即访问每个存储单元),8086/8088系统采用了巧妙的存储器分段技术,即将1M字节的存储器空间分成若干个逻辑段,每个段最长64K字节,段内地址是连续的,仍可采用16位寻址方式。逻辑段可在整个存储空间内浮动,段与段之间可以是连续的,也可以是分开的或重叠的(部分重叠或完全重叠)。但段的起始地址(也称为段首地址或段基地址)必须从能被16整除的地址开始,即每个段的首地址的低4位必须为0。这样,便可将段首地址的高16位存放在如前述的CS,DS,SS和ES这四个段寄存器之中。 2.物理地址的形成 有上述分段概念可知,任何一个存储单元可以被唯一地包含在一个逻辑段中,也可以
23、被包含在两个互相重叠的逻辑段中。存储单元的地址可以用相对于段首地址的位移量来表示,这个位移量称为“偏移地址”,其最大长度为16位。因此,只要得到一个存储单元的段首地址和段内偏移地址,就可以对该单元进行访问。段首地址(实际是高16位)存放在段寄存器中,段内偏移地址(16位)可以放在指令指示器IP中,或存放在16位的通用寄存器中。前面已经说过,对任何一个存储单元进行访问时必须用20位地址。这就是说,对每个存储单元存在两种地址,一是由段首地址和段内偏移地址组成的地址。还有一个地址,就是我们前面说的20位的实际访问地址。通常,称前一种地址为逻辑地址,后一种地址为物理地址。所谓逻辑地址就是程序中使用的地
24、址,它由段基址和段内偏移地址组成。在逻辑地址中,段基址和段内偏移地址都是16位的无符号二进制数。程序设计时使用逻辑地址。所谓物理地址就是存储器的绝对地址(实际地址),它从0000H~FFFFH,是CPU访问存储器时由地址总线发出的地址。显然,实际工作时,CPU访问存储器时要使用物理地址。那么,如何从16位的段首地址和16位的段内偏移地址组成的逻辑地址中得到20位的物理地址呢?所谓的存储器寻址,就是能将程序中的逻辑地址转移为物理地址的机构,由它来实现从逻辑地址到物理地址的变换。 存储单元物理地址的计算如图3- 10所示,即: 物理地址=段基地址×16+偏
25、移地址 其意思是:将段寄存器(CS,DS,SS和ES)中的内容向左移4位(相当于乘16),然后和偏移地址相加便得出20位的物理地址。物理地址的计算是在CPU的总线接口部件BIU中的地址加法器中实现的。 偏移量 段寄存器 物理存储器 4位 16位 20位 图3- 10 存储器物理地址的形成 例如:某指令在代码段中逻辑地址为:段首址CS=2000H,段内偏移地址
26、IP=5F62H,则其物理地址为(CS)×16+IP=20000H+5F62H=25F62H。显然,若该指令的段基址为CS=2200H,而IP=3F62H,起物理地址仍为25F62H。这就是说,在8086/8088的分段结构的存储器中,同一个物理地址可以由不同的段地址和偏移地址组合得到。即指向同一物理地址的段地址和偏移地址不是唯一的。 3.逻辑地址的来源 8086/8088CPU在运行程序过程中,访问存储器的操作类型是各种各样的,如取指令访问存储器,取操作数访问内存等等。访问存储器的操作类型不同,总线接口部件BIU访问存储器时所使用逻辑地址的来源就不同,不同操作类型的逻辑地址的来源如表3-
27、 5 所示。 表3- 5 逻辑地址来源 操作类型 正常使用的(隐含)段地址 可替换段地址 偏移地址 物理地址计算 取指令 CS 无 IP CS×16+IP 堆栈操作 SS 无 SP SS×16+IP BP为间址 SS CS,DS,ES 有效地址EA SS×16+EA 存取变量 DS CS,ES,SS 有效地址EA DS×16+EA 源字符串 DS CS,ES,SS SI DS×16+SI 目标字符串 ES 无 DI ES×16+DI 由表可知,8086/8088CPU在执行程序时,每当取指令时,就会自动选择代
28、码段寄存器CS,将CS中的内容左移4位(即乘16)再和指令指示器IP中的内容相加形成指令所在单元的20位物理地址,即下条要取的指令地址。 当要往内存写一个数据或从内存读出一个数据时,CPU会自动选择数据段寄存器DS,将DS的内容左移4位,然后再和指令中的偏移地址EA(EA由寻址方式决定)相加形成20位物理地址,去访问存储器读/写操作数。 当进行堆栈操作时,CPU会自动选择段寄存器SS,将SS的内容左移4位再和堆栈指示器SP或者基址指示器BP的内容相加,形成20位的堆栈指针地址去访问堆栈。 需要指出的是,8086/8088的存储器空间分配上有一部分空间被系统占用了,用户是不能使用的。例如,
29、在存储器的第1K,即00000H~003FFH单元用作中断向量表,存放的是256个中断向量。又如在FFFF0H~FFFFFH共16个单元中,一般用来存放一条无条件转移指令,在加电复位时用于将系统转入初始化的。 3-4-2 8086/8088中的堆栈 堆栈是内存中开辟的一个特殊数据区,用来存放需要暂时存放的数据。堆栈的一端是固定的,另一端是浮动的。信息的存放在浮动的一端进行。堆栈中的内容严格按照“后进先出”的规则进行操作。 8086/8088中的堆栈是由段定义语句在存储器中定义的一个段,即堆栈段。堆栈的容量为≤64K字节,它可以在存储器的1M字节内浮动。堆栈段的段地址由段寄存器SS指定,栈
30、顶地址由堆栈指示器SP指定。8086/8088系统中的堆栈是一个向上生长型的堆栈,即栈底设在栈区的高地址端,栈顶设在低地址端,堆栈地址由高向低变化。例如,设当前SS=3F00H,堆栈段≤64K字节,SP=0060H,则当前栈顶在存储器中的地址为3F060H。 堆栈操作总是在栈顶进行,栈顶指针SP的变化由CPU自动管理。 为了加快堆栈操作,其操作以字为单位进行,而且堆栈中的数据项必须按规则字存储,即低字节在偶地址单元,高字节在奇地址单元。这样,可保证每访问一次堆栈,总是完成一个字的操作。 对堆栈的操作主要是“压入”和“弹出”。将数据压入堆栈用入栈指令PUSH实现,执行PUSH指令时总是先修
31、改栈指针SP(SP-2→SP),然后将信息入栈。将数据从堆栈中弹出用出栈指令POP实现。执行POP指令时,总是先将信息弹出,然后再修改栈指针SP(SP+2→SP),指向新栈顶。 本章小结 通过本章学习,应重点掌握以下内容: 1.存储器的分类。通常有三种分类方法:按存储介质可分为磁表面存储器和半导体存储器;按作用可分为内存储器(主存储器)和外(辅助)存储器;按存取方式可分为随机存储器和只读存储器,本章重点讨论的是内(主)存储器。 2. 随机存储器的基本组成及各组成部件(存储体、地址译码与驱动、数据缓冲器、读/写控制逻辑)的作用,读/写操作的基本过程。 3. 存储器的主要技术指标的含义(容量、存取时间、存取周期)。 4. Cache的基本概念、它的特点、在系统中的位置。 5. 存储器的层次结构概念。 6. 8088CPU的存储器组织






