CPU 的结构和功能
文章目录
- CPU 的结构和功能
- 8.1 CPU的结构
- 8.1.1 CPU的功能
- 8.1.2 CPU结构框图
- 8.1.3 CPU的寄存器
- 8.1.4 控制单元CU和中断系统
- 8.2 指令周期
- 8.2.1 指令周期的基本概念
- 8.2.2 指令周期的数据流
- 8.3 指令流水
- 8.3.1 指令流水原理
- 8.3.2 影响流水线性能的因素
- 8.3.3 流水线性能
- 8.3.4 流水线中的多发技术
- 8.3.5 流水线结构
- 8.4 中断系统
- 8.4.1 概述
- 8.4.1.1 引发中断的因素
- 8.4.1.2 中断系统需解决的问题(功能)
- 8.4.2 中断请求标记和中断判优逻辑
- 8.4.2.1 中断请求标记
- 8.4.2.2 中断判优逻辑
- 8.4.3 中断服务程序入口地址的寻找
- 8.4.4 中断响应
- 8.4.4.1 响应中断的条件
- 8.4.4.2 响应中断的时间
- 8.4.4.3 中断隐指令
- 8.4.5 保护现场和恢复现场
- 8.4.6 中断屏蔽技术 - 多重中断
- 8.4.6.1 多重中断的概念
- 8.4.6.2 实现多重中断的条件
- 8.4.6.3 (中断)屏蔽技术
- 8.4.6.4 多重中断的断点保护
8.1 CPU的结构
8.1.1 CPU的功能
- 控制器的功能
- 取指令:把指令从内存中取出
- 分析指令:分析指令包括两部分内容:其一,分析此指令要完成什么操作,即控制器需发出什么操作命令;其二,分析参与这次操作的操作数地址,即操作数的有效地址。
- 执行指令:根据分析指令产生的“操作命令"和“操作数地址”的要求,形成操作控制信号序列(不同的指令有不同的操作控制信号序列),通过对运算器、存储器以及I/O设备的操作,执行每条指令。
- 控制程序的输入以及结果的输出
- 总线的管理
- 处理异常情况和特殊请求
- 运算器的功能:实习算术运算和逻辑运算
- CPU的功能需求:
- 具有控制程序的顺序执行(称指令控制)
- 产生完成每条指令所需的控制命令(称操作控制)
- 对各种操作加以时间上的控制(称时间控制)
- 对数据进行算术运算和逻辑运算(数据加工)
- 处理中断
8.1.2 CPU结构框图
- CPU与系统总线
8.1.3 CPU的寄存器
-
用户可见寄存器
-
通用寄存器
存放操作数,如8086系统中的AX、BX…
也可以做某种寻址方式所需要的专用寄存器。 -
数据寄存器
存放操作数,满足各种数据类型,如整型数据的寄存器、浮点数类型的寄存器…
两个寄存器拼接存放双倍字长数据,例如在乘法操作时,就将ACC与MQ拼接在一起,保存相乘后的积。 -
地址寄存器
存放地址,其位数应满足最大的地址范围。如8086系统中的段寄存器,如段基址、栈指针。
-
条件码寄存器
存放条件码,可作程序分支依据。如正、负、零、溢出、进位等。
-
-
用户不可见寄存器
-
控制寄存器
-
状态寄存器
反映指令执行结果的情况、计算机软件硬件状态。
状态寄存器和条件码寄存器类似 —— 用于存放条件码
PSW寄存器:程序状态字寄存器,用于存放程序状态字。
程序状态字:在中断或者是子程序调用过程当中,为了能够使程序正确的返回断点,返回断点后能够继续执行给定的程序,在中断或者转子程序之前,就要保存主程序的运行现场和程序断点,这些运行现场和断点包括了程序运行的软件信息和硬件信息,这些信息保存在寄存器当中,有些表示程序运行状态的寄存器可以通过指令集当中的指令进行读/写,有一些不能通过指令集中的指令进行读,因为涉及到的状态比较多,如果为每一个状态都设计一条指令来进行读,则指令集会变得非常庞大。
为了完成程序现场和程序断点的保存,就将这些软硬件状态相关的寄存器集合成一个大的寄存器,这个寄存器就是程序状态字,程序状态字比较长,有些程序状态字可以达到几千位。
可以通过交换程序状态字的方式,来完成程序现场的切换,使得程序中断当中,保存程序断点以及恢复程序断点比较容易。
-
8.1.4 控制单元CU和中断系统
-
控制单元CU
- 产生全部指令的微操作命令序列。任何一条指令,要在CPU上执行,CPU要对指令进行译码,根据这是什么样的指令,完成对应的功能,要产生完成这些功能需要的微操作命令,并且保证这些命令的顺序。
- CU有两种设计方式
- 组合逻辑设计,完全由组合逻辑硬件(硬连线逻辑)来实现,这种方式速度快,如RISC计算机控制器的实现都是采用硬连线逻辑。
- 微程序设计,采用存储逻辑进行设计,设计简单,适用于复杂功能的指令的设计。
-
中断系统
详细内容在8.4节
8.2 指令周期
8.2.1 指令周期的基本概念
-
指令周期
取出并执行一条指令所需的全部时间(解释一条指令需要的全部时间)
8.2.2 指令周期的数据流
-
取值周期的数据流
-
间址周期的数据流
-
执行周期的数据流
不同指令的执行周期的执行数据流不同。详细见第九章。
-
中断周期的数据流
8.3 指令流水
-
提高机器速度
-
提高访存速度
- 使用高性能/高速度芯片
- 使用Cache
- 使用多体并行:对多个存储体进行交叉访问,在一个存储周期当中,有多个存储体可以向CPU提供数据(CPU可以向同时取得多个存储体数据)。
-
提高I/O与主机之间的传送速度
- 程序查询方式(CPU 和 I/O 串行工作 )→ 程序中断方式 → DMA → 通道 → I/O处理机
- 使用多总线方式进行传送
-
提高运算器的速度
- 使用高性能芯片
- 改进算法
- 快速进位链
-
为了提高整机处理能力,除了使用高速部件之外,还可以改进系统结构(处理器的体系结构),开发系统的并行性。
-
-
系统的并行性
-
并行 - 时间上互相重叠
- 并发 两个或两个以上事件在同一时间段发生
- 同时两个或两个以上事件在同一时刻发生
-
并行性的等级
- 过程级(程序、进程) 粗粒度 软件实现
- 指令级ILP 细粒度 硬件实现
- (指令之间) 两条或多条指令之间,在同一时刻都处于被解释的状态
- (指令内部) 指令内部的操作、微操作之间并行的操作。
-
8.3.1 指令流水原理
8.3.2 影响流水线性能的因素
-
结构相关 —— 不同指令争用同一功能部件产生资源冲突。
-
数据相关 —— 不同指令因重叠操作,可能改变操作数的读/写访问顺序。
-
控制相关 —— 由转移指令引起
8.3.3 流水线性能
单位时间内流水线所完成的指令或者输出结果的数量。
设 m 段流水线各段时间为 Δt
-
最大吞吐率
流水线满负荷运转,没有各种阻碍流水线性能因素的影响(结构相关、数据相关、转移等)所能达到的最大的吞吐率是多少,即流水线在连续流动达到稳定状态后所获得的吞吐率。
T p m a x = 1 Δ t \mathrm{T}_{pmax} = \frac{1}{\Delta{t}} Tpmax=Δt1
-
实际吞吐率
实际上由于流水线在开始时有一段建立时间、结束时有一段排空时间以及各种相关因素使流水线无法连续流动,所以实际吞吐率总是小于最大吞吐率。
流水线满负荷运转,一段时间内,完成的指令条数n除以完成这些指令花费的时间。
T p = n m ⋅ Δ t + ( n − 1 ) ⋅ Δ t = 1 Δ t ⋅ [ 1 + m − 1 n ] = T p m a x 1 + m − 1 n \mathrm{T}_{p} = \frac{n}{{m}\cdot\Delta{t} + (n-1)\cdot\Delta{t}} = \frac{1}{\Delta{t}\cdot\left[ 1 + \frac{m-1}{n}\right]} = \frac{\mathrm{T}_{pmax}}{1 + \frac{m-1}{n}} Tp=m⋅Δt+(n−1)⋅Δtn=Δt⋅[1+nm−1]1=1+nm−1Tpmax例如 一条指令分为 m = 6 段,总共 n = 9 条指令 第一条指令花费时间是 6Δt,总共是 6 Δ t + ( 9 − 1 ) Δ t = 14 Δ t 6\Delta{t} + (9-1)\Delta{t} = 14\Delta{t} 6Δt+(9−1)Δt=14Δt 那么实际吞吐率为 9 14 Δ t \frac{9}{14 \Delta{t}} 14Δt9
仅当 n ≫ m n \gg m n≫m (n 远大于m)时,才会有 T p ≈ T p m a x \mathrm{T}_{p} \approx \mathrm{T}_{pmax} Tp≈Tpmax
lim n − m → + ∞ T p = lim n − m → + ∞ n m ⋅ Δ t + ( n − 1 ) ⋅ Δ t = T p m a x \lim_{n-m \to +\infty}\mathrm{T}_{p} = \lim_{n-m \to +\infty} \frac{n}{m\cdot\Delta{t} + (n-1)\cdot\Delta{t}} = \mathrm{T}_{pmax} n−m→+∞limTp=n−m→+∞limm⋅Δt+(n−1)⋅Δtn=Tpmax -
加速比 Sp
m段流水线采用流水线技术和不采用流水线技术两种方法速度的比值,用来衡量流水线的效果。
完成n条指令在m段流水线上共需
T = m ⋅ Δ t + ( n − 1 ) ⋅ Δ t T = {m}\cdot\Delta{t} + (n-1)\cdot\Delta{t} T=m⋅Δt+(n−1)⋅Δt
完成n条指令在等效的非流水线上共需
T ′ = n ⋅ m ⋅ Δ t T' = {n}\cdot{m}\cdot\Delta{t} T′=n⋅m⋅Δt
则加速比
S p = T ′ T = n ⋅ m ⋅ Δ t m ⋅ Δ t + ( n − 1 ) ⋅ Δ t = n ⋅ m m + ( n − 1 ) = m 1 + m − 1 n S_p = \frac{T'}{T} = \frac{{n}\cdot{m}\cdot\Delta{t}}{{m}\cdot\Delta{t} + (n-1)\cdot\Delta{t}} = \frac{{n}\cdot{m}}{m + (n-1)} = \frac{m}{1 + \frac{m-1}{n}} Sp=TT′=m⋅Δt+(n−1)⋅Δtn⋅m⋅Δt=m+(n−1)n⋅m=1+nm−1m
可以看出, 在 n ≫ m n \gg m n≫m (n 远大于m)时, Sp 接近于m, 即当流水线各段时间相等时,其最大加速比等于流水线的段数。
lim n − m → + ∞ S p = lim n − m → + ∞ n ⋅ m ⋅ Δ t m ⋅ Δ t + ( n − 1 ) ⋅ Δ t = m \lim_{n-m \to +\infty}\mathrm{S}_{p} = \lim_{n-m \to +\infty} \frac{{n}\cdot{m}\cdot\Delta{t}}{m\cdot\Delta{t} + (n-1)\cdot\Delta{t}} = m n−m→+∞limSp=n−m→+∞limm⋅Δt+(n−1)⋅Δtn⋅m⋅Δt=m -
效率 E
E = n ⋅ m ⋅ Δ t m ⋅ ( m + n − 1 ) = n m + n − 1 = S p m = T p ⋅ Δ t E = \frac{{n} \cdot {m} \cdot \Delta {t}}{{m} \cdot {(m+n-1)}} = \frac{n}{m+n-1} = \frac{S_p}{m} = T_p \cdot \Delta{t} E=m⋅(m+n−1)n⋅m⋅Δt=m+n−1n=mSp=Tp⋅Δt
8.3.4 流水线中的多发技术
-
超标量技术
-
超流水线技术
-
超长指令字技术
在数字信号处理,多媒体信号处理中,用的非常广泛,由编译程序挖掘出指令间潜在的并行性(根据计算机当中执行部件的种类和数量来决定), 另外指令之间不能有相关性,编译器找到了这些可以并行执行的指令,然后将这些指令组合成 一条具有多个操作码字段的超长指令字(可达几百位,包括多个操作码字段,多个操作数字段),这条指令被从计算机的内存中取出,多个操作码字段进行译码,多个并行的部件分别执行相应的操作。
这种方式减少了取指时间,因为每次取出多条指令 -
对比
8.3.5 流水线结构
-
指令流水线
-
运算流水线
8.4 中断系统
8.4.1 概述
8.4.1.1 引发中断的因素
8.4.1.2 中断系统需解决的问题(功能)
- 各中断源如何向CPU提出中断请求
- 有多个中断源同时提出请求怎么办
- 有中断源提出中断请求,CPU什么条件、什么时间、以什么方式响应中断
- 如何保护断点、现场
- 如何寻找中断服务程序入口地址
- 如何恢复现场、断点
- 如果在处理中断的过程当中又出现了新的中断怎么办
用软件+硬件的方式来实现中断系统需要的功能
不同的计算机对中断系统的软硬件功能的划分是不一样的主要依据于要设计的中断系统的速度、设计的复杂度和设计的灵活性这三个方面考量折中。
8.4.2 中断请求标记和中断判优逻辑
8.4.2.1 中断请求标记
每一个中断源设计一个触发器INTR,用这个触发器来标记这个中断源是否提出了中断请求,每一个中断源对应都一个中断请求标志触发器,多个中断源对应的多个中断请求标志触发器从逻辑上组成中断请求标志寄存器。
8.4.2.2 中断判优逻辑
如果有多个中断源同时提出中断请求,需要响应最重要的那个,所以要把中断源根据重要性进行分级,即中断源的优先级。用中断判优逻辑来确定在现有的的中断请求源当中哪个优先级最高,就响应哪个中断。
-
硬件实现(排队器)
在现代计算机当中,大部分CPU都是用硬件来实现中断判优逻辑
-
软件实现(程序查询)
8.4.3 中断服务程序入口地址的寻找
-
硬件向量法
硬件实现速度快,但是设计的灵活性比较低。
-
软件查询法
软件的方法显然更加灵活,如果想改变中断服务的优先级,就改变中断识别程序的顺序即可
8.4.4 中断响应
8.4.4.1 响应中断的条件
并不是中断源提出中断服务请求CPU就要立即响应,为了表示CPU是否允许响应中断请求,CPU内部有一个EINT允许中断触发器,只有EINT = 1的时候,才会响应中断请求。
CPU只能支持单重中断
单重中断在CPU执行中断服务程序的过程中不能被打断。当有新的更高优先级的中断发生时,正在执行的中断服务程序不会被暂停,转而执行新的中断服务程序。
8.4.4.2 响应中断的时间
不是任何时间
- 一般的机器CPU只有在指令执行阶段结束以后才能响应中断请求。
- 有些计算机某些指令比较复杂,执行时间可能比较长,为了能够及时处理异常事件,允许CPU在执行指令的过程中进行中断响应。通常情况下在指令执行结束之后
在指令执行时中断,破坏执行状态,需要保存的现场数据更多,而且恢复现场后还需要重新执行指令,浪费之前指令的执行时间。
8.4.4.3 中断隐指令
隐指令是指以下面的三个步骤是由硬件完成的的,并不是在某一条具体指令的驱动下完成的
隐指令并不是计算机指令集中的一条,但是在执行响应中断的时候,这些硬件操作都要进行。
CPU响应中断后,即进入中断周期。在中断周期内,CPU要自动完成一系列操作,具体如下:
-
保护程序断点
程序断点就是中断服务程序结束之后,返回的源程序要执行指令的地址,就是一个地址。
有两种办法保护断点:
- 断点存于特定地址(比如0号地址)内,这个地址是内存的一块存储单元
- 断点进栈,返回的时候出栈即可
-
寻找服务程序入口地址
有两种办法形成服务程序入口地址:
- 向量地址 → PC(硬件向量法),向量地址包含了中断服务程序的入口地址,或者跳转指令
- 中断识别程序 入口地址 M → PC(软件查询法)
-
硬件关中断
为了避免在单重中断的计算机中,在执行中断服务程序的过程中,有新的中断源发出中断请求,打断当前中断服务程序的执行。
即使在多重中断中 也要在 保护程序断点和现场的时候关中断。关中断就是将 EINT(中断允许触发器) 置为0
8.4.5 保护现场和恢复现场
-
保护现场
- 保存断点 —— 中断隐指令完成
- 保存寄存器内容 —— 中断服务程序完成 (CPU中的寄存器在执行中断服务程序的时候也会用到,这些内容在将来进行中断返回的时候主程序还要用到)
-
恢复现场 —— 中断服务程序完成
8.4.6 中断屏蔽技术 - 多重中断
8.4.6.1 多重中断的概念
CPU在执行中断服务程序的过程中,有新的中断源提出请求并且新的中断请求的优先级大于当前请求,就要进行响应
8.4.6.2 实现多重中断的条件
8.4.6.3 (中断)屏蔽技术
- 屏蔽
使用屏蔽技术,通过设置中断屏蔽字,来改变优先级,从而提高系统设计和响应的灵活性。中断屏蔽字就分散保存在中断屏蔽触发器中(硬件保存)。所有屏蔽触发器组合在一起,便构成一个屏蔽字寄存器,屏蔽字寄存器的内容即中断屏蔽字。屏蔽字与中断源的优先级别是一一对应的。
-
屏蔽字
-
屏蔽技术可改变处理优先等级
中断的优先级分为响应优先级和处理优先级:
-
响应优先级:中断响应优先级是针对同时到达的中断请求先处理谁的规定。比如A、B同时向CPU发出中断请求,而中断响应优先级是A>B,那么CPU就会先处理A,再处理B。不能改变,这是由硬件电路决定的。
-
处理优先级:处理优先级是指CPU 实际对各中断源请求的处理优先次序。如果不采用屏蔽技术,响应的优先次序就是处理的优先次序。比如A、B两个中断的中断处理优先级是B>A,如果当CPU正在处理中断请求A时,B向CPU发送了中断请求,那么CPU会先暂停处理A,转而处理B,B结束后再继续处理A。可改变,通过设置中断屏蔽字,让一些响应高优先级的中断源的请求不能参与排队来重新设置处理优先级。
-
-
新屏蔽字的设置
8.4.6.4 多重中断的断点保护
-
断点可以保存到两种地方
- 断点进栈。
- 断点存入“0”地址,此处的0打引号,并不是真正的物理地址的0地址,而是指定的一个地址
这两个都是由中断隐指令完成
-
在中断周期(也就是解释指令周期的最后一个阶段),要做以下工作
- 保存断点 0 → MAR(假设保存到到0地址,将0送到MAR)
- 命令存储器写
- PC → MDR;PC中保存着断点,将断点给MDR
- (MDR) → 存入存储器
-
在多重中断中,存在问题:后面的断点会把前面保存的断点覆盖掉
参考:
教材:计算机组成原理 (唐朔飞).pdf
博客:https://blog.csdn.net/weixin_51825055/article/details/133531876
视频:https://www.bilibili.com/video/BV1t4411e7LH?p=116&vd_source=a89593e8d33b31a56b894ca9cad33d33