系列文章目录
第八章 CPU的结构和功能
一、CPU的结构
1.1 CPU功能
运算器和控制器叫CPU
运算器可以实现算术运算,还有逻辑运算
取指令:指令控制
分析指令、执行指令:操作控制
执行指令需要顺序:时间控制
对程序的输入输出,处理异常情况特殊请求:处理中断
运算器:数据加工
二、 CPU结构框图
PC下一条指令,IR指令寄存器存现在指令
CU操作时序,操作顺序,控制在给定的时间给出指定的操作
ALU完成数据加工
处理中断:中断系统支持
CPU视角:地址总线只出
数据总线双向,读数据写数据
控制总线有进有出,CPU通过控制总线向各个部件发出命令,外部设备提出的请求以及外部设备的状态通过控制总线向CPU传输
地址总线是单向的,将地址发送给内存或者外部设备的接口
注意这里是AR和DR,其实就是MAR和MDR,考试中将他们算入CPU
1.3 CPU的寄存器
1.3.1 用户可见寄存器(是否可见,第一种分类方法)
两个寄存器拼接:ACC寄存器和MQ寄存器
1.3.2 用户不可见寄存器
很多,比如流水线中的流水段寄存器都是用户不可见的
MAR,MDR,IR就是用户不可见的
1.3.3 控制和状态寄存器 (第二种分法)
PC先送MAR主存地址寄存器,将包含的地址发送给主存储器(此时控制单元发出读命令)
读出的指令放在MDR中,进一步放到IR(指令寄存器)中
M不是寄存器,其他都是寄存器,用户不可见是用户不能进行更改的 而PC寄存器可以修改
程序状态字很长,在执行中断程序的时候还要调用子程序的时候,需要保存断点,维护现场,这程序状态放在程序状态字中可能需要几千字,他是把很多软硬件寄存器集成为一个大的寄存器
PSW寄存器:Program Status Word
1.4 8086 32位指令系统
二、控制单元CU和中断系统
组合逻辑设计:硬连线逻辑(RISC)——速度快
微程序设计:存储代码(CISC)
CU:产生全部指令的微操作命令序列(注意这个所谓的序列是有时序要求的!!!)
三、指令周期
3.1 基本概念
指令周期:包括取指分析执行等过程,是一条指令所需要的全部时间
取指、分析:将指令取到IR寄存器,然后分析操作码,确定寻址方式(把指令从内存取出送到CPU)
执行指令:完成指令要求的所有运算(操作码送到CU,CU确定如何执行;取操作数,执行,结果写回)
大部分的指令,执行周期大于取指周期
3.2 不同指令有不同的指令周期
ADD mem 指令再执行周期,访问一次存储器并执行加法运算然后存储到ACC中,主要时间也是访存一次的时间,取指周期和执行周期时间基本一致
而乘法指令的执行周期一般因为多次访存,因此更长
3.3 具有间接寻址的指令周期和中断周期
间接寻址访存多次需要时间
取指周期是取指令,间址周期是取操作数地址,执行周期是取操作数并进行相应运算
中断周期在执行周期之后,确认是否由中断请求需要处理,响应中断,保存断点,形成中断服务程序入口地址,要实现硬件关中断
3.4 周期流程
这里假设有中断周期
3.5 CPU工作周期的标志
用锁存器存储状态
控制器在指令不同周期发出不同的控制命令,即使是对同一个器件进行操作,不同周期阶段可能也是不同的
比如下面的四个指令,第一个指令取地址,送IR寄存器
第二个取操作数的地址,送IR或者MDR地址部分
第三个是取操作数送寄存器
第四个是将程序断点保存在特定的内存地址中
区分四个周期的方法:用四个D触发器,是哪一个就传1
四、指令周期的数据流
4.1 取值周期数据流
注意这里PC必须要+1,考试可能会考!!!!!!!!
PC+1->PC PC自增!!!!!!
顺序是:
PC->MAR->地址总线->存储器
CU(控制读命令)->控制总线 进行读操作 -> 存储器 -> 数据总线 -> MDR -> 指令存IR
4.2 间址指令取值数据流
此时,上一次取的地址在IR中有,MDR中也有
首先我们要先找到保存操作数的地址的内存单元的地址,这个地址在此时的MDR或者IR中,我们这里是MDR为例
MDR ->地址码部分送 MAR 准备进行内存访问 ->地址总线 -> 存储器
CU 发出读操作 -> 控制总线 -> 存储器 读操作->数据总线 -> MDR 此时的MDR就是真正的操作数的地址
4.3 执行周期数据流
因为不同指令的执行周期差别很大,这里暂且不做介绍,留到第九章
4.4 中断周期数据流
保存程序断点,保存在某个内存单元地址 、形成中断处理程序的入口、硬件关中断 (下面数据流主要展示前两部分)
首先保存断点到一个内存单元地址,为什么这个地址从CU出来?
CU处存储的是SP指针,栈顶地址;但是不一定都是栈顶地址,不同的CPU可能是不同的设置,可能是0号地址(特定地址)
保存断点,重新对PC进行赋值
CU -> MAR -> 地址总线 -> 存储器 (选中存储单元)
CU 写命令 -> 控制总线 -> 存储器 (准备好写在哪里,准备把断点PC的值写在这个单元中)
PC -> MDR -> 数据总线 -> 存储器
-----保存断点结束,下面形成中断处理程序入口----
中断程序入口地址是由CU给出的,CU直接把这个值写到PC中,让程序下一条指令执行
五、指令流水
5.1 如何提高访存速度
多体并行:CPU一个存储周期中可以访问多个存储体
中断方式:可以让CPU和外部设备部分时间进行并行
通道方式: 特殊的IO处理机,与CPU共享内存。CPU把指令传给通道,由通道对内存进行操作,CPU可继续其他工作
I/O 通道是指专门负责输入/输出的处理机。
I/O通道方式是DMA方式的发展,它可以进一步 减少CPU的干预,即把一个数据块的读(或写)为单位的干预减少为对一组数据块的读(或写)及有关的控制和管理为单位的干预。同时,可以实现CPU、通道、I/O设备的并行操作,提高资源利用率。
5.2 并行性的等级
并行和并发!!!
粗粒度是硬件实现,细粒度是软件实现
并发是交替发生的,在一个小的时间片上轮流使用,这段时间有多个进程在运行,对用户来说每个进程都在执行
同时是任意一个时间点两个时间都在发生
流水线就是同时的一种
指令级的并行(指令之间或者是指令内部的操作),被称为ILP
5.3 指令的流水原理
这里假设每个指令只有取指阶段和执行阶段
5.4 影响指令流水效率加倍的因素
但是很多指令的执行周期比取指周期长不少,所以不能像上面那样完全重叠
因此这里引入指令部件缓冲区,取出来的指令在这里缓存,执行部件空闲就去缓冲区取指令
直接转移指令在译码阶段就可以确定下一条指令地址,但是条件转移指令则需要等指令完成后才能确定
5.5 指令的六级流水的例子
5.5.1 没有冲突
六级的功能:FI取指令 DI指令译码 CO形成操作数地址 FO取操作数 EI执行 WO 结果写回
m级流水,n条指令
总时间是m-1+n
m-1是填充指令
5.5.2 结构相关影响流水 (这里主要展示了存储器冲突,不过也可以是寄存器/运算器)
结构相关:两个或两个以上的功能部件争用同一个功能部件
问题:
FI和FO功能一个取指令一个取操作数,都要用到内存单元
WO FO和FI功能,因为WO是写回功能,也要用到内存单元,因此也是结构相关,发生资源冲突
解决方案:
- 停顿,也叫加入气泡,比如指令4的FI可以等待一个周期
- 取指令跟取数据分隔开,一半只装存储器一半只存数据存储器,各自有各自存储器
- 指令预取技术,如果取指周期比较短,取指部件可以把多条指令取出来放到指令缓存队列中。可以指令预取技术,可以一次存储多个指令,下一次取指令不需要再去访存取指令
5.5.3 数据相关影响流水
写后写相关,MUL时间比SUB时间长,因此最后存储的是乘法的结果
解决方法:后推法(推后读/推后写),采用旁路技术(定向技术)
后推法是将数据相关的操作后推,这个方法有时间损失,比如下面写后读的例子,让第一条指令先写入R1,写完了再读
旁路技术是不等写入R1,一旦运算器输出端生成以后,直接送到第二条指令运算器进行运算,节约时间
注意考试的时候说的是正常按序流水线还是非按序的
这里要注意是从CC3的寄存器直接传输到第三条指令的线是不可以的,可能第二行有相关修改
这里就是旁路技术
5.5.4 控制相关影响流水(转移指令引发的)
指令三需要进行跳转,执行到指令三的EI,PC被改写,这个时候才知道转移条件是否成立,下一个节拍重新填充流水线
在第三条指令的EI之后,才知道转移到指令15,进行流水线重新填充。3和15中间被浪费的就是转移损失,延迟了几个节拍是转移损失
5.6 流水线性能
5.6.1 吞吐率
5.6.2 加速比(写出使用流水这种方法的效果,是否采用某种技术后采用后的速度比)
没有采用流水线的时间比上采用流水线的时间
加速比一般大于1,因此一般分子是串行时间
5.6.3 效率
流水线一定有建立时间和排空时间
实际上是图中的面积的比值
每一条数字相同的斜线是一个指令的工作时间
5.7 流水线加速
5.7.1 超标量技术
IF 取指 ID译码 EX 执行 WR写回
多条流水线,几条指令同时进入不同的流水线中进行解释——超标量技术
三个绑一起同时送入流水线,这里需要通过编译优化技术把可并行执行的指令搭配起来,让他们同时进入三条流水线
5.7.2 超流水线技术
关键技术: 因为流水线每个周期后面需要锁存器进行保存结果作为下一流水段执行时候的操作信号,控制信号或者是操作的数据。而超流水线技术的一个流水段等分三份,三份之间没有锁存器,不同指令处于同一流水段中,相互之间信号不能叠加
相当于对节拍进行细分,不能调整指令顺序,等价于频率更高
流水线最大吞吐率变为原来三倍
5.7.3 超长指令字技术
超长指令字可能有多个操作码多个操作数,多个操作码字段进行译码,多个并行的部件同时去执行响应功能
一次取值,取一个超长的指令,一个指令中有多个操作。所以取值和译码都是同时的,然后多个操作一起进行。
取址时间减少,一次可以取很多指令
跟超流水线对比一下,超流水线是每个功能部件都有多份,而超长指令字技术只是有多份处理部件,其他功能部件还是一份
5.8 流水线结构
取指令部件
指令译码部件
地址形成部件
取操作数部件
操作执行部件
写回结果部件
流水段之间一定要加上锁存器,锁存器要保存前面流水段的操作结果,为下一个流水段提供操作数据操作信号
运算比较复杂,可以通过流水线方式加速运算
希望分的各段执行时间相等,否则就要等最慢的
六、中断系统
中断用途:输入输出,程序调试,计算机系统发生异常事件
故障:指令引起的异常,分为可恢复和不可恢复
自陷:事先安排的异常,陷阱指令
终止:使CPU无法继续执行的硬件故障,与具体指令无关
6.1 内部异常
6.2 外部中断
IE/IF如果清零,任何中断控制的请求是不被响应的
注意可屏蔽的和不可屏蔽的中断源,都是外部中断
6.3 中断系统需解决的问题
INTR提出请求
同时请求有排队
总开关打开,一条指令执行周期结束的时候,中断隐指令和中断服务程序实现
保存当前断点(PC),其他寄存器,特定位置(0号地址)
硬件实现(中断向量,硬件实现中断向量) 中断识别程序(软件)
恢复现场弹栈的过程,多重和单重的返回不一样,多重是通过转存然后间接寻址的方式进行,单重返回是正常
新的中断出现根据屏蔽字判断优先级,需要提前地开中断
6.3.1 中断请求标记和中断判优逻辑(如何提出中断和同时请求怎么办)
如何提出中断呢?一个中断源会对应一个INTR中断请求标记
多个INTR组成一个中断请求标记寄存器
可能分散也可能集中在CPU内
INTR——中断请求触发器,用来登记中断源发出的随机性中断请求信号,以便为CPU查询中断及中断排队判优线路提供稳定的中断请求信号。
EINT——中断允许触发器,CPU中的中断总开关。当EINT=1时,表示允许中断(开中断),当EINT=0时,表示禁止中断(关中断)。其状态可由开、关中断等指令设置。
INT——中断标记触发器,控制器时序系统中周期状态分配电路的一部分,表示中断周期标记。当INT=1时,进入中断周期,执行中断隐指令的操作。
排队器的硬件构成
I
N
T
R
1
INTR_1
INTR1若是1,那么2.3.4则与门输出一定为0
这个需要在设计CPU的时候就确定先后优先级
I
N
T
R
2
INTR_2
INTR2为1时,后面不会响应
6.3.2 如何寻找中断服务程序入口地址
排队器的输出只有一个1,高优先级的无请求,低优先级的有请求也是0
中断服务程序入口地址的查询:
- 中断向量地址的存储单元中存放一个跳转指令,跳转到入口地址
- 或者是直接把入口地址保存在中断向量对应的存储单元,将地址取来放到PC直接运行
速度快但是灵活性比较低
SKP是“跳过”的指令,这是一个跳转指令
SKP这条指令是指如果中断源请求了中断,D=0,跳过下一条指令,即跳过进入服务程序的这条指令
若为1,则顺序执行下一条,进行跳转
更加灵活,可以调整响应顺序
软件查询法比硬件向量法更慢
6.3.3 CPU响应中断的时间与条件
(假如CPU只能支持单重中断)
也就是不允许中断处理程序运行时候有别的中断请求
而多重中断是允许的,允许更高级别的中断
用于表示CPU此时是否允许响应中断请求:
中断允许触发器,CPU中的中断总开关,EINT是总开关,为0的时候中断就进不来了,1的时候可以响应
CPU在执行周期结束后给每一个中断源发送查询信号,送到查询中断触发器,查询信号驱动中断请求触发器置1
然后把中断信号发送给排队电路
6.3.4 中断隐指令(断点保存,生成中断服务程序入口地址,关中断 三个操作都是由计算机硬件完成的,并不是某一个具体指令驱动下完成的,并不是指令集中的某一个指令)
保护程序断点有两种,不同的CPU不同,有的是断点存于特定地址,有的是进栈保存
中断隐指令是以下三步完成的
关中断:单重中断的CPU不允许其他中断干扰,就算是多重中断也需要在保存断点现场的时候关中断
INT表示CPU正在执行某一个中断
INT中断标记
EINT中断允许触发器,它的输出需要是1,然后排队器中至少有一个1,那么输入的S端是0,
对应SET结果Q为1,然后EINT的R端口置0。那么INT输出为1,EINT输出为0,此时在中断周期并且关中断!
(SR锁存器相关的内容不做重点,理解即可)
排队器连向量地址形成部件,然后送PC,为执行中断服务程序做准备
6.3.5 中断服务程序(与中断隐指令区分开,保护寄存器内容并恢复现场)
IRET指令,中断返回恢复PC的值,进入到中断指令的下一条指令的地址
中断隐指令完成断点保护,但是寄存器内容它不能自行决定,需要中断服务程序进行设置寄存器内容
中断返回是一个返回跳转
6.3.6 中断屏蔽技术 多重中断(执行中断服务程序过程中出现了更重要的新事件,此时对应多重中断CPU的假设)屏蔽字可以改变处理优先级但不能改变响应优先级
右图是三次中断,后一次的中断时比上一次中断优先级更高
所谓的程序断点是被中断后的下一条指令:k+1 l+1 m+1
高速设备比低速设备快,占用时间短,因此优先级高
计算机希望先处理输入设备
单重:开中断,中断返回,继续主程序的运行,可以进行下一次中断
多重:先打开中断,因此在设备服务的时候,由于屏蔽字的存在,只会有更高优先级的中断源才能打断当前中断程序
C执行的时候,来了D的中断信号,因为D更低级,因此不会被干扰
需要注意的是,CPU只有在一条指令执行周期结束的时候才会处理、因此当BC一起来的时候按顺序进行中断程序的时候
B结束了,C会在中断程序结束返回主程序并执行一个指令后,在其执行周期结束后才能进行下一次中断
多重中断实现需要提前开中断,在中断服务程序保护现场后就能让优先级更高的中断请求进来
高优先级的中断源可以中断低优先级的
通过设置中断屏蔽字,改变中断源的优先级,更加灵活
INTR——中断请求寄存器
MASK——中断屏蔽触发器 0表示没有屏蔽,1表示屏蔽 (但是这里的输出是非)
D——完成触发器,表示设备已完成工作,向CPU提出中断请求
D触发器为1,MASK触发器非端也是1,这样到INTR处的输入是1,表示提出中断请求并且没有被屏蔽
在右边的图中也是MASK取非后接入,要是屏蔽的话这个非的信号是0
屏蔽字的设置是把比他高的设置0,表示优先级更高的可以提出中断请求
自己和比自己低的设置1,表示屏蔽与自己一样的中断信号已经更低级的中断信号
新屏蔽字,A屏蔽所有,B只能屏蔽自己,最低
A>D>C>B
响应优先级由硬件决定,也就是原屏蔽字,响应的时候还是按照ABCD的顺序进行响应,但是如果屏蔽字被修改后,也还是先响应B执行多条指令(保护现场关中断等操作,在开中断后再执行一条指令,因此是多条指令)结束的时候查询到C和D的请求。
屏蔽字只能改变处理优先级但是无法改变响应优先级
响应优先级和执行优先级一致。原程序的屏蔽字是全0,根据优先级响应优先级先响应A,中断屏蔽字设置为全1,然后继续
注意这里的小空隙时需要在主程序执行一条指令。
先响应A,A进入后屏蔽字全1,因此进入A的处理程序然后返回主程序,屏蔽字变为主程序全0屏蔽字
因为屏蔽字为0,BCD都可以进行进入排队器,B的响应优先级最高,屏蔽字0100,对C和D都开放,C和D都可以提出服务中断请求,并且能够进入排队器,C的响应优先级更高,响应C,中断屏蔽字改为0110,D还会发出中断请求,进入排队器,进入D的中断服务程序。
D处理完返回C,C处理完返回B
响应中断不可改变,B完成了保护现场设置屏蔽字开中断,发现有更高的优先级的中断源来
进入C,同样也因为同样的原因进入D中断。D处理完了直接进入C的中断
、
注意恢复屏蔽字,恢复的时上一级的对应屏蔽字,比如可能是低级的中断。恢复屏蔽字、恢复现场的时候不能被打断,因此恢复现场还要先关中断再开中断,防止中断的来临让现场恢复执行一半
恢复屏蔽字往往是在关中断的时间设置的
“0”地址不一定是零地址,可能是特定地址或者寄存器
如果断点被改写或者覆盖,比如三次中断,零地址只剩下最后一次的中断的地址
需要对之前两次进行额外操作进行保存
PC存储的下一条指令,就是存储的断点
0号地址存程序断点
5号地址存的是跳转到服务程序入口的跳转指令,因此是向量地址。5就是中断向量形成部件形成的地址
保存现场:SAVE中是寄存器ACC中的内容,是当前程序所需要的数据(后面还有别的寄存器保护)
LDA 0 :把地址0中的断点数据2存放到(已经腾出来的)ACC中,此时ACC中是上一层的程序断点
STA RETURN:将刚才的0号地址也就是现在ACC的值放到RETURN里面,完成0号地址内容转存。
ENI:开中断
LDA SAVE: 恢复现场,将SAVE的内容取出来送回ACC
JMP @RETURN 间址返回,返回RETURN地址中保存的地址对应位置,也就是回到上一层的断点位置,送回PC
0号地址转存到return处,下一次中断保存断点的时候仍然保存在0号地址,这样不会覆盖上一次的断点
注意设置屏蔽字和恢复屏蔽字的位置!
一个在开中断之前,保护现场之后
一个在间接寻址,返回断点之前