内容基于中国大学MOOC的2023考研计算机组成原理课程所做的笔记。
感谢LY,他帮我做了一部分笔记。由于听的时间不一样,第四章前的内容看起来可能稍显啰嗦,后面会记得简略一些。
西电的计算机组织与体系结构课讲法和王道考研的课不太一样,要应付校内考试建议还是跟着老师学比较好。以下是20年西电计科院车向泉老师这门课的录播下载链接(请勿将录像上传到B站等网站!!):
链接:https://pan.baidu.com/s/1bFs3ajhy8ZcbHopS9izGsw
提取码:fdez
期中考试占20分,一般只考前两章内容,期末考试占60分,一般前两章内容不考,考察内容一般考前的复习课都会讲清楚,请务必认真听复习课。
其他各章节的链接如下:
中央处理器
CPU的功能和基本结构
CPU的功能
每一种操作信号对应一种微操作
运算器和控制器的功能
现代计算机当中每执行完一条指令之后,CPU都会检查是否有中断信号需要处理
运算器的基本结构
操作系统会给每一个当前正在运行的程序管理一个堆栈,记录当前运行的程序相应的一些数据,比如一些局部变量的值,还有函数返回的地址等等。而SP指明了当前运行进程的栈顶位置
虽然只画了一条线,但事实上寄存器里各个比特的数据是通过很多根线并行地送到A、B端口
R i o u t Ri_{out} Riout —— 寄存器输出控制信号, R i i n Ri_{in} Riin —— 寄存器输入控制信号
控制器的基本结构
M D R i n E MDR_{in}E MDRinE —— 从外部的数据总线输入数据的通路是否有效
M D R i n MDR_{in} MDRin —— 从CPU内部总线输入数据的通路是否有效
M D R o u t MDR_{out} MDRout —— 从MDR输出数据到CPU内部总线上
M D R o u t E MDR_{out}E MDRoutE —— 当这个信号有效时会从MDR当中输出数据到外部数据总线上
CPU的基本结构
用户可见 —— 程序员可以通过汇编语言改变某一些寄存器的值
指令执行过程
指令周期
取指令会涉及访问主存,访存很慢。把指令取到IR之后,对指令的译码是CPU内部的快速运算,比起访存只需要花费很短的时间
主频3.0GHz —— CPU每秒钟能够发出3.0G次的时钟周期,会有个3.0G个节拍
取指令的操作需要分为几个微操作执行,每个微操作需要消耗一个时钟周期
间址周期 —— 通过形式地址得到有效地址的一段时间,这段时间内也需要进行一次访存
除非此时CPU处于关中断的状态,否则正常来说每一条指令执行快结束时都会留一个周期用来检查中断信号检查是否有中断信号需要处理。比如鼠标的单击,键盘的输入这些信号就需要在中断周期进行处理
指令周期流程
控制单元通过设置几个触发器的值表示当前处于哪个周期
指令周期的数据流-取指周期
1 → R 1\to R 1→R —— 发出读信号
指令周期的数据流-间址周期
也可以直接把MDR的数据送到MAR
指令周期的数据流-执行周期
指令周期的数据流-中断周期
在实际的操作系统当中,堆栈区域通常地址空间从高到低,栈顶指针指向低地址部分
指令执行方案
单指令周期规定所有指令的指令周期长度都相同,多指令周期允许不同指令的指令周期长度不相同
数据通路的功能 单总线结构
单总线结果意味着同一时刻只能有一组部件通过总线进行数据传送
指令周期的数据流
无论执行什么指令,在指令执行的整个过程当中,数据流动只有寄存器与寄存器之间、 寄存器与主存之间、寄存器与ALU之间三种类型
数据通路
对于各种类型的寄存器无非就是两种控制信号,第一种控制信号控制数据的输入,第二种控制信号控制数据是否可以从寄存器流出。无论是数据的输入信号还是数据的输出信号都由控制器发出,这里提到的 A C C i n , A C C o u t ACC_{in},ACC_{out} ACCin,ACCout这些控制信号都和微操作信号发生器有对应的连线,微操作信号发生器发出不一样的控制信号就可以使得各个寄存器之间有数据的流动
数据通路-CPU内部单总线方式
数据传送过程中CU需要发出一些控制信号,通过发出不一样的控制信号就可以让微操作一步步执行下去
每一个微操作的执行至少要消耗一个时钟周期,每一个时钟周期内CU都会发出一组相应的控制信号来完成其中的某一个微操作,指令的执行本质上就是通过一个个微操作完成的
让 P C o u t PC_{out} PCout控制信号有效 —— 让CU与 P C o u t PC_{out} PCout相连接的这条线发出一个有效的电信号,PC的输出线路就会被导通,数据会被送到总线上
地址信息准备完成之后应该撤销刚才的两个控制信号让总线空闲
MDR和MAR与主存之间的数据通路会用专门的控制信号控制
要读的地址存放在MAR当中,通过地址总线传送给主存,事实上这个地方也应该有一个控制信号控制MAR的信息送到地址总线,只是课本里的例子没有画出这个控制信号
接下来主存根据MAR指示的地址读出相应的数据通过数据总线传送到MDR当中,现在想让MDR的这个输入通路畅通无阻,因此在这个输入通路这也会有一个控制信号 M D R i n E MDR_{in}E MDRinE控制这条通路是否接通
ALU的两个输入信号必须同时有效,而内部总线同一时刻只能传送一个输入信号,因此只能先把其中一个加数放到Y里,Y与ALU之间有一个专用的数据通路,它们之间的数据传送不会占用内部总线,另一个被加数存放在ACC里,可以通过单总线直接输送给ALU
运算结果会被输出到Z当中,当输出数据稳定之后就可以撤销刚才的两个控制信号让内部总线恢复空闲
如果系统采用双内部总线或者多内部总线,也可以不设置Y,通过另一个内部总线直接把要进行运算的操作数送给ALU
例题
(R0) 表示要进行一次间接寻址,R0里面存放这个操作数在主存当中的存储地址
数据通路 专用数据通路
但凡两个部件之间需要有数据的流动,都需要在这两个部件之间有一个专门的数据通路,因此造价成本会比较高。但是由于各个部件之间的数据传送通路都相互独立,因此如果当前执行的指令中间的某几个数据流通的过程可以并行执行,就可以让多个专用的数据通路同时工作,这样就可以提升指令的执行速度,比单总线结构效率更高
每一个部件采用专用数据通路就意味着有可能会有多个输入,到底要让哪个输入信号通过?可以连接一个多路选择器或者给每一个输入的线路都连一个三态门
专用数据通路方式
c i c_i ci指的是控制信号,当控制信号有效时就意味着它所控制的数据通路可以进行数据的流通
专用数据通路方式-取指周期
例题
ALU并不是寄存器,没有数据存储的功能。ALU想要使用的数据会被放到ACC当中
所以这个问题虽然问的是运算器和主存之间存取的数据通路,但事实上它想问的是ACC和主存之间数据存取的数据通路
ALU支持把一个输入的数据原封不动地传出
硬布线控制器设计
内容回顾
有的指令间接寻址可能会涉及多级间接寻址,间址周期会重复多次
微命令指的就是与这个微操作对应的一些控制信号
每发出一条微命令就意味着会完成一个与之对应的微操作
一个机器周期由若干个节拍组成,而每一个节拍里面可以并行地完成某一些互相不冲突的微操作
硬布线控制器
节拍发生器接收到时钟部件发来的脉冲信号之后都会选择让其中的某一根输出线导通,CU根据这些线哪根线输入了高电平信号判断当前处于第几个节拍
LDA —— 取数指令,把数据从主存取到ACC当中
硬布线控制器的设计
分析每个阶段的微操作序列
BAN X —— 当ACC里面存放的数据为负时会转移到X所指明的地址
A 0 A_0 A0 —— ACC里面的符号位
安排微操作时序的原则
安排微操作时序-取指周期
安排微操作时序-间址周期
安排微操作时序-执行周期
安排微操作时序-中断周期
组合逻辑设计
后面这几条指令可能会涉及访存操作。如果包含的地址码并没有采用间接寻址也有可能直接进入执行阶段
有可能会进行多级间接寻址,所以只有当 I N D ‾ \overline{IND} IND标志信息等于0时才意味着已经完成了最后一级的间接寻址,此时才可以进入执行周期
而如果 I N D ‾ \overline{IND} IND标志信息等于1就意味着还需要进行再下一级的间接寻址,因此接下来的一个机器周期同样还会再重复一遍间接寻址
微操作信号综合
画出逻辑图
硬布线控制器的设计
微程序控制器的基本原理
硬布线控制器的设计思路
微程序控制器的设计思路
微程序控制器的基本结构
微程序控制器的工作原理
CM中微程序段的个数至少是n+1个
微指令的设计
微程序控制器的工作原理
微指令的格式
微指令的编码方式
微指令的地址形成方式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SZaImRQh-1663675993178)( https://xdu-cslee-blog.oss-cn-hangzhou.aliyuncs.com/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20220917151718281.png)]
例题-断定方式
微程序控制单元的设计
微程序控制单元的设计
把问题简化,假设这个指令系统当中取指周期结束之后会直接进入到执行周期
微程序设计分类
Intel的处理器基本采用动态微程序设计
硬布线与微程序的比较
微程序控制器回顾
指令流水线基本概念 性能指标
指令流水的定义
指令不一定从主存取,也有可能从Cache取
操作数有可能存放在寄存器,Cache或者主存里
流水线的表示方法
流水线的性能指标
一条指令的执行被分为多个阶段,每一个阶段理论上对应一个机器周期,而一个机器周期可能包含多个节拍。这里探讨的是最理想的情况
指令流水线的影响因素和分类
机器周期的设置
IF —— Instruction Fetch
ID —— Instruction Decode
EX —— Execute
M —— Memory
WB —— Writeback
这种五段式的指令流水线是经典的MIPS架构提出的,MIPS是世界上第一个RISC处理器
为了方便指令流水线的安排,MIPS架构下所有的指令一定都是五个机器周期,即便有的指令有可能在实际运行时不需要进行中间某个阶段的处理
对于大部分RISC系统,通常都会规定每一条指令所包含的机器周期数都相同,并且每一个机器周期的长度也都相同,这样可以方便安排流水线
在各个阶段中间添加一些暂存寄存器,先把准备好的数据存放在暂存寄存器里面,下一阶段想要数据时再送出去
之前一直说从主存里取指令,但是在大多数情况下主存里当前需要使用到的指令还有数据会在Cache当中保存一个副本。Cache的命中率一般很高,所以这里IF阶段画了一个Instruction Cache,大部分情况下都可以从Cache里面直接找到现在想要的指令而不需要进行访存。后面W阶段里的Data Cache原理也类似
CPU内部的Cache会被分为两个独立的模块,Instruction Cache和Data Cache。分别专门用来存储指令和数据,对这两个模块的访问可以并行进行
如果Cache没有命中就必须去访问主存,这种情况下指令流水线会出现断流,这种复杂情况先不考虑
ID阶段除了完成指令译码的工作,还会完成取数操作,要把指令所需要用到的操作数从通用寄存器里面取出然后放到锁存器A和B里
这点和之前学习的指令不太一样,之前学习的指令如ADD X指令可以直接指明需要的操作数来自于主存。但是在RISC系统下想要进行运算的操作数一定直接来自于通用寄存器,不可能直接来自于主存,如果要来自于主存一定需要先把数据放到通用寄存器
Imm锁存器用于存立即数,因为有的指令可能使用立即寻址,可以直接从指令当中取出接下来EX阶段需要的立即数放到Imm里面
运算结果有可能需要写回主存,也有可能不需要写回主存直接写回某一个通用寄存器
影响流水线的因素
把指令和数据分别放到不同的Cache或者存储体当中
编译器负责插入空指令,每一条空指令的执行也会经过完整的五个机器周期。最底层的机器语言程序员或者汇编语言程序员也可以手动插入空指令
有关分支预测可参考:https://blog.csdn.net/hanzefeng/article/details/82893317
流水线的分类
流水线的多发技术
指令的排列由编译器确定
支持指令乱序发射的CPU可以调整指令顺序
五段式指令流水线
机器周期的设置
五段式指令流水线
运算类指令的执行过程
对于RISC系统所有的这些运算类指令运算的两个操作数一定直接来自于某一个寄存器或者是立即数,运算结果一定存回某一个寄存器而不可能直接存回主存,所以在M阶段什么也不用做
LOAD 指令的执行过程
LOAD Rd,996(Rs)
在Rs寄存器的值基础上加上996,然后将相加结果作为有效地址取出对应主存单元里存放的数据到Rd寄存器当中
每一个进程在内存里面存放的起始地址都不一样,所以当要访问这个进程里面的某一个变量时通常会采用基址寻址,用Rs寄存器指明这个进程在内存当中的起始地址,相对于起始地址往后偏移996才是想要找的数据
数据Cache没有命中才会进行访存
STORE 指令的执行过程
条件转移指令的执行过程
b —— branch eq —— equal ne —— not equal
PC不属于通用寄存器,对PC值的修改并不会放到WB阶段
无条件转移指令的执行过程
偏移量通常用补码表示
例题
多处理器基本概念
SISD
单指令流 —— CPU同一时间段内只能处理一个指令序列
单数据流 —— 每一条指令只能处理特定的一两个数据
SIMD
每一个时刻同样只能执行一条指令,但是一条指令的执行可以同时处理很多个具有相同特征的数据,对这些数据的处理都是相同的
MIMD —— 共享存储多处理器系统
所有处理器共享最低一级的Cache。 i 7 i7 i7处理器的Cache通常分为L1、L2、L3三级,L1和L2这种更高级更快的Cache专属于某一个特定的核,而L3这级的Cache被所有的核心共享