0.前序
计算机文化素养课其一
计算机组成原理,简称“计组”
作者:Randy
越向往高处的阳光,就越要扎根于无尽的黑暗
了解计算机的底层硬件的逻辑实现,CPU的处理架构,有助于我们更好的使用上层语言进行程序的编写
这篇文章我会对计组这门课程中的知识体系,其中的一些要点进行一个大致的总结归纳,但我毕竟不是专注于计算机硬件/嵌入式方向的开发者,因此对于一些重点不会过分的深究,本文也难免有一些理解不到位,或者谬误的地方
欢迎各路神仙留言指正或是赐教一些我不知道的点
若能不吝赐教,鄙人先谢为敬
1.概述
计算机组成原理:立于硬件之巅
—1.1 计组概述
计算机软件&硬件层级结构图:
图中是计算机的底层硬件到上层软件开发的层级结构
计算机组成原理是计算机硬件的最上层,计算机系统/体系结构是软硬件之间的协调交界,计算机操作系统则是计算机软件的底层
计算机系统结构中的指令集,就需要计算机组成通过硬件进行逻辑实现
从底层硬件到上层软件,各层都在下层的基础上进行了一定的封装,并未上层提供了可调用的接口来支持上层功能的实现
—1.2 计算机系统概述
计算机即能够接收/输入信息,运算处理信息,反馈信息的工具
从微小的传感器(Sensors),到个人终端/电脑,再到服务器,超级计算机/高性能计算机(HPC),以至物联网
这些大大小小的计算机系统主要都是由硬件和软件,两大部分组成的,计算机发挥其作用的过程,就是硬件对软件指令的有序执行过程
计算机的底层硬件进行了一定的封装,提供了一些接口(API),指令集,对硬件所实现的功能进行公开,从而上层软件可以通过API编写需要的逻辑完成一定的功能
软件又分为底层软件和上层应用,底层软件是直接使用硬件接口编写的,面向硬件进行编程的,管理硬件设备,为上层应用提供开发和运行环境的一类软件系统。操作系统,游戏引擎就是所谓的底层软件
而上层应用是在底层软件的基础上,使用高级编程语言编写,调用/使用底层软件提供的接口,运行环境,从而完成某种针对性的工作
计算机硬件还可细分为以下层级结构:理论/应用 物理 —> 电子元件 —> 模拟电路 —> 数字电路 —> 数字逻辑 —> 基本部件 —> 计算机硬件
计算机组成原理,主要研究的是数字电子计算机的底层硬件中,通过数字 电路/逻辑 组成计算机的一些基本部件的方法,这些部件完成计算机基本运算的原理,以及各部件之间如何进行有效的组织,协调运行
计算机软件编码从上层到下层的层级结构为:高级语言 —> 汇编语言 —> 操作系统 —> 机器语言 —> 微指令系统
在计算机组成原理中会研究基本部件,如何进行有效的组织,并通过微指令系统进行编码调度,从而完成对机器语言的解释和执行
计算机的算力的单位是Flops(floating point operations per second),即每秒可执行的浮点运算次数,Flops并不能反应许多对实际输出运算效率有影响的因素,因而计算机的实际Flops算力与理论峰值会有一段不小的差距
目前世界上算力最强的高性能计算机是我国国防科技大学的天河超级计算机,它的理论峰值算力为 54902.4 TFlops/s ,实际持续运行算力为 33862.7 TFlops/s
—1.3 计算机系统/体系结构 与 计算机组成原理
计算机系统/体系结构是计算机软件与硬件之间的协调交界,它所研究的是计算机软硬件的功能分配,软件与硬件之间的交互接口(API/指令集),是程序员所见所用的计算机概念性结构和功能特性(外特性)
计算机组成原理研究的是如何通过基本部件,实现硬件需要完成的运算/处理功能,如何通过部件的有效组织来体现计算机的外特性
例如,计算机系统/体系结构 规定是否需要由硬件来实现一个加法功能,提供加法指令,加法的具体输入输出数据规格应是怎么样的,而 计算机组成原理 研究加法指令的实现逻辑是怎样的,如何通过基本部件去完成这个加法指令的操作
—1.4 计算机的基本组成
——1.4.1 冯·诺伊曼结构
1945年冯·诺伊曼带领研究小组在已有的ENIAC计算机的基础上,论述提出了一个全新的"存储程序通用电子计算机方案"–EDVAC(Electronic Discrete variable Automatic Computer)离散变量自动电子计算机
EDVAC认为计算机应包含:运算器,控制器,存储器,输入设备,输出设备五大部分
该方案中提出了在计算机存储器上保存程序指令和数据,在运行时进行读取指令和数据完成运算,这一体系结构亦被称之为冯·诺伊曼结构,是所有现代通用电子计算机所遵循的设计模板,按这种结构体系构建出的计算机,称之为储存程序计算机
———1.4.1.1 冯·诺伊曼结构的特点
1:冯·诺伊曼结构中计算机由以下五大部分组成
存储器:存储程序指令和数据
控制器:控制程序指令的读取和执行
运算器:按指令对数据进行运算处理
输入设备:对接用户,输入程序指令和数据到存储器
输出设备:显示运算结果
2.程序指令和数据共用同一个存储器,进行等位存储,可以按地址寻访
3.指令和数据均以二进制表示
4.指令由操作码和地址码组成,操作码反应了该指令的具体操作,地址码反映了操作需要应用到的操作数据所在的地址
5.对程序指令进行存储和读取执行
6.以运算器为运行中心
冯·诺伊曼结构中的特点其实反映了当下计算机设计制造领域,计算机的底层硬件实现中的许多问题,例如目前位置我们一直习惯键鼠输入,屏幕显示输出,因而输入输出设备不做统一,当下的集成电路计算机中的晶体管元依然只支持稳定的高低电频,就如最初的机械开关一样,所以我们仍使用二进制表示指令和数据,未来如果使用某种拥有稳定三态甚至是多态的单元就可能考虑三进制或是其它进制
哈佛结构是计算机体系的另一种组织结构,它与冯·诺伊曼结构最大的区别是区分了程序指令和数据的存储器,分别使用两套地址/数据总线进行读写,改进型哈佛结构则对地址/数据总线进行了统一
现代处理器虽然外部依然是冯·诺伊曼结构,但其内部的Cache是按照改进型哈佛结构,分为数据Cache和指令Cache进行组织的
———1.4.1.2 冯·诺依曼结构的硬件框图
图中实线表示数据传递,虚线表示控制器的运行控制和状态反馈
如图以运算器为组织核心
输入设备将人类表述出的指令/数据,转化为计算机能够识别的形式,并通过运算器的处理将指令/数据存放到存储器中
程序运行时,程序指令会从存储器中读取出,传递到控制器中,由控制器解析程序指令,并按照顺序逐条运行程序指令
程序指令会要求运算器从存储器中读取操作数,并完成相应的算术/逻辑运算
最后运算结果通过输出设备转换为人能识别的形成进行呈现
冯·诺伊曼结构中运算器作为核心部分,承担了输入数据的处理存储,程序执行的运算处理,以及向输出设备转换运算结构,工作繁杂,运算器很容易成为结构中的瓶颈
在这结构上,一种以存储器为核心的改进体系结构如下图
图中实现/箭头表示数据传输,虚线表示控制与状态反馈
通过将存储器作为核心,输入输出设备直接与存储器进行数据交换,运算器只读取需要的数据进行运算处理,从而提高了工作效率
——1.4.2 现代计算机的硬件组成
现代通用计算机都是遵循冯·诺伊曼结构的存储程序计算机,其硬件也是基于五大组成部分进行组织的如下图所示
上图中介绍了现代计算机硬件的主要组成部分与五大组分之间的联系
我们可以以层次化的形式对上图进行再表述,从而形成下图
的计算机硬件的层次组织
——1.4.3 使用计算机解决问题的过程及硬件实现
我们将结合计算机的底层硬件,来描述使用计算机解决一个实际问题的过程,进而对之前提到的计算机硬件组织进行细化的介绍
首先我们需要考虑的不是如何编写程序,而是问题是否能够使用计算机来解决,这涉及到可计算理论,图灵机停机问题是不可计算问题中的讨论焦点,不过些就超出了计组的范畴
明确问题的可计算性后,我们需要设计计算模型,并进行编程对计算模型进行表述,从而形成一套指令集,按照指令集中的步骤进行执行就能计算得到问题的答案
有关计算模型的设计,需要结合问题使用一定的算法和数据结构,编程则涉及到高级程序编写的相关内容,这也都不是计组所关心的问题
我们所编写的程序会经过编译,转码,转换为机器语言,也就是上面提到的由二进制操作码和地址码组成的程序指令,程序指令和运算需要用到的数据会一并储存到存储器中
例如对于计算 ,存储器中的指令&数据就如下图中的程序清单
可以看到上图中的程序指令与我们使用高级语言编写的语句有很大的区别,这样的程序指令更接近计算机的底层硬件,更强调存储器,运算器的使用,细化每一步的具体操作与硬件所实现的运算功能相对应
这样的程序指令通过二进制码表示,能够被底层的硬件直接识别和执行,因而我们称这样的程序语言为机器语言
从高级程序语言,编译转换到机器语言涉及到编译原理的相关内容,这也超出了计组的讨论范围
——1.4.4 存储器的基本组成
存储器的主要构成就是一个能够保存数据的存储体
存储体中包含多个存储单元,每个存储单元能够独立保存一串二进制代码
存储单元又由多个存储元件构成,每个存储元件保存一个基本进制位上的0/1
存储单元索保存的这一串二进制代码数据,称为存储字
存储字具有特定的存储字长,这个长度是存储单元保存的二进制代码的位数,也是存储单元所包含的存储元件数量
存储单元还需要被分配到一个特定的地址,用于按地址寻访
MAR是存储器地址寄存器,MAR的长度反应了存储体中存储单元的数量
MDR是存储器数据寄存器,MDR就是存储单元保存数据的地方,MDR的长度就是存储字长
例如MAR=4位,MDR=8位,那么存储体中就有2^4=16个存储单元,每个存储单元包含8个存储元件,保存了一串8位的二进制代码
MAR和MDR是存储器联系外部的窗口,或称接口寄存器
读取操作时,外部会将地址传入MAR中,MAR会根据地址在CU的控制下,找到存储体中对应的存储单元并将数据拷贝到MDR中(先读取到MDR),随后MDR在CU的控制下将数据拷贝到外部需要的位置(再由MDR将数据传递给外部)
写入(存数)操作时,外部会将地址传入MAR中,MAR会将地址传递给存储体,告知存储器接下来要往地址对应的存储单元写入数据,随后外部会将数据拷贝至MDR(先传递给MDR),再由MDR将数据传递给存储体(再写入到存储单元)
——1.4.5 运算器的功能与结构
运算器的功能就是完成一系列需要由硬件实现的算数/逻辑运算,例如加法操作,减法操作,乘法操作
它的核心是一个能够实现多种算数运算和逻辑运算的组合逻辑电路—ALU(arithmetic and logic unit),又称为算术逻辑单元
以实现加/减/乘/除 这样的二元累操作运算的运算器器为例,ALU还需配以三个寄存器用于保存操作数和结果,分别是X,ACC,MQ
X寄存器用于保存输入的一个操作数,ACC寄存器用于保存一个操作数和运算的结果
MQ寄存器(乘商寄存器)会在乘法和除法操作中参与运算,并辅助ACC进行结果的保存
可以看到加减操作中只需要X寄存器和ACC参与,保存两个操作数的输入,并将结果保存在ACC中
乘法操作,是通过移位和累加实现的,具体算法和我们列竖式乘法类似,由于积的位数会比乘数高,因而需要MQ寄存器辅助保存乘法的低位结果
除法操作,通过移位和减法实现,具体算法与我们列竖式除法类似,通过判断每位是否够减,来决定上0或是上1,从而得到商值记录保存在MQ中,ACC中的被除数会被不断累减最终变为余数
———1.4.5.1 加法操作的具体过程
加法操作指令由累加操作码和被加数的地址M构成
首先在加法操作之前,ACC中已经保存了另一个加数,或者说之前运算得到的结果
加法操作其实是一个累加指令,即对ACC中已有的结果,累加地址M处的数据
执行加法操作时,将存储器地址为M处的数据取出放入X寄存器中,随后ALU执行加法操作将ACC和X寄存器中的数据累加,结果覆盖放入ACC中
———1.4.5.2 减法操作的具体过程
减法操作指令由累减操作码和被减数地址M组成
和加法操作一样,减法操作也是一个累减指令,即对ACC中已有的结果累减地址M处的数据
———1.4.5.3 乘法操作的具体过程
乘法操作由累乘操作码和乘数的地址M组成
乘法操作也是一个累乘过程,对ACC中已有的结果,累乘地址M处的数据
乘法操作是通过移位和累加完成的,累加保存结果的操作需要通过ACC实现,真正开始乘法之前,我们会将乘数读取到MQ中,之后将ACC中的已有结果给到X中,再对ACC清0(累加初始化)
并且由于积的位数会比乘数长,因而我们还需要MQ辅助保存乘积的低位结果
———1.4.5.4 除法操作的具体过程
除法操作由累除操作码和被除数的地址M组成
除法操作也是一个累除过程,对ACC中已有的结果,累除地址M处的数据
除法操作是通过位移和减法实现的,ACC中已有的结果作为被除数,除数被读取到X中,此时就需要MQ来保存商,我们会逐位试减决定每位上0或是上1,从而组合出商的结果,ACC中的被除数则会被累减变为余数
——1.4.6 控制器的功能与结构
控制器的功能就是控制每条程序指令和硬件操作的有序执行,包括对指令进行的读取,解析,执行,保存结果这一系列过程
完成一条指令,首先需要从存储器中读取指令,之后将操作码部分送达控制单元解析指令,最后由控制单元CU控制相应的部件完成指令
读取和执行指令需要按一定的顺序,这基于指令在储存器中是按序存储的,读取指令时用到的PC寄存器,就是一个保存当前执行指令地址的寄存器
在解析指令的过程中,会根据PC寄存器的地址,将指令的二进制码读取到IR寄存器中进行解析,IR寄存器完成读取后,包含指令的操作码(OP)和地址码(AD)
完成指令读取后PC寄存器的地址值就会自加1(增加1条指令存储字),从而指向下一条指令的地址
IR寄存器会将指令的操作码部分传递给CU,由CU完成对操作码的解析,并对相应的部件发出控制信号
——1.4.7 计算机完成一条指令的具体过程
之前讲到的,存储器,运算器,控制器,再加上I/O设备就构成了计算机的基本硬件组织,我们将它们一并画在下图中
———1.4.7.1 取数指令的执行过程
取数指令是将某个地址下的数据读取到ACC中
初始状态下PC中已经保存了取数指令的地址
读取指令&解析:
1.PC将地址传入MAR中
2.MAR在CU的控制下,将传入地址传递给储存体,找到指令代码对应的储存单元
3.存储体在CU的控制下,将对应存储单元中的指令代码拷贝到MDR中
4.MDR在CU的控制下,将指令代码传入到IR中
5.IR将指令的操作码(OP)传入到CU中
执行指令:
6.CU解析指令操作码后,将IR中的地址码(AD),传入MAR中
7.MAR在CU的控制下,将传入地址传递给储存体,找到需要读取的数据对应的储存单元
8.存储体在CU的控制下,将对应存储单元中的数据拷贝到MDR中
9.MDR在CU的控制下将数据传入到ACC中
———1.4.7.2 存数指令的执行过程
存数指令是将ACC中的某个数据保存到存储体中的某个地址下
初始状态下PC中已经保存了存数指令的地址
1-5步骤,读取&解析指令与2.8.1中取数指令步骤相同
执行指令:
6.CU解析操作码后,将IR中的地址码传入MAR中
7.MAR将存数地址传入到存储体,存储体找到对应的存储单元,准备向这个单元写入数据
8.ACC在CU的控制下,将数据传入到MDR中
9.MDR在CU的控制下,将数据传给存储体,存储体将数据写入到之前准备好的存储单元中
———1.4.7.3 程序的执行过程
我们之前编写的解决 的程序,它在运行时的执行过程如上图
首先存在一个高级语言,转化为汇编语言,再转化为机器语言的过程,我们编写的程序会转化为一条条程序指令(由操作码和地址码组成的机器语言指令),并逐条按序存入到存储体中,相关的数据(操作数)也会一并存入存储体
随后将程序指令的首地址送入PC中,并启动程序的执行
最开始执行的是一个取数操作,之后进行逐步的累乘累加操作,得到最终的结果
PC寄存器在每次完成读取指令代码到IR寄存器后地址值就会自加1,指向下一条指令的地址,从而程序指令会逐条,有序的执行,直到遇到停机指令,结束程序的运行
—1.5 计算机硬件的技术指标
硬件技术指标用于衡量计算机硬件的性能
这里我们给出之前提到与五大基本部件相关的计算机硬件系统的技术指标
——1.5.1 机器字长
机器字长指CPU一次能处理的数据位数,与CPU的寄存器位数有关(通常相等),我们常说的32位 64位CPU就是指机器字长
机器字长的大小会决定CPU的在执行某些指令时的效能,例如执行两个64位数据的加和操作,64位字长的CPU只需要一次累加操作就可完成,而8位字长的CPU就需要从低位到高位,8次累加操作才能得到答案
——1.5.2 运算速度指标
衡量运算速度有许多不同的衡量方法,因而产生了许多与运算速度相关的指标
主频:CPU时钟周期的频率,CPU的指令操作是在时钟信号控制下,每周期逐步完成的,因而主频在一定程度上能够反应CPU的运算速度
核心数:CPU中每个核心都是能够独立执行某个程序/线程的处理器,高荷载下每个核心都能尽量保证自己的效率的稳定,但多核的优势也需要系统/程序进行对应的优化才能发挥作用,执行某些复杂的大型程序时,核心之间也需要相互配合才能完成工作,因而并不是多一个核心速度就能快一倍
主频与核心数只能说是硬件为了应对工作而进行的准备,因而并不能很好的反映实际的工作效率
吉普森法,是根据实际程序中每条指令的运行时间,相对于每条指令的出现频率进行加权平均,得到的计算机执行程序指令的平均时间,能够反应计算机硬件执行指令的快慢
对于每条指令的出现频率 ,有两种计算方法,一种是根据程序清单的进行计算,一种是根据程序的实际运行进行计算,前者的结果称之为静态频率,后者的结果称置为动态频率,相对来说动态频率比静态频率更加准确
CPI是执行一条指令需要的执行周期,同样是根据指令的出现频率,得到的加权平均指,能够反应计算机运行时,在离散的时钟周期下指令的执行效率
与之相对的,IPC是一个时钟周期下能够运行的最大指令数量,由于现代CPU采用超标量体系,可以在一个时钟周期内载入多条指令同时完成
IPS是每秒能够完成的指令数量,FLOPS是每秒能完成的的浮点运算次数
执行指令只是手段,完成实际的工作才是真正目的,相对而言FLOPS较其它有关指令速度的指标能更好的反应计算机硬件的性能
——1.5.3 存储容量指标
存储器在计算机中分为主存和辅存
主存容量一般以,存储单元数量存储字长来表示,等于MAR长度MDR长度,例如:
MAR长10位,MDR长8位,主存容量可表示为
MAR长16位,MDR长32位,主存容量可表示为
另一种主存的表示方法是字节数表示,即计算出存储单元数量*存储字长的数值,并用 表示,例如:
辅存容量通常直接用字节数表示,一般容量尺度是
一些容量单位之间的换算关系:
内存中保存1个基本2进制位的存储元件,其容量称之为 1位/1bit
8bit=1byte/1b/1字节
但以上的2^10=1024进制只是理论值,
实际厂家制造内存/硬盘时常以1000进制换算,并且标注1GB/1TB的内存/硬盘,实际能够使用的容量也达不到1GB/1TB,往往只有90%,900MB/900GB左右的实际可用容量
2.计算机的发展及应用
—2.1 第一台计算机
事实上回答那一台计算机是世界上第一台计算机是一个很具有争议的问题,但通常我们认为
1946年美国宾夕法尼亚大学研制的ENIAC是世界上第一台通用计算机,ENIAC是之前提到的EDVAC的原型,冯·诺伊曼结构的计算机正是基于这台计算机的研究成果总结和提出的
ENIAC是由美国国防部委托研制的,完成后被国防部用于弹道计算,尽管ENIAC已经比同时代的计算机运算速度快了千倍,但ENIAC没有存储器,需要通过人工设置开关,拔插电缆,接线完成编程,这经常需要耗费数天的时间,因此ENIAC实际完成工作的效率并没有人们想象中的那么快…
—2.2 计算机发展的驱动力
计算机本质就是用于计算的机器,因而其发展的一大驱动力就是人类,从国防到公司团体再到个人,对实现高速运算需求的不断扩展
技术的发展也起到了很大的作用,主要是硬件(电子技术)的不断发展,和计算机体系结构理论的发展完善
其中硬件(电子技术)的发展对现代计算机的发展起到了决定性的作用,因而计算机的更新换代就是电子技术的更新换代
—2.3 IBM System/360
计算机历经5代发展,有很多划时代意义的计算机型,除了上面提到的EDVAC,这里再介绍一下IBM System/360所作的贡献
IBM System/360是IBM在1964年推出的大、中、小一些列机型的总称,这一些列计算机是世界上最先出现的,可兼容指令计算机
在System/360之前,各有各的规模,有各自的指令集,一段程序只能针对某个特定的计算机/机型编写,每发展出一台计算机就需要重新编写程序,重新编写操作系统
而System/360则构建了一套能够向上向下兼容的系统,具有相同的指令集,相同的数据表示,使用相同的操作系统,可以配置同样的外设,一段程序可以运行于所有的System/360机型上,并且计算机之间能够互联运行
这种兼容,互联的思想极大的推动了计算机领域的发展速度,使计算机发展进入了高速时代,许多System/360的核心技术奠定了当今数据库技术、个人计算机风潮、因特网的发展、在线购物和e-business的基础
System/360另一个最为主要贡献是在研制过程中,提出了计算机体系结构的概念,首次明确定义了计算机软硬件的交界面标准,联系了硬件和软件的设计者,以此为基础诞生了之后的其它系列机型,兼容机型
—2.4 微处理器与微型计算机的出现与发展
早期的计算机都是占地庞大,大规模电路构成的,拥有同时代极强的运算速度的计算机,事实上这类计算机经过不断发展,如今仍保持着大占地,大规模电路的特性—也就是如今的超级计算机,并一直作为国家的国防军事,科研力量的一部分
但这显然与正在码字的我,和看到这篇文章的你,所使用的,面向个人用户的计算机型
微处理器是指一片高度集成化的电路,包含控制器,运算器,所构成的处理核心,也就是我们平时所说的CPU
微型计算机是指使用维处理作为处理核心,高度集成化的,面向个人用户,体积小,重量轻,价格低的计算机型,也就是我们平时所说的电脑
CPU最早出现在1971年,由intel生产的4004处理器,4004只有4位的机器字长,后来经过不断(6代)的发展,到如今具有64位字长的高性能多核处理器
以intel产品为例的CPU发展型号,其中Pentium(奔腾系列)处理器开启了超标量体系结构的应用
此外1970年出的存储器芯片,也为微型计算机的发展创造了条件,从最初的256位容量,到如今的64MB容量
——2.4.1 摩尔定律
摩尔定律是Interl公司创始人之一Gordon Moore所提出的,CPU发展过程中,新一代的CPU约每隔18-24个月就会发布,其包含的晶体管数量便会较上一代增加一倍,性能也会提升一倍,从而1美元能够购买到的算力每18-24个月便会增长一倍
然而随着晶体管的不断缩小,集成度不断增大,集成电路芯片已经逐步顶到了电介质传导速度和量子隧穿效应两大天花板,导致如今的发展较摩尔定律预测逐步放缓,逐渐达到集成电路这种构造模式的瓶颈,以至于停滞不前
CPU/微处理器芯片正期待着能有更先进的构造技术,打破集成电路的瓶颈,以迈向新世代
—2.5 计算机软件技术的发展
计算机软件技术的发展主要是编程语言和系统软件的发展过程
早期的编程直接使用机器语言,对应硬件指令集进行编程,后来逐渐发展出汇编语言,相比机器语言更容易记忆,之后出现的面向过程,面向对象的高级语言使程序员不必在意底层的硬件实现,可以直接针对问题进行编码
系统软件是面向硬件编程,管理硬件资源,解决硬件问题,为上层软件提供/维护运行环境的一类软件,操作系统是系统软件的一类,是软件的底层。系统软件的应用使上层软件开发者,计算机的使用者不必在意底层的硬件工作。语言处理程序(汇编,编译,解释程序),服务性程序(装配,调试,诊断,排错),数据库管理系统,网络软件也属于系统软件
现代软件的特点是,代码量大,制作成本昂贵,软件测试/质量检测流程复杂。软件的开发依赖多人协作编码完成,开发周期长
输入域测试,代码覆盖测试,路径覆盖测试,是软件测试的一些基本策略,但对于现代软件而言这些测试也需要消耗大量的人力物力,并且往往只针对某个单元进行全面覆盖,因而软件出现漏洞,出现bug,造成损失,只能尽量规避,无法完全避免
3.系统总线
—3.1 总线的基本概念
冯·诺依曼结构定义了计算机组成的五大部分,即使我们将控制器和运算器组合为CPU,将I/O设备统一,依然有三大部分,而现代计算机在此基础上还有扩展,例如GPU,外部设备等等
我们需要将各个部件联接起来,进行信息的传输交互才能发挥各部分的效能,构成计算机这个整体
两两互联是联接的基本方式,但现代计算机的部件数量庞大,印刷电路板空间/制作工艺有限,这种方式也不利于部件的扩展,那么我们不妨将两两互联的线路扭合起来,形成公共的通路,每个部件只需接入公共通路就能和其它所有部件进行通信
总线(Bus)是计算机各种功能部件之间传送信息的公共通信干线,是各个设备共享的传输介质,其本质是信号的公共传输线
同一条总线上,同一时间只允许一对设备进行相互通信
—3.2 总线传输数据的方式
总线进行数据传输有两种模式,一种是串行传输,另一种是并行传输
总线中能够传输一位二进制数据的通路称之为一条信道
串行传输只使用一条信道,逐位发送一串二进制数来传递数据
并行传输则根据数据/变量的二进制组成,使用多条信道同时发送多位二进制数据
信号的传输需要遵循一定的频率(把电流变化曲线按频率切割根据高低判断0/1),在频率相等的情况下并行传输的速度要快于串行传输
但并行传输存在信号的干扰(电磁学),尤其是在高频率/长距离下,过强的信号干扰会导致无法正确的传输0/1数据
并行传输在短距下具有速度优势,串行传输在中长距下具有速度优势
高速数据传输技术依托于传输频率上限不断提高,不受传输频率上限影响的串行传输成为高速数据传输的主流
而当下计算机中数据传输,短距(板内,板间)以并行传输为主,长距(外设,计算机之间)以串行传输为主
—3.3 总线的分类
首先按照总线的位置可分为片内总线和系统总线
片内总线实现的是单块芯片内部各部件之间的传输通信
而系统总线则是实现芯片与芯片之间,之前提到的计算机各个组成部件之间的信息传输
系统总线根据传输信息/信号类型的不同,又可分为数据总线,地址总线,控制总线
数据总线通常是双向的,其信道宽度与机器字长,存储字长有关(通常小于)
地址总线通常是单向的,其信道宽度与存储地址长度,I/O地址长度有关(通常相等)
控制总线通常是双向的,需要传输来自CPU的控制信号,来自设备的状态反馈,总线的使用许可,中断请求等等信息
片内总线和系统总线都是用于单一计算机/设备内部各部件之间的数据传输,而计算机与计算机之间,计算机与其它设备进行跨设备信息传输交换的总线,我们称之为通信总线
—3.4 总线的特性及性能指标
主板就是计算机中最大的总线,它提供了各个接口,让不同的部件能够连接在一起,从而构成整个计算机
为了实现设备通过接口与总线的有效连接,总线就需要拥有一定的机械特性,电气特性,功能特性,时间特性
机械特性是总线与相应接口在制作时的尺寸构造,针脚排列规范,电气特性包括信号的传输方向,电平的高低范围,功能特性是总线在传输信息/信号类型上的针对性分类,时间特性是总线信号间的时序关系
总线的性能通过以下指标进行描述:
1.总线宽度(传输带宽),等同于总线中数据线/信道的数量,决定了总线能够同时传输的数据位数
2.标准传输率,以每秒传输的最大字节数(MBps)来衡量
3.时钟特性,数据传输的收发是进行同步进行,还是非同步进行(异步为非同步的一种),以及使用怎样的时钟频率进行数据的收发
4.复用性,只能单一传输一种类型的数据(数据,地址)还是能够传输多种类型的数据,例如inter 8086CPU16条地址总线同时复用为数据总线,复用性可以减少芯片的管脚数量,从而有利于芯片的封装
5.信号线数,各功能类型总线的综合
6.控制方式,(后面会介绍)(突发,自动,逻辑,仲裁,计数)
7.其它指标,如负载能力等等
—3.5 总线标准
总线标准是各类主板制造商和各类部件/设备制造商之间的协议,保证了由不同生产商制作的主板和各个部件能够被集成在一起工作
总线的标准随着计算机硬件技术的不断发展,向着高速度,高扩展的方向不断更新和完善
图中给出了各种总线标准及相关性能指标
ISA是工业标准数据总线,VESA是通用图像/视频传输总线
PCI是外设标准总线,它与外部设备构成了一种中介缓冲器模式,用于对内外时钟频率差异的进行适配,从而外部可以对设备进行任意的添加而不影响CPU的工作,导致计算机性能降低
AGP是interl推出的点对点局部传输总线,主要用于连接CPU(控制芯片)和GPU(显卡)
RS-232和USB是常见的串行接口总线标准
—3.6 总线结构
——3.6.1 单总线结构
最简单的总线结构就是将所有设备都联接到一条总线上,这种结构实现简单,扩展性强,但由于单总线同一时间,只允许一对设备进行传输交互,其它设备需要传输时就需要等待正在使用总线的设备释放总线,这种设计会导致系统中存在总线资源的抢占问题,容易成为系统的瓶颈
例如当I/O设备与主存进行数据交换时,CPU就无法从主存中获取指令和数据,导致CPU停止运行大大影响效率
——3.6.2 双总线结构
———3.6.2.1 以CPU和核心的双总线结构
以CPU为核心的系统结构中,以CPU中心发出两条总线,一条专用于与I/O设备传输数据,一条专用于与主存传输数据
通过M总线这条专用总线,解决CPU与主存之间存在繁忙的数据交换,一定程度上提升了CPU的运行效率
但这样的结构依然存在问题,当主存与I/O设备之间需要传输数据时,就需要CPU作为中介才能完成数据传输,依然会打断CPU的运行
———3.6.2.2 以存储器为核心的双总线结构
现代计算机总线结构的基础
从主存发出两条总线,系统总线用于连接主存和其它部件(也包括CPU),存储总线专用于连接CPU
从而CPU能够与主存之间通过存储总线进行高速的信息交换,并通过系统总线完成其它部件之间的信息传输
不过这种结构下,主存依然无法同时使用两条总线进行数据交换,现代的双口存储器依然需要使用分时机制来完成分别完成两条总线上的数据交换
但随着计算机技术的不断发展相信有一天,能够实现主存数据对系统总线和存储总线的同时传输交换
———3.6.2.3 通道连接的主存总线与I/O总线结构
通过通道连接I/O总线,实现I/O设备与CPU和主存之间的通信
通道是一种特殊的,结构简单的处理器,其程序由操作系统进行编写,并可独立运行
有关这种结构,以及通道的详细知识会在计算机体系结构中讨论
——3.6.3 三总线结构
———3.6.3.1 CPU为核心扩展DMA总线
在以CPU为核心双总线结构的基础上
扩展出一条DMA(直接存储器访问)总线,用于高速I/O设备与主存之间的高速数据交换
———3.6.3.2 Cashe三总线结构
主存的信息交换速度大约每10年才能增加一倍,相比CPU的更新速度,主存速度就成为了瓶颈
为此现代计算机体系结构中引入了Cashe(高速缓存),作为CPU与主存之间的中介
在CPU运行时,Cashe会预先加载之后可能需要的数据,并与CPU实现高速的数据交换,从而避免主存的速度瓶颈
局部的高速I/O控制设备可以接入到CPU与Cashe之间的局部总线上
系统总线扩展出扩展总线接口和扩展总线,其它设备可连接至扩展总线上,并通过接口与系统总线连接,从而实现外设和内部主存之间的数据交换
但由于其它设备均连接到扩展总线上,外部设备的工做效能可能受到影响
——3.6.4 四总线结构
四总线结构解决了Cashe三总线结构中,外部设备均接入扩展总线,运行效率受到影响的问题
由Cashe桥扩展出高速总线,实现高速外设与CPU的数据交换
再由高速总线,引出扩展总线接口和扩展总线,连接其它低速设备
通过分别组织高速和低速设备总线,提示数据传输效率
——3.6.5 实际计算机上的总线结构
———3.6.5.1 传统微型计算机总线结构
当下个人计算机使用的基本总线结构,系统总线连接CPU和主存,扩展出标准总线控制器,I/O总线,连接其它设备
———3.6.5.2 VL-BUS总线结构
系统总线扩展出VL-BUS高速总线,连接高速设备(例如图形设备)
VL-BUL总线再扩展出总线控制器,ISA/EISA总线连接低速设备
———3.6.5.3 PCI总线结构
与VL-BUS总线结构类似
系统总线扩展出PCI桥和PCI总线连接高速设备,再由PCI总线扩展出标准总线控制器和ISA/EISA总线连接低速设备
PCI总线结构的缺点是当PCI总线上连接设备过多时,总线带宽不够,导致总体性能下降
为此引入了多层PCI结构,通过桥电路扩展出多级总线
—3.7 总线控制
当总线连接了多个设备时,由于同一时间只允许一对设备使用总线进行相互通信,因而设备在需要通信时会向总线发出占用申请,在得到占用许可后通过总线完成数据交换
因而总线控制需要解决判优控制和通信控制问题
判优控制是当多个设备发送占用申请时,如何合理的分配总线资源
通信控制是使用总线完成通信时,如何保证数据传输的速度和准确性
总线传输周期如上图所示分为四个阶段
申请分配阶段需要通过判优控制来决定设备是否能占用总线进行通信
寻址阶段和传输阶段共同构成通信阶段,需要通信控制来保证数据收发,命令发送响应的有序和准确
——3.7.1 判优控制
———3.7.1.1 基本概念
根据能否发出总线占用申请,我们将总线上的设备分为两类
主设备(模块)是通信的主导方,能发送总线占用申请,在占用总线后对总线,及从设备的通信具有控制权
从设备(模块)是通信的被动方,只能相应主设备的通信请求,完成通信
一些设备既可以作为主设备也可以作为从设备
有的总线只允许有一个主设备,有的总线允许有多个主设备
———3.7.1.2 判优控制模式
集中式中判优逻辑由一个部件(CPU)完成,分布式中判优逻辑有多个部件协调处理
集中式又可分为 链式查询,计数器定时查询,独立请求 三种
————3.7.1.2.1 链式查询模式
链式查询模式是结构最简单的一种控制模式,其电路如上图所示,多用于微型计算机,嵌入式设备中
数据线和地址线完成总线的数据传输功能,此外还有3条控制线传递控制信息
BR(bus request)总线请求信号线,所有设备都使用这条线路来发出总线占用请求
BS(bus busy)总线忙信号线,用于获得占用许可的设备向控制部件反馈/设置通信控制信息
BG(bus grant)总线占用许可信号线,用于链式查询发出总线占用信息的设备
首先I/O设备从BR线向控制部件发送占用申请,之后控制部件通过BG线传输授权许可,许可信号会链式寻访每个I/O设备,轮询是否需要占用总线,当遇到需要占用总线的设备时,该设备截取控制权,BG线信息不再向后传输,获得控制权的设备通过BS线反馈通信信息,展开通信
之所以需要链式寻访,是由于控制信号统一由BR线送达控制部件,因而不经过轮询,控制部件并不知道究竟是那一个I/O设备发出了占用申请
链式寻访模式的一大优点是,我们会按照优先级来布置BG线的寻访顺序,优先级高的I/O设备可以接入靠前的接口,从而在同时发送占用申请时,能够被先轮询到,优先截取占用权
此外链式寻访还具有结构简单,设备易扩展等优点
链式寻访的缺点是,对电路故障敏感,尤其是BG线,一旦线路或是某个接口出现故障,导致信号传输中断,之后的I/O设备占用申请将永无应答
但我们可以通过增加BG/BS信号线条数,来快速实现可靠性的增强
另一大缺点是授权信号链式寻访,当连接设备过多时BG线容易成为瓶颈,降低整体运行效能
————3.7.1.2.2 计数器定时查询模式
数据线和地址线完成总线的数据传输功能
控制线为BS(总线忙),BR(总线占用请求),设备地址信号线
总线控制部件内部有一个计数器,当设备通过BR线向总线控制部件提出占用请求后,计数器下标会进行初始化,随后按一定方式进行递推,总线控制部件将根据计数器下标寻访对应的I/O设备
与链式查询不同,计数器定时查询模式中寻访逻辑可编程,我们可以灵活设定计数器的初始值以及递推方式,例如固定初始化为K来提升K位置及之后的I/O设备优先级,使用上一次相应的值从而循环优先级,或使用一个数组来安排优先级顺序
设备地址信号线的宽度要与I/O接口的总数对应,能够将所有I/O接口用二进制状态编码表示
————3.7.1.2.3 独立请求模式
相比前两种模式需要按一定顺序查找提出占用请求的设备,独立请求模式为每个I/O接口链接了专属的BR和BG线,从而可以进行独立的占用请求发送和应答
总线控制部件根据BR线的来源就能获知发送占用请求的设备,优先级的排序通过总线控制部件内部排队器这一特殊的集中电路完成,其逻辑也可以进行编程控制
——3.7.2 通信控制
获得占用总线许可后,主从设备将展开通信,在此过程中需要总线通信控制来协调双方的数据交换过程,保证收发数据的有序准确
———3.7.2.1 四种通信控制模式
同步通信按照CPU时钟的高低电频形成的时钟频率,作为统一时标,主从设备会根据时钟频率来同步每个时段内需要完成的工作
异步通信是采用应答模式,主设备发送请求,从设备发送应答信号,之后进行相应的命令执行和数据传输
半同步通信,通过结合同步和异步,解决不同运行速度的设备之间的通信
分离式通信,是最为高效且复杂的模式,能够充分挖掘系统总线每一瞬间的潜力
———3.7.2.2 同步通信
同步通信的特点是一定要有定宽,定距的周期来控制通信过程,主从设备各种操作的执行
CPU的高低脉冲信号会形成时钟频率,主从设备需要按照时钟频率,在相应的周期内,相应的时间点之前,完成相应的工作
每个周期始于上一周期末尾的低电平变为高电平时的上升沿,保持一定时间的高电平后,变为低电平(包含一个下降沿)并结束于下一周期开始前的上升沿
同步方式要求主从设备强制按照时标进行操作/运行同步,因而会受到短板效应的影响,在高速设备和低速设备之间的通信中,必须按低速设备的频率来设计通信流程,高速设备的效能会有所降低
多用于设备之间存取速度相近时的通信控制
以数据输入(读命令)的执行为例
首先在T1周期上升沿之前,主设备要通过地址线给出需要读取数据的地址
在T1周期内,T2周期上升沿之前,主设备需要给出读命令信号
T2周期,T3周期上升沿之前,从设备需要将要读取的数据拷贝至接口寄存器并给出数据信号
T3周期,T4周期上升沿之前,主从设备完成数据的发送和接受,同时读命令信号撤销
T4周期,T5周期上升沿之前,地址信号被撤销
写入操作执行为例
首先在T1周期上升沿之前,主设备要通过地址线给出需要写入数据的地址
T1周期高电平阶段,下降沿之前,从设备准备好写入,并发送数据信号
T1周期低电平阶段,T2周期上升沿之前,主设备接受数据信号给出写入命令
T2周期与T3周期,需要完成数据向接口寄存器的写入,以及接口寄存器向写入地址位置存储体的数据写入
T4周期上升沿之前,从设备需要确认写入完成,主设备撤销写入命令信号
T4周期内,T5周期上升沿之前,地址信号撤销
———3.7.2.3 异步通信
异步通信采用请求&应答模式,不设置统一的时标来同步进程,设备之间独立进行运作,何时接受到命令/数据,何时执行相应的操作
异步通信需要增设请求线路和应答线路
异步通信可分为不互锁(左),半互锁(中),全互锁(右)三种模式
不互锁模式是最为简单的,由主设备发送请求信号,从设备接受到请求信号后进行应答,一段时间后主设备和从设备的请求/应答信号自动撤销(不管对方是否有接收),不互锁模式可靠性较低
半互锁模式在不互锁的基础上,要求主设备必须得到应答才撤销请求信号,但从设备应答信号依然经过一段时间就自行撤销,半互锁较为可靠,但由于从设备不检测主设备是否成功接收应答,可能导致长时间的请求
全互锁在半互锁模式基础上,要求从设备必须确认主设备撤销请求(主设备收到了应答信息),才会撤销应答信号,全互锁能够完成最可靠的异步通信
如果主设备接收数据发现有误,半互锁和全互锁下,主设备可以要求从设备再次发送数据
———3.7.2.4 半同步通信
半同步通信是同步通信和异步通信的结合,因而具有两者一定程度上的特正
半同步通信中也会使用一定的时钟频率来规范信号的收发,主设备使用时钟前沿发送信号,从设备使用时钟后沿判断识别信号,反馈响应
但与同步通信不同的是,半同步通信不要求主从设备必须在某个时钟周期中共同完成固定的工作,而是按照自己的运行速度,独立运行
当主设备于T1周期发送完指令后,在T2周期结束前,若从设备无法完成相应的指令,发送反馈信号/提供数据,从设备会在T2周期内发送WAIT信号(以WAIT信号线低电平表示),主设备会在T3周期到来前一刻,检测WAIT信号,若为低电平则主设备于T3周期等待从设备完成工作
从设备如果未在n个周期内完成工作将一直发送WAIT信号,主设备在此期间可以执行其它任务,直到从设备在n+1个周期结束前完成准备工作取消WATI信号并发送反馈,主设备会在n+2个周期与从设备进行数据的收发,同时撤销命令信号,n+3个周期主设备撤销地址信号
———3.7.2.5 分离式通信
主从设备收发数据大致可划分为三个过程:
1.主设备发送地址和指令信号(使用总线)
2.从设备准备数据(不使用总线)
3.主从设备完成数据收发(使用总线)
过程2,实际主从设备并未使用总线进行数据交换,但在之前的三种通信模式中会保持占用
而分离式通信正是在过程2时,让主从设备放弃总线占用,让其它真正需要使用总线收发数据的设备来占用总线,避免占而不用的情况,从而挖掘总线每一瞬间的潜能
当从设备准备好数据来到过程3时,将由从设备发出占用总线请求(变为主设备),占用总线后将数据发送给主设备(变为从设备)
分离式通信的特点是要求所有设备都有权申请总线占用(都能作为主设备),收发数据采用同步模式进行,各个设备准备数据时不占用总线,总线被占用是一定进行数据交换(没有占而不用的情况)
4.存储器
存储器是现代储存程序计算机中重要的组成部件之一,计算机运行时的程序指令,数据都保存在存储器中,改进型的冯·诺伊曼结构也是以存储器为核心
—4.1 存储器的分类
1.按存储介质分类
可分为半导体存储器,磁介质存储器,磁芯存储器,光盘存储器
我们使用的内存条,U盘都属于半导体存储器,半导体存储器又可分为TTL(Transistor-Transistor-Logic)晶体管-晶体管逻辑型存储器和MOS(Metal-Oxide-Semiconductor Field-Effect Transistor, MOSFET)金属氧化物半导体效应场管型存储器
TTL型存储器集成度低功耗高但速度快,MOS型存储器集成度高功耗低,现代计算机存储器主要是MOS型
磁盘,磁带都属于磁介质存储器,在金属表面涂抹磁层,作为磁载体,利用磁化方向的不同来表示0和1,磁盘表面每一圈可保存0/1的同心圆称之为磁道,由小到大磁道弧排列形成扇区,以扇区为单位进行数据的存储
磁介质存储器在读取数据时需要通过磁头移动寻找扇区,并判别磁道不同位置的磁化方向/或施加相应的磁化从而完成数据的读写
磁芯存储器(Core Memory),通过横纵导线磁环构成,是计算机芯片内部的存储器,曾为计算机发展做出一定的贡献
光盘存储器采用激光和磁光材料,进行数据的存储和读写
半导体存储器是易失型存储器(RAM),需要持续供电来维持数据保存,断电后数据丢失,另外三种存储器都是非易失型(ROM),能够在断电后保存数据
2.按存取方式分类
可分为随机访问存储器和串行访问存储器
随机访问存储器存取时间与物理地址无关,只要给出地址就能进行寻址访问,例如内存
随机访问存储器又可分为随机存储器(程序执行中可读可写),和只读存储器(用于存放系统参数等只读常量)
而串行范围存储器,存取时间与物理地址有关,根据地址的不同存取时间会有所差异,需要针对物理地址位置进行一定的调整才能完成数据的读写,例如磁盘,磁带
串行存储器又可分为顺序存取存储器,例如磁带,只能按物理地址顺序读写,和直接存取存储器,例如磁盘,可以在任意指定位置读写数据,但磁头需要根据物理位置进行一定的调整
3.按作用分类
主存储器可分为RAM和ROM,易失性和非易失性,RAM容量小高速但断电后数据会丢失(内存),ROM容量大低速能在断电后保存数据(硬盘)
闪存(Flash Memory)其实属于EEPROM(电擦除可编程只读存储器),它的读取速度较ROM更快,可以进行反复擦写,并且能在断电后保存数据
我们使用的U盘就属于闪存,一些高性能的微型计算机可能直接将闪存作为硬盘使用,就是所谓的固态硬盘(SSD)
闪存不能像RAM那样以字节为单位改写数据,因而不能取代RAM
闪存也可以用做主辅存储器之间/寄存器主存之间的速度调剂,即缓存,我们可以在读取数据后提前预取附近位置的数据到缓存中,如果之后需要读取的数据恰好已经被保存到了缓存中,就可以直接读取缓存,称之为“缓存命中”
CPU寄存器和内存之间就会使用Cache高速缓存,一些磁盘也会使用SSD阵列作为缓存提高读取速度
辅助存储器是指光盘,磁盘,磁带一类外部低速存储器
—4.2 存储器的层次结构
用户的需求通常希望存储器能够有更低的价格,更大的容量,更快的速度
但实际并没有任何一种单一的存储器能够兼顾这三方面的优势,因而存储器形成了如上图所示的层次结构,在不同层次,不同的存储器之间通过硬件接口,软件适配,或是软硬件结合的方式进行连接,从而构成一整套计算机存储体系,从而整个存储体系能够做到三方兼顾
寄存器是直接部署在某一硬件部件内部的容量低,但速度极快的存储器,是硬件运行时能直接访问到的,直接进行处理的数据,除了CPU,I/O设备中也会布置寄存器
其中部分寄存器是提供给机器语言程序员进行编码读写控制的,也有部分寄存器运行固定的预制硬件逻辑,对机器语言程序员透明
对于上层的程序员来说,我们不需要考虑存储体系的层次结构,只需要将其看作一个整体进行数据的读写即可,信息在不同层次间的传递,会通过相应的连接方式(软件,硬件,软硬结合)自动完成
——4.2.1 缓存—主存—辅存
程序运行时,CPU需要将主存中保存的指令,数据读如到寄存器中执行
而对于某些大型程序,或是部分大容量的数据,资料,由于主存容量有限,可能还需要主机外部可扩展的辅存来存储,因而主存—辅存之间会通过硬件接口和软件适配结合的方式,完成数据的传递交换,构成一个存储整体,称之为虚拟存储器
我们在进行程序编写时,看到的地址是对应虚拟存储器的虚地址/逻辑地址,在程序实际运行时,会通过一定的机制将虚地址转为真实的物理地址
对于上层软件的开发者来说,不需要考虑这个存储整体的数据传输,通常只需要将它们看作一个整体进行调用即可,一些情况下可以通过编码控制数据/资源,从辅存到主存,或是在主存内部(RAM ROM之间)的加载和卸载
此外,由于CPU的运行速度提升(摩尔定律)较主存速度快,因而我们会在主存和CPU寄存器之间架设缓存(Cache),来适配两者的速度差异
缓存通过每次CPU访问主存后,对访问附近位置的数据进行预取加载,利用程序的时间局部性和空间局部性,从而在之后CPU需要访问主存时就可能出现“缓存命中”,从而直接获取预加载好的缓存数据
缓存—主存,直接使用主存地址,或者说对数据只记录主存地址,即便数据被预加载到缓存中,其地址仍表示为主存地址,从而CPU在访问时按主存地址寻访即可,若相应主存地址处的数据已经预加载到了缓存中,则优先获取缓存中预加载的数据到CPU寄存器中
但缓存本身并不是没有地址,在完成缓存—>CPU寄存器的数据读取过程中,CPU提供的主存地址会转换为对应的缓存地址,从而读取缓存中对应的数据
主存储器地址又称之为物理地址/实地址
缓存和主存之间通过预制硬件逻辑进行连接,对程序员是完全透明的
—4.3 主存储器概述
——4.3.1 主存储器的组成结构
如上图,我们细化了之前给出的主存储器组成
地址总线连接在MAR上,向MAR单向传递地址,地址数据经译码器,驱动器转换,从而在存储体中选定对应的存储单元
数据总线连接在MDR上,可进行双向数据传到,通过控制电路发送读/写信号决定是将MDR中的数据写入存储体,还是将存储体的数据读出MDR再传递到数据总线上