计算机组成原理-笔记
今天开始我们系统学习计算机组成原理的内容,主要参考资源还是网课:王道计算机考研 计算机组成原理_哔哩哔哩_bilibili
如何理解计算机组成原理呢?

如图所示,如果把计算机世界这样划分的话,可以清晰地看到计算机的由软件,硬件与操作系统组成,软件主要涉及的是数据结构,那么硬件主要涉及的就是操作系统。
比较常见的硬件包括:



现在我们来学习计算机硬件的基本组成:
计算机硬件组成
主流的有两种组成结构:

我们首先来学习早期的冯诺依曼结构:

这张图展示了冯・诺依曼体系计算机五大核心组成结构,包含输入设备、存储器、运算器、控制器、输出设备;其中实线代表数据线,虚线代表控制线与反馈线。工作流程如下:首先输入设备把外部的数据和程序(计算步骤)转换成计算机能够识别的二进制信息,送入存储器统一保存;控制器从存储器读取程序指令,解析后发出控制信号,指挥整机有序工作;根据指令要求,存储器将待处理的数据传输给运算器完成算术、逻辑运算,运算产生的中间结果可回存至存储器;运算完成后,最终数据再传递到输出设备,转换为人能够看懂的形式向外输出。整个过程里,控制器依靠控制线向输入设备、存储器、运算器、输出设备下发控制命令,各个部件也会通过反馈线把自身状态回传给控制器,持续协调所有硬件配合完成计算;同时遵循冯・诺依曼核心思想:数据与程序一同存放在存储器中,计算机自动逐条读取指令执行运算。
这里还要引出另一个概念:
在计算机系统中,软件和硬件在逻辑上是等效的。
一个既定的功能逻辑,既可以使用硬件电路直接实现,也可以依靠软件编程实现;从上层使用者视角看,最终对外表现的功能、行为完全一致,无法区分底层到底是硬件还是软件在干活。但二者在运行速度、成本、灵活性上存在明显差异:硬件实现速度快、功能固定;软件实现灵活性高、易于修改,但执行速度相对较慢。这一原理是计算机系统软硬件取舍、指令集设计、硬件加速、虚拟机与模拟器技术的理论基础。

冯·诺依曼计算机一共有六个特点:整机由输入设备、输出设备、存储器、运算器、控制器五大硬件部分组成;指令和数据放在同一个内存里,地位一样,依靠地址找到对应的内容;不管是指令还是数据,在电脑内部全都用0和1的二进制表示;每一条指令分成两部分,一部分说明要做什么运算,一部分说明去哪里找数据;核心思路是把提前写好的程序和数据一起放进内存,电脑就能自动一条接着一条执行,不用人工反复操作;早期的冯诺依曼机器所有数据传输都要经过运算器,是以运算器为中心,而我们现在的电脑是以存储器(内存)为中心,这点需要区分开。
然后就是我们现代计算机的结构:



早期机型以运算器为中心,所有外设和存储器之间的数据交换都必须经过运算器中转,而现代计算机转变为以存储器(内存)为中心,依靠 DMA 技术让外设能够直接和内存传输数据,不再全程占用 CPU,除此之外现代计算机将运算器与控制器整合封装为 CPU,采用统一总线连接各个硬件方便设备扩展,新增中断机制优化 CPU 与外设的通信方式,还在 CPU 和内存之间加入高速缓存 Cache,以此弥补 CPU 运算速度和内存访问速度之间巨大的性能差距,解决了原始架构 CPU 负担重、拓展性差、速度不匹配的诸多问题。
接着我们开始深入学习内部的组件结构:

我们已经知道了现代计算机的中心是存储数据的存储器,其内部结构如图所示。
我们可以结合菜鸟驿站的类比完整理解这张图,主存储器由存储体、MAR地址寄存器、MDR数据寄存器三部分构成,存储体就相当于驿站里摆放包裹的货架,每一个存放位置都拥有独一无二的地址,MAR存储地址寄存器如同店员接收的取件号,用来记录我们想要访问的存储单元编号,CPU把地址送入MAR后,硬件根据这个地址定位存储体里对应的存储单元,MDR存储数据寄存器相当于对外交互的柜台,负责临时存放即将从存储体读出、或是准备写入存储体的数据,整个存取流程就像顾客把取件号交给店员(CPU将地址送入MAR),店员依据取件号找到货架上对应的包裹(硬件根据MAR地址定位存储体单元),再把包裹放到柜台交给顾客(数据在存储体与MDR之间传输,CPU从MDR拿到数据),写入操作则反过来,顾客先把包裹放到柜台(数据送入MDR),提供取件号(地址存入MAR),店员将包裹放到货架对应位置,MAR只保存地址信息,MDR只负责暂存数据,二者分工配合完成内存的数据读写。

这张图展示了主存储器三大组成部分以及相关基础概念,存储体是存放数据的主体,内部划分出许多存储单元,每个存储单元对应唯一地址,MAR 用来存放访问目标单元的地址,它的位数决定能够寻址多少个存储单元,比如 4 位 MAR 就能寻址 2⁴共 16 个存储单元,MDR 负责临时存放读写的数据,MDR 的位数等于存储字长,也就是单个存储单元能存放的二进制位数,图中例子里 16 位 MDR 代表一个存储单元可以存放 16bit 的数据,接着区分几组易混名词:存储元是最基础硬件元件,只能保存 1bit 二进制,多个存储元组成一个存储单元,存储单元里保存的二进制信息叫做存储字,存储字所占的位数就是存储字长,还要注意字节 Byte 固定为 8bit,和存储字长没有必然相等的关系,CPU 访问内存时先把地址送入 MAR 定位存储体中的单元,读出或写入的数据都会经过 MDR 中转,以此完成内存的数据交互。

