计算机组成原理
“练拳不练功,到老一场空”。
如果越早去弄清楚计算机的底层原理,在你的知识体系中“储蓄”起这些知识,也就意味着你有越长的时间来收获学习知识的“利息”。虽然一开始可能不起眼,但是随着时间带来的复利效应,你的长线投资项目,就能让你在成长的过程中越走越快。
知识体系:
第0章 计算机第一门课
0x00 计算机软硬件
计算机由两大部分组成: 硬件 和 软件
-
硬件: 即看的键的计算机部件物体
-
软件: 运行在计算机内的程序.
-
软件又分: 系统软件 和 应用软件
-
系统软件: 管理计算机系统,监视服务,合理调度系统资源,高效.
系统软件组成:标准程序库,语言处理程序(编译器,汇编器),操作系统,服务程序,数据库管理系统,网络软件等.
应用软件: 为完成某个目的而编写的程序.
-
0x01 计算机系统层次结构
第1章 计算机概述
0x00 计算机发展史
图灵机 → ENIAC(第一台真空管) → 冯诺依曼结构目前主要)和哈佛结构(嵌入式主要) → 半导体集成电路
-
冯诺依曼机型第一篇论文:
First Draft of a Report on the EDVAC
,提出存储程序
概念-
存储程序
思想: 把事先编写好的程序与原始数据
送入主存
中, 然后启动执行. 计算机在不需操作人员操作下,自然完成取出指令和执行指令的任务. -
存储程序
的另一层涵义:可编程
.
-
-
ENIAC非冯诺依曼结构
0x01 计算机特点
- 高速: 高速元器件和
存储程序
的工作方式带来高速运行. - 通用: 在处理对象和应用领域没有限制
- 准确: 精度足够的算数运算
- 智能: 逻辑推理能力有智能型
0x02 冯诺依曼结构
1. 五大组成部分
-
冯诺依曼结构的组成部分(来自First Draft):
-
输入设备 (Input device)
-
算术/逻辑运算器 (Arithmetic/Logic Unit):
与处理器寄存器(Processor Register)的处理器单元(Processing Unit),一起完成各种算术和逻辑运算.
我们称之为数据通路(Datapath)或者运算器.
-
控制器 (Control Unit) :
由指令寄存器(Instruction Register)和程序计数器(Program Counter)组成,用来控制程序的流程,通常就是不同条件下的分支和跳转
-
存储器 (Memory Unit):
存储数据Data和指令Instruction的内存以及更大容量的外部存储.
-
输出设备(Output device)
在现在的计算机里,上面的算术逻辑单元和这里的控制器单元,共同组成了我们说的 CPU.
-
所有的计算机程序, 也都可以抽象为从输入设备读取输入信息, 通过运算器和控制器来执行存储在存储器里的程序,最终把结果输出到输出设备中. 而我们所有撰写的无论高级还是低级语言的程序, 也都是基于这样一个抽象框架来进行运作的.
2. 冯诺依曼结构计算机的特点:
-
典型的五大部件
-
指令和数据, 以二进制形式, 不加区别地, 存放在存储器中! (哈佛结构就不是这样)
意味着指令与数据的宽度一样. 指令与数据可按地址寻访.
-
指令由操作码和地址码组成, 操作码指数操作类型,地址码给出操作数的地址.
-
计算机工作时, 能自动从存储器中取出指令进行执行
-
指令在存储器内顺序存放.通常, 指令是顺序执行,但也可改变执行顺序.
-
运算器能进行加减乘除四种基本算术运算, 也能进行逻辑运算与附加运算.
-
操作人员可以通过输入设备和输出设备和主机进行通信
-
机器以运算器为中心,输入输出设备与存储器之间的数据传送通过运算器完成.
0x03 现代计算机结构
现代计算机已经转为以存储器为中心.如图:
各部件功能
- 运算器: 完成算术与逻辑运算, 中间结果暂存运算器(寄存器)内.
- 存储器存放数据和程序(与冯氏结构一样)
- 控制器可以控制, 指挥程序和数据的输入,运行以及处理运算结果.
- 输入设备把人类的信息形式,转为计算机能识别的信息形式.如键鼠等.
- 输出设备是把计算机运算的结果,转换成人类熟悉的信息形式.如显示器, 音响等.
现代计算机由三大部分组成
-
CPU = 运算器 + 控制器
-
主存储器
-
I/O设备
各部件的包含关系
细化的计算机组成图
存储器介绍
存储器分为主存储器(内存)和辅助存储器(外存储器).
CPU能直接访问主存储器. 辅助存储器中的内容必须先调入主存后,才能由CPU访问.
主存储器(内存或主存) 包括存储体, 各种逻辑部件及控制电路等.
主存储器的工作方式, 是按存储单元的地址进行存取, 即按地址存取方式.
人们只要事先将编好的程序按顺序存入主存各单元, 当运行程序时, 先给出该程序在主存的首地址, 然后采用程序计数器加 1 的方法, 自动形成下一条指令所在存储单元的地址, 机器便可自动完成整个程序的操作.
由于数据和指令都存放在存储体内各自所占用的不同单元中, 因此, 当需要反复使用某个数据或某条指令时, 只要指出其相应的单元地址号即可, 而不必占用更多的存储单元重复存放同一个数据或同一条指令, 大大提高了存储空间的利用率. 此外, 由于指令和数据都由存储单元地址号来反映, 因此, 取一条指令和取一个数据的
操作完全可视为是相同的, 这样就可使用一套控制线路来完成两种截然不同的操作.
如图是主存储器的基本组成.
存储体中存放二进制代码数据.
存储体由许多存储单元组成, 每个存储单元包含若干存储元件, 每个存储元件存储1位二进制代码0或1.
故存储单元可存储一串二进制代码, 这串代码称为存储字, 称这串代码的位数为存储字长.
也就是说, 存储单元的宽度就是一个存储字长. 存储字长可以为8位,16位, 32位等.
一个存储字可代表一个二进制数, 也可代表一串字符, 如存储字为 0011011001111101, 既可表示
为由十六进制字符组成的 367DH , 又可代表 16 位的二进制数, 此值对应十进制数为 13949 , 还可代表两个 ASCII 码:" 6” 和“}". 一个存储字还可代表一条指令.如果把一个存储体看作一幢大楼, 那么每个存储单元可看作大楼中的每个房间 , 每个存储元
可看作每个房间中的一张床位, 床位有人相当于 “1” , 无人相当于 “0”. 床位数相当于存储字长.
显然, 每个房间都需要有一个房间编号, 同样可以赋予每个存储单元一个编号, 称为存储单元的
地址号.
为了能实现按地址访间的方式, 主存中还必须配置两个寄存器 MAR 和 MDR.
存储器地址寄存器(MAR, Memory Address Register)存放欲访问的存储单元的地址, 经过地址译码后, 找到所选的存储单元. 接着进行读操作或写操作.
存储器数据寄存器(MDR, Memory Data Register)用于存放从存储体某单元取出的代码或者准备往某存储单元写入的代码.
时序控制逻辑用于产生存储器操作所需的各种时序信号.
要想完整地完成一个取或存操作, CPU还得给主存加以各种控制信号, 如读命令, 写命令和地址译码驱动信号等。随着硬件技术的发展, 主存都制成大规模集成电路的芯片而将 MAR和 MDR集成在 CPU 芯片中.
MAR用于寻址, 其位数对应着存储单元的个数, 如MAR是10位的话, 就有2的10次方 1024个存储单元, 1024记为1K.
MAR的长度与PC的长度相等.
MDR的位数与存储字长相等, 一般为字节的二次幂的整倍数.若MDR为16位, 那么1个字就是16位长.
-
运算器介绍
运算器 的核心是ALU 算术逻辑单元.
运算器中, 包含若干通用寄存器(GPR, General Purpose Register), 用于暂存操作数与中间结果. 如累加器(ACC, Accumulator ), 乘商计算器(MQ, Multiplier-Quotient Register), 操作数寄存器(X), 变址寄存器(IX), 基址寄存器(BR)等, 其中前三个是必备的.
运算器内还有程序状态寄存器(PSW, Program Status Word), 也称标志寄存器(Flag Register). 用于存放ALU运算得到的一些标志信息或者处理机的状态信息.如结果是否溢出, 有无产生进位或错位,结果是否为负等.(单片机常见)
控制器介绍
控制器是是计算机的神经中枢, 由其指挥各部件自动, 协调地进行工作.
具体而言, 它首先要命令存储器读出一条指令, 称为取指过程, 也称取指阶段. 接着, 它要对这条指令进行分析, 指出该指令要完成什么样的操作, 并按寻址特征指明操作数的地址, 称为分析过程,也称分析阶段.
最后根据操作数所在的地址以及指令的操作码完成某种操作, 称为执行过程, 也称执行阶段.以上就是通常所说的完成一条指令操作的取指, 分析和执行 3 个阶段.
控制器由程序计数器(PC, Program Counter), 指令寄存器(IR, Instruction Register)和控制单元(CU)组成.
控制单元CU用来分析当前指令所需完成的操作, 并发出各种微操作命令序列, 用以控制所有被控对象.
程序计数器PC用来存放当前欲执行指令的地址, 可以自动加1以形成下一条指令的地址, 它与主存的MAR之间有直接通路.
指令寄存器IR用来存放当前的指令, 其内容来自主存的MDR.
IR 中的操作码 ( OP (IR) )送至 CU, 记作 OP (IR) → CU , 用来分析指令;
其地址码 ( Ad(IR) )作为操作数的地址送至存储器的 MAR ,记作 Ad (IR) → MAR 。
如上图是冯诺依曼的模型机, CPU包含ALU, 通用寄存器组GPRs, 标志寄存器, 控制器, 指令寄存器IR,程序计数器PC, 存储器地址寄存器MAR, 存储器数据寄存器MDR. 从控制器发出的是控制信号, 可以控制如何修改PC以得到下一条指令的地址, 可以控制ALU执行何种运算, 可以控制主存是读操作还是写操作.
CPU和内存之间通过一组总线相连, 总线中有地址, 控制和数据3组信号线. MAR中的地址信息会直接送到地址总线上, 用于指向读/写操作的内存存储单元; 控制线中有读/写信号线, 指出数据是从CPU写入内存, 还是从内存读到CPU, 根据是读操作or写操作来控制将MDR中的数据是直接送到数据线上, 还是讲数据线上的数据放到MDR中.
总结一下
我们需要知道的控制过程的部件, CU, PC , IR, MAR, MDR, 运算器
. 运算器的运算过程, 我们暂时把它当黑箱.
看个例子:
C语言写个简单的程序, 然后编译器经过预处理, 编译, 汇编, 链接之后, 翻译成机器认识的二进制代码, 装入内存.
假设地址从0开始, 然后16位作为一个存储字长. 指令和数据, 顺序存储在内存中.
地址0到4, 存放的是指令, 5到8存放的是我们定义的4个变量.
执行过程:
开始: PC
中的地址值为0, 指向内存的第一条指令地址.
#1: PC
中的地址, 经地址总线, 传到MAR中去. 此时MAR中的值为 0号地址.
同时控制器通过控制总线告诉主存, 此次操作为读取
#2: 主存
会根据MAR
中的地址信息, 去0号地址读取其中的二进制代码. 存放到MDR
中.
#3: 主存
通过数据总线
把MDR
中的数据送给IR
, 此时IR 中的值就是0000010000000101
此时, PC自动加1.
PC中的值为 1号地址.
#4: IR
中的操作码OP
送给CU
(OP (IR) → CU), CU分析指令
后, 知道是取数的命令.
#5: IR
中的地址码Ad
送给MAR
(Ad (IR) → MAR), 则MAR中的值为0000000101(就是5号地址位).
#6: 主存根据MAR的地址, 从5号地址读取其中的数据, 存放到MDR. MDR中的数据就是 2.
#7: CU指挥MAR中的数据, 经数据总线, 传给ACC
#1~#3为取指领, #4 为分析指令. #5~#7 为执行指令.
PC自动加1 后:
#1: PC中的值再传给 MAR, MAR中的值为1号地址. 控制器给出读取指令.
#2: 主存根据MAR的内容, 去1号地址读取指令, 存到MDR.
#3: MDR中的指令 再传给IR. (取指令完成)
同时PC再自动加1, 变成2号地址.
#4: OP (IR) → CU , CU分析命令, 得知是乘法命令. (分析指令)
#5: Ad (IR) → MAR, MAR中的值为6号地址.
#6: 主存去6号地址取数据3, 存到MDR.
#7: MDR中的数据经数据总线传到 MQ 中.
#8: 控制器把ACC中的a的值2, 传到操作数寄存器X中, CU通过2进制代码告诉ALU进行乘法.
#9: ALU执行乘法运算, 结果存在ACC中.(若乘积很大, 则需要MQ帮助存储.) (执行)
如此重复, 自动执行.