先来一张图:存储器分为主存储器和辅助存储器,辅助存储器需要通过I/O设备,与主机进行交流
辅助存储器也称外存储器,简称辅存或外存,用来存储当前不在中央处理器的程序和数据。当要用到外存中的程序和数据时,才将从外存中调入内存。
外储存器是指除计算机内存及CPU缓存以外的储存器,此类储存器一般断电后仍然能保存数据。常见的外存储器有硬盘、软盘、光盘、U盘等。
常见的外存储器:
软盘:软磁盘使用柔软的聚酯材料制成原型底片,在两个表面涂有磁性材料。常用软盘直径为3.5英寸,存储容量为1.44MB.软盘通过软盘驱动器来读取数据。
U盘:U盘也被称为“闪盘”,可以通过计算机的USB口存储数据。与软盘相比,由于U盘的体积小、存储量大及携带方便等诸多优点,U盘已经取代软盘的地位。
硬盘:硬磁盘是由涂有磁性材料额铝合金原盘组成的,每个硬盘都由若干个磁性圆盘组成。
磁带存储器:磁带也被称为顺序存取存储器SAM。它存储容量很大,但查找速度很慢,一般仅用作数据后备存储。计算机系统使用的磁带机有3中类型:盘式磁带机、数据流磁带机及螺旋扫描磁带机。
光盘存储器:光盘指的是利用光学方式进行信息存储的圆盘。它应用了光存储技术,即使用激光在某种介质上写入信息,然后再利用激光读出信息。光盘存储器可分为:CD-ROM、CD-R、CD-RW、和DVD-ROM等。
对于I/O设备需注意:
①一个I/O控制器可能会对应多个设备;
②数据寄存器、控制寄存器、状态寄存器可能有多个(如:每个控制/状态寄存器对应一个具体的设备),且这些寄存器都要有相应的地址,才能方便CPU操作。有的计算机会让这些寄存器占用内存地址的一部分,称为内存映像I/O;另一些计算机则采用I/O专用地址,即寄存器独立编址。
如下图所示,外设(键盘,磁盘等)通过I/O接口进入主机,主机通过I/O接口的三条线(数据线,控制线,地址线:合称I/O总线)与外设进行交流,I/O接口本质上是一个芯片,集成在主板上面,来对暴露在物理层面上的接口进行管理,可以看到DMA接口可以直接和主存进行数据传输,而一般的数据传输方向是由设备到CPU再到内存,或者相反。
这里涉及到I/O接口的控制方式,我这里不细讲,可以看我的另一篇
http://t.csdn.cn/RgB8F
如果想要详细学习I/O系统,推荐看:
http://t.csdn.cn/D0L0a
主存储器,简称主存,又称内存储器(内存),用来存放计算机运行期间所需的大量程序和数据,CPU可以直接随机地对其进行访问,也可以和高速缓冲存储器(Cache)及辅助存储器交换数据。其特点是容量较小、存取速度较快、单位价格较高。
而辅助存储器是主存储器的后援存储器,用来存放当前暂时不用的程序和数据,以及一些需要永久性保存的信息,它不能与CPU直接交换信息。其特点是容量极大、存取速度较慢、单位成本低。
数据总线:在主存和cache之间来回传送需要处理或是需要储存的数据,是双向的。
地址总线:用来传送CPU指定在 主存之中储存的数据的地址。单向地从cpu到主存
控制总线(读写控制)
单个存储芯片的容量有限,在字数或字长方面与实际存储器的要求有差距,需在字和位两方面进行扩充才能满足要求。
通常采用位扩展法、字扩展法和字位同时扩展法来扩展主存容量
CPU的数据线数与存储芯片的数据位数不一定相等,此时必须对存储芯片扩位(即进行位扩展,用多个存储器件对字长进行扩充,增加存储字长),使其数据位数与CPU的数据线数相等.
字扩展是指增加存储器中字的数量,而位数不变。字扩展将芯片的地址线、数据线、读写控制线相应并联,而由片选信号来区分各芯片的地址范围。
存储器往往需要同时扩充字和位。字位同时扩是指既增加存储字的数量,又增加存储字长。
以下是字位同时扩展与cpu得连接图:
高速缓冲存储器,简称Cache,位于主存和CPU之间,用来存放正在执行的程序段和数据,以便CPU能高速地使用它们。Cache的存取速度可与CPU的速度相匹配,但存储容量小、价格高。目前的高档计算机通常将它们制作在CPU中。
Cache 位于存储器层次结构的顶层,如下图所示,通常由SRAM构成
为便于Cache和主存之间交换信息,Cache和主存都被划分为相等的块,(Cache块又称Cache行)每块由若干字节组成,块的长度称为块长(Cache行长)
由于Cache的容量远小于主存的容量,所以Cache中的块数要远少于主存中的块数,它仅保存主存中最活跃的若干块的副本.
因此Cache按照某种策略(下面会讲),预测CPU在未来一段时间内欲访存的数据,将其装入Cache
发出读请求时,若访存地址在Cache中命中,就将此地址转换成Cache地址,直接来的某块信息。注意,CPU与Cache之间的数据交换以字为单位,Cache与主存之间的数据交换则以Cache块为单位
高速缓存技术利用程序访问的局部性原理,把程序中正在使用的部分存放在一个高速的、容量较小Cache中,使CPU的访存操作大多针对Cache进行,从而大大提高程序的执行速度。
时间局部性是指在最近的未来要用到的信息,很可能是现在正在使用的信息,大
为程序中存在循环。
空间局部性是指在最近的未来要用到的信息,很可能与现在正在使用的信息在存储空间上是邻近的,因为指令通常是顺序存放、顺序执行的,数据一般也是以向量、数组等形式簇聚地存储在一起的。
随机(RAND)算法、先进先出(FIFO)算法、近期最少使用(LR)算法和最不经常使用(LFU)算法。
•随机算法:随机地确定替换的Cache块。它的实现比较简单,但未依据程序访问的局部性原理,因此可能命中率较低。
•先进先出算法:选择最早调入的行进行替换。它比较容易实现,但也未依据程序访问的局部性原理,因为最早进入的主存块也可能是目前经常要用的。
•近期最少使用算法:依据程序访问的局部性原理,选择近期内长久未访问过的Cache行作为替换的行,平均命中率要比FIFO的高,是堆栈类算法。
因为Cache中的内容是主存块副本,当对Cache中的内容进行更新时,就需选用写操作策略使Cache内容和主存内容保持一致。此时分两种情况。
对于Cache写命中(write hit),有两种处理方法
•全写法(写直通法、write-through)。当CPU对Cache写命中时,必须把数据同时写入Cache和主存。当某一块需要替换时,不必把这一块写回主存,用新调入的块直接覆盖即可。
•写回法(write-back)。当CPU对Cache写命中时,只修改Cache的内容,而不立即写入主存,只有当此块被换出时才写回主存。这种方法减少了访存次数,但存在不一致的隐患。采用这种策略时,每个Cache 行必须设置一个标志位(脏位),以反映此块是否被CPU修改过。
对于Cache写不命中,也有两种理方法
•写分配法(write-allocate)。加载主存中的块到Cache中,然后更新这个Cache块。它试图利用程序的空间局部性,但缺点是每次不命中都需要从主存中读取一块。
•非写分配法(not-write-allocate)。只写入主存,不进行调块。非写分配法通常与全写法合用,写分配法通常和写回法合用。
注:地址映射不同于地址变换。
地址变换是指CPU在访存时,将主存地址按映射规则换算成Cache地址的过程。
地址映射的方法有以下3种:注:主存物理地址=块号+块内地址
直接映射的关系可定义为
式中,j是Cache的块号(又称Cache行号),i是主存的块号,2的c次方是Cache中的总块数。
优点:对于任意一个地址,只需对比一个“标记”,速度最快;
缺点:Cache存储空间利用不充分,命中率低
在全相联映射中,主存块可以放在cache的任意位置
优点:Cache存储空间利用充分,命中率高;
缺点:查找“标记”最慢,有可能需要对比所有行的标记
n路组相联映射--每n个Cache行为一组
优点:另外两种方式的折中,综合效果较好
CPU的功能中央处理器(CPU)由运算器和控制器组成。
其中,控制器的功能是负责协调并控制计算机各部件执行程序的指令序列包括取指令、分析指令和执行指令;运算器的功能是对数据进行加工。
●运算器
运算器接收从控制器送来的命令并执行相应的动作,对数据进行加工和处理。
运算器是计算机对数据进行加工处理的中心,它主要由算术逻辑单元(ALU)、暂存寄存器、累加寄存器(ACC)、通用寄存器组、程序状态字寄存器(PSW)、移位器、计数器(CT)等组成。
(1)算术逻辑单元.主要功能是进行算术/逻辑运算。
(2)暂存寄存器.用于暂存从主存读来的数据,该数据不能存放在通用寄存器中,
否则会破坏其原有内容。暂存寄存器对应用程序员是透明的。
(3)累加寄存器.
它是一个通用寄存器,用于暂时存放ALU运算的结果信息,可以作为加法运算的一个输入端。
(4)Cache通用寄存器组如AX、BX、CX、DX、SP等,用于存放操作数(包括源操作数、目的操作数及中间结果)和各种地址信息等。SP是堆栈指针,用于指示栈顶的地址。
(5)程序状态字寄存器.保留由算术逻辑运算指令或测试指令的结果而建立的各种状态信息,如溢出标志(OF)、符号标志(SF)、零标志(ZF)、进位标志(CF)等。PSW中的这些位参与并决定微操作的形成。
(6)移位器.对操作数或运算结果进行移位运算。
(7)计数器控制乘除运算的操作步数。
●控制器
控制器是整个系统的指挥中枢,在控制器的控制下,运算器、存储器和输入/输出设备等功能部件构成一个有机的整体,根据指令的要求指挥全机协调工作。
控制器的基本功能是执行指令,每条指令的执行是由控制器发出的一组微操作实现的。
控制器由程序计数器(PC)、指令寄存器(IR)、指令译码器、存储器地址寄存器(MAR)、存储器数据寄存器(MDR)、时序系统和微操作信号发生器等组成。
1)程序计数器:用于指出下一条指令在主存中的存放地址。CPU根据PC的内容去主存中取指令。因程序中指令(通常)是顺序执行的,所以PC有自增功能。
2)指令寄存器:用于保存当前正在执行的那条指令。
3)指令译码器:仅对操作码字段进行译码,向控制器提供特定的操作信号。
4)存储器地址寄存器:用于存放要访问的主存单元的地址。
5)存储器数据寄存器:用于存放向主存写入的信息或从主存读出的信息。
6)时序系统:用于产生各种时序信号,它们都由统一时钟(CLOCK)分频得到。
7)微操作信号发生器,根据IR的内容(指令)、PSW的内容(状态信息)及时序信号,产生控制整个计算机系统所需的各种控制信号,其结构有组合逻辑型和存储逻辑型两种。
控制器的工作原理:
根据指令操作码、指令的执行步骤(微命令序列)和条件信号来形成当前计算机各部件要用到的控制信号。计算机整机各硬件系统在这些控制信号的控制下协同运行,产生预期的执行结果。
注意:CPU内部寄存器可分两类:
●用户可见的寄存器,可对这类寄存器编程,如通用寄存器组、程序状态字寄存器;
●用户不可见的寄存器,对用户是透明的,不可对这类寄存器编程,如存储器地址寄存器、存储器数据寄存器、指令寄存器。
CPU的具体功能包括:
(1)指令控制:完成取指令、分析指令和执行指令的操作,即程序的顺序控制。
(2)操作控制:一条指令的功能往往由若干操作信号的组合来实现。CPU管理并产生由内存取出的每条指令的操作信号,把各种操作信号送往相应的部件,从而控制这些部件按指令的要求进行动作。
(3)时间控制:对各种操作加以时间上的控制。时间控制要为每条指令按时间顺序提供应有的控制信号。
(4)数据加工:对数据进行算术和逻辑运算。
(5)中断处理:对计算机运行过程中出现的异常情况和特殊请求进行处理。
CPU从主存中取出并执行一条指令的时间称为指令周期,不同指令的指令周期可能不同。
当CPU采用中断方式实现主机和I/0设备的信息交换时,CPU在每条指令执行结束前,都要发中断查询信号,若有中断请求,则CPU进入中断响应阶段,又称中断周期.一个完整的指令周期应包括取指、间址、执行和中断4个周期,如图所示
4个工作周期都有CPU访存操作,只是访存的目的不同
取指周期是为了取指令,间址周期是为了取有效地址,执行周期是为了取操作数,中断周期是为了保程序断点
为了区别不同的工作周期,在CPU内设置4个标志触发器FE、IND、EX和INT,
它们分别对应取指、间址、执行和中断周期,并以“1”状态表示有效,
分别由1→FE、1→IND、1一EX和1INT这4个信号控制.
数据流是根据指令要求依次访问的数据序列
在指令执行的不同阶段,要求依次访问的数据序列是不同的。而且对于不同的指令,它们的数据流往往也是不同的。
取指周期的任务是根据PC中的内容从主存中取出指令代码并存放在IR中。取指周期的数据流如图所示。PC中存放的是指令的地址,根据此地址从内存单元中取出的是指令,并放在指令寄存器IR中,取指令的同时,PC加1,也可能是加2,如双字节(pc+2)
取指周期的数据流向如下:
1)PC①MAR②地址总线③主存
2)CU发出控制信号④控制总线⑤主存.
3)主存⑥数据总线MDR⑧IR(存放指令)
4)CU发出读指令⑨PC内容加1.
间址周期的任务是取操作数有效地址。以一次间址为例(见图),将指令中的地址码送到MAR并送至地址总线,此后CU向存储器发读命令,以获取有效地址并存至MDR。
间址周期的数据流向如下:
1)Ad(IR)(或MDR)①MAR②地址总线③主存
2)CU发出读指令④控制总线⑤主存.
3)主存⑥数据总线⑦MDR(存放有效地址).
执行周期的任务是根据IR中的指令字的操作码和操作数通过ALU操作产生执行结果.不同指令的执行周期操作不同,因此没有统一的数据流向。
中断周期的任务是处理中断请求.假设程序断点存入堆栈中,并用SP指示栈顶地址,而且进栈操作是先修改栈顶指针,后存入数据
中断周期的数据流向如下:
1)CU控制将SP减1,SP①MAR②地址总线③主存.
2)CU发出写命令④控制总线⑤主存.
3)PC6MDR⑦数据总线⑧主存(程序断点存入主存).
4)CU(中断服务程序的入口地址)⑨PC
将所有寄存器的输入端和输出端都连接到一条公共通路上,这种结构简单,但数据传输存在较多的冲突现象,性能较低。连接各部件的总线只有一条时,称为单总线结构;CPU中有两条或更多的总线时,构成双/多总线结构
图示为CPU内部总线的数据通路和控制信号。
图中,规定各部件用大写字母表示
字母加“in”表示该部件的允许输入控制信号;
字母加“out”表示该部件的允许输出控制信号。
注意:
内部总线是指同一部件,如CPU内部连接各寄存器及运算部件之间的总线;系统总线是指同一台计算机系统的各部件,如CPU 内存、通道和各类I/O接口间互相连接的总线
将所有寄存器的输入端和输出端都连接到多条公共通路上,相比之下单总线中一个时钟内只允许传一个数据,因而指令执行效率很低,因此采用多总线方式,同时在多个总线上传送不同的数据,提高效率。
根据指令执行过程中的数据和地址的流动方向安排连接线路,避免使用共享的总线,性能较高,但硬件量大。
指令(又称机器指令)是指示计算机执行某种操作的命令,程序由一条条指令构成。
一条指令就是机器语言的一个语句,它是一组有意义的二进制代码。一条指令通常包括操作码字段和地址码字段两部分。
操作码指出指令中该指令应该执行什么性质的操作和具有何种功能。
地址码给出被操作的信息(指令或数据)的地址,包括参加运算的一个或多个操作数所在的地址、运算结果的保存地址、程序的转移地址、被调用的子程序的入口地址等。
指令的长度是指一条指令中所包含的二进制代码的位数。指令字长取决于操作码的长度、操作数地址码的长度和操作数地址的个数。
根据指令中操作数地址码的数目的不同,指令分:
●零地址指令
只给出操作码OP,没有显式地址。这种指令有两种可能:
1)不需要操作数的指令,如空操作指令、停机指令、关中断指令等。
2)零地址的运算类指令仅用在堆栈计算机中。通常参与运算的两个操作数隐含地从栈顶和次栈顶弹出,送到运算器进行运算,运算结果再隐含地压入堆栈。
●一地址指令
1)只有目的操作数的单操作数指令,按A1地址读取操作数,进行OP操作后,结果存回原地址。
指令含义:OP(A1)→A1
如操作码含义是加1、减1、求反、求补等。
2)隐含约定目的地址的双操作数指令,按指令地址A1可读取源操作数,指令可隐含约定另一个操作数由ACC(累加器)提供,运算结果也将存放在ACC中。
指令含义:(ACC)OP(A1)→ACC
若指令字长为32位,操作码占8位,1个地址码字段占24位,则指令操作数的直接寻址范围为2的24次方=16M。
●二地址指令
指令含义:(A1)OP(A2)→A1
对于常用的算术和逻辑运算指令,往往要求使用两个操作数,需分别给出目的操作数和源操作数的地址,其中目的操作数地址还用于保存本次的运算结果。若指令字长为32位,操作码占8位,两个地址码字段各占12位,则指令操作数的直接寻址范围为2的12次方=4K。
●三地址指令
指令含义:(A1)OP(A2)→A3
若指令字长为32位,操作码占8位,3个地址码字段各占8位,则指令操作数的直接寻址范围为2的8次方=256。
若地址字段均为主存地址,则完成一条三地址需要4次访问存储器(取指令1次,取两个操作数2次,存放结果1次).
●四地址指令
指令含义:(A1)OP(A2)→A3,A4=下一条将要执行指令的地址。
若指令字长为32位,操作码占8位,4个地址码字段各占6位,则指令操作数的直
接寻址范围为2的6次方=64。
寻址方式是指寻找指令或操作数有效地址的方式,即确定本条指令的数据地址及下一条待执行指令的地址的方法。寻址方式分为指令寻址和数据寻址两大类。
指令中的地址码字段并不代表操作数的真实地址,这种地址称为形式地址(A);形式地址结合寻址方式,可以计算出操作数在存储器中的真实地址,这种地址称为有效地址(EA)。
注意:
(A)表示地址为A的数值,
例如,EA=(A)意思是有效地址是地址A中的数值。
●顺序寻址可通过程序计数器(PC)加1(1个指令字长),自动形成下一条指令的地址。
●跳跃寻址通过转移类指令实现。所谓跳跃,是指下条指令的地址码不由程序
计数器给出,而由本条指令给出下条指令地址的计算方式。
●隐含寻址
不明显地给出操作数的地址,而在指令中隐含操作数的地址。
例如,单地址的指令格式就不明显地在地址字段中指出第二操作数的地址,而规定累加器(ACC)作为第二操作数地址,指令格式明显指出的仅是第一操作数的地址。
因此,累加器(ACC)对单地址指令格式来说是隐含寻址,如图所示。
隐含寻址的优点是有利于缩短指令字长;
缺点是需增加存储操作数或隐含地址的硬件。
●立即(数)寻址
此指令的地址字段指出的不是操作数的地址,而是操作数本身,又称立即数。数据采用补码形式存放。
图示为立即寻址示意图,图中#表示立即寻址特征,A就是操作数本身。
●直接寻址
指令字中的形式地址A是操作数的真实地址EA,即EA=A,如图所示。
其优点是简单,指令在执行阶段仅访问一次主存,不需专门计算操作数的地址;
缺点是A的位数决定了该指令操作数的寻址范围,操作数的地址不易修改。
●间接寻址
相对于直接寻址而言的,指令的地址字段给出的形式地址不是操作数的真正地址,而是操作数有效地址所在的存储单元的地址,也就是操作数地址的地址,即EA=(A),如图所示。
间接寻址可以是一次间接寻址,也可是多次间接寻址。
在图中,主存字第一位为1时,表示取出的仍不是操作数的地址,即多次间址;
主存字间接寻址的优点是可扩大寻址范围(有效地址EA的位数大于形式地址A的位数),便于编制程序(用间接寻址可方便地完成子程序返回);
缺点是指令在执行阶段要多次访存(一次间接寻址需两次访存,多次间接寻址需根据存储字的最高位确定访存次数)。访问速度过慢,这种寻址方式并不常用。一般问到扩大寻址范围时,
通常指的是寄存器间接寻址。
●寄存器寻址
寄存器寻址是指在指令字中直接给出操作数所在的寄存器编号,即EA=R;
其操作数在由R所指的寄存器内,如图所示。
●寄存器间接寻址
指在寄存器R中给出的不是一个操作数,而是操作数所在主存单元的地址,即EA=(R),如图所示。
与一般间接寻址相比速度更快,但指令的执行阶段需要访问主存(因为操作数在主存中)。
●相对寻址:
把程序计数器(PC)的内容加上指令格式中的形式地址A而形成操作数的有效地址,即EA=(PC)+A,
其中A是相对于当前指令地址的位移量,可正可负,补码表示,如图所示。
在图中,A的位数决定操作数的寻址范围。
其优点是操作数的地址不是固定的,它随PC值的变化而变化,且与指令地址之间总是相差一个固定值,因此便于程序浮动。相对寻址广泛应用于转移指令。
注意:对于转移指令JMPA,当CPU从存储器中取出一字节时,会自动执行(PC)+1→PC。
若转移指令的地址为X,且占2B,在取出该指令后,PC的值会增2.即(PC)=x+2,这样在执行完该指令后,会自动跳转到X+2+A的地址继续执行。
●基址寻址
指将CPU中基址寄存器(BR)的内容加上指令格式中的形式地址A而形成操作数
的有效地址,即EA=(BR)+A
其中基址寄存器既可采用专用寄存器,又可采用通用寄存器,如图所示
基址寄存器是面向操作系统的,其内容由操作系统或管理程序确定,主要用于解决程序逻辑空间与存储器物理空间的无关性。
在程序执行过程中,基址寄存器的内容不变(作为基地址),形式地址可变(作为偏移量)。
采用通用寄存器作为基址寄存器时,可由用户决定哪个寄存器作为基址寄存器,但其内容仍由操作系统确定。
优点是可扩大寻址范围(基址寄存器的位数大于形式地址A的位数);用户不必考虑自己的程序存于主存的哪个空间区域,因此有利于多道程序设计,并可用于编制浮动程序,但偏移量(形式地址A)的位数较短。
●变址寻址
变址寻址是指有效地址EA等于指令字中的形式地址A与变址寄存器IX的内容之和,
即EA=(IX)+A,其中IX为变址寄存器(专用),也可用通用寄存器作为变址寄存器。图示为采用专用寄存器IX的变址寻址示意图。
变址寄存器是面向用户的,在程序执行过程中,变址寄存器的内容可由用户改变(作为偏移量),形式地址A不变(作为基地址)。
其优点是可扩大寻址范围(变址寄存器的位数大于形式地址A的位数);
在数组处理过程中,可设定A为数组的首地址,不断改变变址寄存器IX的内容,便可很容易形成数组中任一数据的地址,特别适合编制循环程序。偏移量(变址寄存器IX)的位数足以表示整个存储空间。
变址寻址与基址寻址的有效地址形成过程极为相似。本质上,两者区别较大。
基址寻址面向系统,主要用于为多道程序或数据分配存储空间,因此基址寄存器的内容通常由操作系统或管理程序确定。在程序的执行过程中其值不可变,而指令字中的A是可变的;
变址寻址立足于用户,主要用于处理数组问题,在变址寻址中,变址寄存器的内容由用户设定,在程序执行过程中其值可变,而指令字中的A是不可变的。