这张图展示早期经典运算器的内部结构,核心执行单元是ALU算术逻辑单元,专门依靠电路完成加减乘除算术运算以及与或非等逻辑运算,X寄存器用来存放其中一个操作数,ACC累加器存放另一个操作数,运算结束后结果也保存在ACC里,MQ乘商寄存器主要服务于乘法、除法运算,可以和ACC互相传递数据,表格清晰标明了四则运算时各个寄存器承载的数据,加法运算中ACC存被加数、X存加数,运算和放回ACC;减法ACC存被减数、X存减数,差值存回ACC;乘法里ACC最终存放乘积高位、MQ存放乘数与乘积低位、X存放被乘数;除法时ACC存放被除数和余数,MQ存放商,X存放除数,整个运算流程就是先把参与计算的数据送入对应的寄存器,交由ALU完成运算,最终结果暂存在寄存器中等待传输到存储器。

这张图展示控制器由PC程序计数器、IR指令寄存器、CU控制单元三部分构成,PC存放着下一条将要读取指令的内存地址,并且具备自动自增的能力,顺利实现程序顺序执行,CPU依靠PC里的地址从主存取出指令送到IR暂时存放当前这条正在处理的指令,IR把指令的操作码传递给CU,CU负责解析指令并向运算器、存储器、输入输出设备发送各类控制信号,完整执行一条指令分为取指令、分析指令、执行指令三个阶段,取指阶段依靠PC提供地址取出指令存入IR,分析与执行阶段依靠IR传递指令信息、由CU生成控制信号指挥计算机各个部件完成对应的操作。

这张图完整展示计算机执行程序的完整流程,我们编写的C语言这类高级语言代码需要先经过编译器翻译为二进制机器语言指令,之后连同运算所需的数据一同装入主存,主存里每一行存储单元长度为16bit也就是存储字长,每条指令分为操作码和地址码两部分,操作码代表要执行读取、乘法、加法、保存、停机这类动作,地址码标记需要访问的主存单元地址,程序计数器PC从地址0开始依次取出指令送入IR,CU解析指令后指挥硬件一步步运算:先取出地址5的数据a放入ACC,接着根据第二条指令乘以地址6的b,随后第三条指令加上地址7的c,第四条指令把最终结果存进地址8对应的y,最后执行停机指令,整个过程充分体现冯·诺依曼存储程序思想,指令与数据共同存放在主存中,控制器循环完成取指、分析指令、执行指令,依靠运算器完成计算,实现高级代码对应的数学运算。

如图所示,初始PC存放待读取指令的内存地址,先将地址送入MAR,主存根据MAR的地址把对应指令读出送入MDR,随后MDR中的指令传送至IR存放,IR将指令里的操作码发送给CU,CU识别指令类型,同时IR里的地址码再次送入MAR去寻找需要参与运算的数据地址,主存读出数据经由MDR传输到运算器的寄存器完成算术或逻辑运算,运算结束后可把结果通过MDR写回主存,完成当前指令后PC自动更新为下一条指令地址,重复这套取指、分析、执行的循环;需要注意两处细节,一是PC自增跳转发生在取指阶段,二是区分两次访问内存,第一次取指令、第二次取操作数,不要混淆两次MAR寻址的对象。
那这里不就带出一个新问题了,就是我们取指令和第二次取操作数都是去 MAR 取,如何区分呢?

MAR只是一个单纯存放地址的中转寄存器,它本身不会区分这个地址是指令地址还是数据地址,区分依靠当前处在什么工作阶段、由控制器CU掌控时序,取指阶段,PC把指令地址送入MAR,我们访问主存读取出来的内容就当成指令,送到IR;完成取指后PC完成自增,进入执行阶段,IR拿出地址码送入MAR,此时访问主存读出的内容就当作运算用的操作数送往运算器,简单来说不是靠MAR本身标记类型,而是依靠机器所处的阶段来定义本次内存访问的目的,CU把控整个时序流程,规定什么时候MAR里放指令地址、什么时候放数据地址,两套访问内存动作在时间上错开,不会发生混淆。
鉴于这部分知识点较多,我们稍微做一个总结:

计算机硬件核心包含主存、运算器、控制器三大模块,主存由存储体、MAR地址寄存器、MDR数据寄存器组成,MAR存放访问主存的单元地址,位数决定可寻址存储单元总数,MDR暂存读写的数据,位数等于存储字长;运算器依靠ALU完成算术与逻辑运算,搭配ACC累加器、MQ乘商寄存器、通用操作数寄存器X暂存运算相关数据;控制器包含PC程序计数器、IR指令寄存器与CU控制单元,PC保存下一条指令地址且具备自增能力,IR存放当前正在执行的指令,CU解析指令并向整机发送控制信号,计算机运行遵循存储程序思想,程序与数据一同存放在主存中,启动后PC持续送出指令地址至MAR,从主存取出指令经MDR送入IR完成取指阶段,PC同步自增准备读取下一条指令,IR将操作码送入CU完成指令分析,随后CU根据指令类型控制硬件,把IR地址码送入MAR再次访问主存获取操作数送入运算器运算,不同指令执行步骤存在差异,整套取指、分析、执行的流程不断循环,驱动计算机自动完成运算任务。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)