10 0.000
第 3 版 · OCR 辅助 · 原书检索 · 文字用于定位,公式与图表请回原页核验 · 本次导入快照
### 10 0.000
add
add
001
### 10 0 0 10
sub
sub
101
100011
subu
subu
100
101010
slt
slt
111
101011
sltu
sltu
110
:
⋯:⋯
:
如果仅考虑表5.6中所列部分,则可不考虑func<5:4>,因为func字段前两位总是
10。根据表5.6中列出的func<3;0>与ALUctr 之间的关系,得出ALU 控制器中输入和
输出之间的逻辑关系如下:
ALUctr<2>=!func<2>6func<1>
ALUctr<1>=func<3>8!func<2>6func<1>
ALUctr<0>=!func<3>6!func<2>6!func<0>+!func<2>6func<l>s!func<0>
根据上述逻辑关系,不难画出局部 ALU控制器的逻辑电路图。
表5.6中仅列出了5条R-型指令的编码情况,如果要实现完整的MIPS指令,则 func
字段前2位也必须考虑,ALUctr也还需用更多位数才能表示所有ALU 操作控制信号。
5.2.4时钟周期的确定
CPU执行程序的时间由3个关键因素决定:指令数目、时钟周期和CPI。其中,指令数
目由编译器和指令集决定,而时钟周期和CPI由处理器的设计与实现决定。因此,处理器
的设计与实现非常重要,它直接影响计算机的性能。单周期处理器每条指令在一个时钟周
期内完成,所以CPI为1,而时钟周期往往很长,通常取最复杂指令所用的指令周期。在给
出的11条指令中,很显然,最长的是lw指令周期。
图5.24给出了1w指令执行定时过程,从图中可以看出,lw指令周期所包含的时间为
“PC锁存延迟(Clk-to-Q)+取指令时间+寄存器取数时间+ALU延迟+存储器取数时间
十寄存器建立时间+时钟扭斜”。
第5章
149
<!-- page: 167 -->
计算机组成与系统结构(第3版)
150
CLK
PC
Rs,Rt,Rd
OP, fune·
ALUetr
旧值
Clk-to-Q
新值
旧值
旧值
取指令时间
新值
PC+4→PC。
控制单元延迟
新值
ExtOp
旧值
新值
ALUSre
旧值
新值
MemtoReg
旧值
新值
写目的寄存器
RegWr
旧值
新值
寄存器取数时间
busA
旧值
新值
扩展器和 MUX 延迟
busB
旧值
新值
ALU 延迟
Address
旧值
新值
存储器取数时间
旧值
busW
新值
图5.24 load 指令执行定时
5.3多周期处理器设计
单周期处理器时钟周期取最复杂指令所用指令周期,因而远远大于许多指令实际所需
执行时间。受时钟周期宽度的影响,单周期处理器的效率低下,性能极差。实际上,现在很
少用单周期方式设计CPU。本书介绍单周期CPU的设计实现,只是为了有助于理解实际
的多周期和流水线执行两种方式。早期处理器多采用多周期执行方式,而现代处理器则采
用流水线执行方式。
5.3.1多周期处理器设计思想
多周期处理器的基本思想如下:将每条指令的执行分成多个大致相等的阶段,每个阶
段在一个时钟周期内完成;各阶段内最多完成一次访存或一次寄存器读写或一次 ALU 操
作;各阶段的执行结果在下个时钟到来时保存到相应存储单元或稳定地保持在组合逻辑电
路中;时钟周期的宽度以最复杂阶段所用时间为准,通常取一次存储器读写的时间。
在介绍单周期处理器时,存储器被简化为理想情况,即假定每次写操作都有时钟控制,
并且在每次时钟到来时,地址、数据和写使能信号都已稳定一段时间。事实上,存储器的实
际写操作不是由时钟边沿触发的,而是一个组合逻辑电路。写操作过程为:当“写使能”信
号有效,并且写入数据和地址已稳定,则经过一个写操作时间后,数据被写入。这里,重要的
一点是地址和数据必须在“写使能”信号有效前先稳定在各自的输入端。因此,实际的存储
器在单周期数据通路中不能可靠工作,这是因为不能保证地址和数据能在“写使能”信号有
效前稳定,即地址、数据和“写使能”信号之间存在竞争(race)问题。
<!-- page: 168 -->
中央处理器
在多周期数据通路中,可通过以下方式来解决竞争问题:首先确认地址和数据在第n
周期结束时已稳定,然后,使“写使能”信号在一个周期后(即在第n+1周期)有效,并使地
址和数据在“写使能”信号无效前不改变其值。
5.3.2多周期数据通路设计
多周期处理器中,每条指令分多个阶段执行,每个阶段占一个时钟周期,称为一个状态。
因此,一条指令的执行过程由多个状态组成。在指令被译码之前,每条指令所完成的操作一
样,指令译码后不同的指令有不同的执行过程。
图5.25是加了控制信号的MIPS多周期数据通路示意图。因为PC、IR、分支目标地址
寄存器和寄存器堆只能在需要时写入新值,其他情况下不能写入,所以它们都需要有“写使
能”信号;而寄存器A和B是临时寄存器,每来一个时钟都可改变它们的值,因而无须“写使
能”控制信号。
PCWr
PCWrCond
Zero
lorDMem Wr
IRWr
RegWr
RegDst
-Overflow
ALUSelA
BrWr!PCSource
PC
CLKI
0
MUX
Adr
存储器
Du
)
IR<25:21>
IR<20:16>
IR<15:0>
IR
CLK
IR<15:0>
0
MUX
0
MUX
Ra
Da
寄存器堆
Rb
Rw
Db-
Dw
26
A
B-
16
扩展器
左移
2位
4
PC<31:28>
左移
00
2位28
MUX
0
01
MUX
10
A
Overflow
蟹
ALU
Zero
00
B
MUX
CLK
ALUctr
11
MUX0'
ALU局部
控制器
6
MemtoReg ExtOp
ALUSelB
图5.25 带控制信号的多周期数据通路
ALUop R-type
PC的来源可以是PC+4、分支目标地址和无条件跳转目标地址,由PCSource 信号控
制。分支目标地址保存在专门的“分支目标地址”寄存器中,无条件跳转目标地址由PC高4
位(即 PC<31:28>)和指令低 26位直接拼接后在低位添00(左移2位)得到。同单周期数
据通路一样,对于需要判断溢出的算术运算类指令,当发生溢出时,禁止写结果到寄存器堆。
1.取指令、指令译码/取数阶段
取指令、指令译码/取数是所有指令译码之前的公共操作,与指令译码结果没有关系。
第5章
151
<!-- page: 169 -->
计算机组成与系统结构(第 3版)
152
1)取指令状态
取指令阶段的功能是IR*-M[PC],PC-PC+4。因此,需要将 PC的值作为地址来读
存储器,并将读出指令送 IR输入端,使得下个时钟到来时,读出的指令送 IR,同时,PC将送
ALU的A口,并选择4送ALU的B口,控制ALU做不判溢出的加法操作,得到PC+4,送
PC输入端,使得下个时钟到来时,PC+4送PC。
该状态名记为IFetch,控制信号取值为:lorD=0,ALUSelA=0,ALUSelB=01,
ALUop=addu,PCSource=01,PCWr=IRWr=1,MemWr=RegWr=BrWr=R-type=0,
其余任意。
2)译码/取数状态
译码/取数阶段的功能是CU(译码)-1R<31:26>,A-R[1R<25:21>],B*-R[IR
<20:16>]。该阶段 ALU 是空闲的,所以可以利用ALU“投机”计算分支目标地址,如果
当前指令是分支指令,则可省一个时钟周期,若不是分支指令,也不会有任何影响。
分支目标地址计算方法为PC+4+(SEXT(imm16)×4),因为取指令阶段结束时已经
把 PC+4送PC输入端,所以,该阶段只要计算PC+(SEXT(imm16)×4)。
状态名记为RFetch/ID,控制信号取值为:ExtOp=1,ALUSelA=0,ALUSelB=11,
ALUOp=addu,BrWr=1,PCWr=PCWrCond=IRWr=MemWr=RegWr=R-type=0,其
余任意。
2.R-型指令运算阶段
R-型指令运算执行阶段功能为R[IR<15:11]>]-A op B。即 A、B内容分别送 ALU
的A口和B口,进行相应运算后,写入到寄存器堆中。对于R-型指令,ALU 操作控制信号
ALUetr 由局部 ALU控制器根据 func字段产生,而主控制器生成的ALUop不起作用。考
虑到寄存器堆写入时的“写使能”信号和写人数据、地址信号之间的竞争问题,该阶段要用两
个状态来完成。第一个状态先送数据、地址,第二个状态再使“写使能”信号有效。
R-型指令执行状态(记为RExec)的控制信号取值为:ALUSelA=1,ALUSelB=00,
RegDst=R-type=1,RegWr=PCWr=PCWrCond=IRWr=MemWr=BrWr=MemtoReg=0,
其余任意。
结束状态(记为RFinish)的控制信号取值为:除RegWr=1外,其余同执行状态。
3.1-型指令立即数运算阶段
I-型运算指令的执行阶段功能为R[1R<20:16>]-A op Ext([IR<15:0>])。算术
运算指令(如addiu)对立即数进行的是符号扩展,而逻辑运算指令(如ori)进行的是零扩展。
每条I-型运算指令与上述R-型指令的运算阶段一样,也分执行和结束两个状态。执行
状态中有两个信号(ALUop和ExtOp)的值会随指令不同而不同:算术运算指令的ExtOp
为1,逻辑运算指令的ExtOp为0;ALUop的取值由指令的运算类型确定,例如,ori 指令的
ALUop为or,andi指令的 ALUop 为 and,addiu指令的 ALUop 为 addu,addi 指令的
ALUop为 add等。其他信号取值如下:ALUSelA=1,ALUSelB=10,MemtoReg=
RegDst=RegWr=PCWr=PCWrCond=IRWr=MemWr=BrWr=R-type=0,其余任意。
结束状态控制信号取值除 RegWr=1外,其余信号的取值同执行状态。
例如,ori指令执行状态(记为oriExec)的控制信号取值为:ALUSelA=1,ALUSelB=
10,ALUop=or,ExtOp=MemtoReg=RegDst=RegWr=PCWr=PCWrCond=IRWr=
<!-- page: 170 -->
中央处理器
MemWr=BrWr=R-type=0,其余任意;ori指令结束状态(记为oriFinish)的各控制信号的
取值为:RegWr=1,ALUSelA=1,ALUSelB=10,ALUop=or,ExtOp= MemtoReg=
RegDst=PCWr=PCWrCond=IRWr=MemWr=BrWr=R-type=0,其余任意。
4.Iw指令执行阶段
lw指令执行阶段功能为R[IR<20:16>]-M[A+SEXT([IR<15:0>])],由以下3
个状态组成。
(1)访存地址计算状态(记为MemAdr):ALUSelA=1,ALUSelB=10,ALUOp=
addu,ExtOp=lorD=1,RegWr=PCWr=PCWrCond=IRWr=MemWr=BrWr=R-type=0,
其余任意。
(2)存储器取数状态(记为MemFetch):ExtOp、ALUSelA、ALUSelB、ALUop、lorD、
R-type 和上一个状态一样,以继续保持访存地址信号的稳定;MemtoReg=1,使数据尽早稳
定在寄存器堆的Dw输入端;RegDst=0,使地址尽早稳定在寄存器堆的Rw输入端;RegWr
=PCWr=PCWrCond=IRWr=MemWr=BrWr=0,使所有寄存器和存储器不做任何更
新;其余任意。
(3)结果写回寄存器状态(记为lwFinish):RegWr=1,使数据写入寄存器,其余信号取
值同上一个状态,以继续保持寄存器堆的Dw和Rw输入端稳定不变。
5.sw 指令执行阶段
sw指令执行阶段功能为M[A+SEXT([IR<15:0>])]-B。由访存地址计算和存储
器存数(记为swFinish)两个状态组成。第一个状态同lw 指令第一个状态,第二个状态只
要使 MemWr=1,其余控制信号不变,这样保证存储器的写入地址和写入数据在本状态中
稳定不变。
6.分支指令执行阶段
分支指令beq执行阶段的功能为if(A-B=0)then PC-分支目标地址。因此只要一
个状态即可,该状态名记为BrFinish。其控制信号取值为:ALUSelA=1,ALUSelB=00,
ALUop=subu,PCWrCond=1,PCSource=10,RegWr=PCWr=IRWr=MemWr=BrWr=R-
type=0,其余任意。
7.无条件跳转指令执行阶段
跳转指令jump执行阶段的功能为PC-跳转目标地址。因此只要一个状态即可,该状
态名记为jumpFinish。其控制信号取值为:PCSource=00,PCWr=1,RegWr=IRWr=
MemWr=BrWr=0,其余任意。
根据上述对每条指令执行过程的分析,得到一个状态转换图。图5.26 是一个支持R-型
指令、I-型运算类指令ori、lw/sw、beq和jump 指令执行的状态转换示意图,图中每个状态
用一个状态号和状态名标识,例如,0:IFetch表示第0状态,执行取指令(IFetch)操作,圆圈
中示意性地给出了该状态下部分控制信号相应的取值。
程序在图5.25所示的多周期数据通路中执行的过程就是图5.26所示的状态转换过程。
每来一个时钟,进入下一个状态。从图5.26可看出,R-型指令、I-型运算类指令和sw指令
的 CPI都为4;lw指令的CPI最大,其CPI为5;分支指令和跳转指令的CPI为3。如果不
在译码/取数阶段“投机”计算分支目标地址,则分支指令的CPI为4。
第5章
153
<!-- page: 171 -->
计算机组成与系统结构(第3版)
10:IFetch
1:RFetch/ID
2:BrFinish
154
ALUop-addu
1:PCWr, IRWr
x:PCWrCond
RegDst,⋯
ALUop=addu
1:BrWr.ExtOp
ALUSelB=li
x:RegDst,⋯
beq
jump
lw or sw
R-type
10:MemFetch
6:RExec
8:MemAdr
1:RegDst
1:ALUSelA
1:ALUSelA
ALUSelA
lorD, ExtOp
lw
lorD, ExtOp
MemtoReg
ALUSelB=00
ALUSe1B=10
ALUSe1B=10
ALUop-R-type
ALUop=addu
x:lorD,⋯
ALUop=addu
ori
4:oriExec
1:ALUSeIA
ALUSelB=10
ALUop-or
0:MemtoReg
1:ALUSeIA'
PCWrCond
PCSource=10
ALUop=subu
ALUSeIB=00,
3:jumpFinish
1:PCWr
PCSource-00
0:RegWr, IRWr,
MemWr, BrWr,
111:lwFinish
sw
9:swFinish
7:RFinish
5:oriFinish
1:ALUSelA'
lorD, ExtOp
MemtoReg, RegWr
ALUSelB-10
ALUop=addu
1:ALUSeIA
lorD, ExtOp
MemWr
ALUSelB=10
ALUop=addu
I:RegDst,
ALUSeIA, RegWr
ALUSelB-00
ALUop=R-type
x:lorD,
I:RegWr
ALUSelA
ALUSelB=10
ALUop=or
0:MemtoReg
图5.26 指令执行状态转换图
5.3.3硬连线控制器设计
由于多周期数据通路中每个指令的执行有多个周期,每个周期的控制信号取值不同,所
以,不能像设计单周期控制器那样用简单的真值表描述的方式。多周期控制器通常采用基
于有限状态机描述和微程序描述两种方式来实现。
有限状态机描述方式实现的控制器称为有限状态机控制器,其基本思想为:用一个有
限状态机描述指令执行过程,由当前状态和操作码确定下一状态,每来一个时钟发生一次状
态改变,不同状态输出不同的控制信号值,然后送到数据通路来控制指令的执行。
图5.27描述了采用这种方式实现的控制器结构,它由两部分组成:一个组合逻辑控制
组合逻辑
控制单元
输出
多周期
数据通路
输入
下一状态
指令操作码 OP
状态寄存器
CLK
图5.27 有限状态机控制器结构
<!-- page: 172 -->
中央处理器
单元和一个状态寄存器。通常用PLA电路实现组合逻辑控制单元。所以,这种控制器也称
为组合逻辑控制器或 PLA 控制器或硬连线控制器。
对于图5.26所示的状态转换图,假定每个状态号如图中所设,分别为0~11,共12个状
态,因此,状态变量要用4位,设分别为SS?S?S。考察每个状态前面的状态和指令操作码,
得到状态转换表5.7。
表 5.7 多周期控制器状态转换表
当 前 状 态
S?S?S S
指令操作码
OP?OPOP?OP?OP?OP
下 一 状 态
NS?NS?NS?NS,
2、3、5、7、9、11
0000
0
0001
1
000100(beq)
00
10
1
000010(jump)
0011
1
### 0 0 1101(ori)
0100
4
0101
1
000000(R-type)
0110
6
0111
1
100011(lw)
1000
1
### 1010 11(sw)
1000
8
101011(sw)
1001
8
100011(lw)
1010
10
1011
根据表5.7可画出用PLA电路实现的状态转换电路以及控制信号生成电路,从而实现
组合逻辑控制器,如图5.28所示。该图实现的有限状态机称为“摩尔机”,其特点是控制信
号的输出仅依赖于当前的状态,而与其他输入没关系。因此,“摩尔机”方式实现的组合逻辑
控制单元被分为两部分:由操作码和当前状态确定下一状态的电路部分和由当前状态确定
控制信号的电路部分(图5.28中由右下角虚线区域标出的部分)。
例5.1 假定多周期 CPU采用图5.25所示的数据通路和图5.28所示的控制器。若程
序中各类指令所占比例为load—22?tore—11?-型和I型运算—49?ranch-
16?ump—2单周期处理器的时钟周期为多周期处理器时钟周期的3.8倍,则多周期
处理器和单周期处理器哪个更快?大约快多少?
解:由图5.26知,图5.25所示的多周期CPU中各指令时钟周期数为load—5;Store—
4;R-型和I型运算—4;Branch—3;Jump—3,故CPI=0.22×5+0.11×4+0.49×4+0.16×
3+0.02×3=4.04。
单周期CPU的CPI为1,但时钟周期为多周期时钟宽度的3.8倍。假设单周期时钟宽
度为1,则多周期时钟周期为单周期的1/3.8,因此,多周期处理器执行时间为单周期处理器
的(4.04×1/3.8)=1.06 倍。即单周期处理器更快一些,大约快6??
第5章
155
<!-- page: 173 -->
计算机组成与系统结构(第3版)
156
beq ori Rlwswlw! SW
OP?
OP
R=000000
beq=000100
OP?-
lw=100011
OP?
sw=101011
-
OP
oni=00101
0-
OP?-
j=000010
S?
0
S?
O-
0
S?
S?
当前状态-
1
### 1 1 1 1 8
### 0 1 2 3 4 5 6 7 8 9101月
-NS
0=0000
-NS?
6=0110
1=0001 7=0111
-NS
2=0010 8=1000
-NS?
3=0011 9=1001
-PCWr
4-0100 10=1010
—lorD
5=0101 11=1011
- RegDst
图5.28 用PLA电路实现的组合逻辑控制器
5.3.4微程序控制器设计
图5.28中用有限状态机实现的硬连线控制器,其控制信号的生成速度较快,适合于
RISC这种简单、规整的指令系统。不过,由于硬连线控制器是一个多输入/多输出的巨大
逻辑网络,对于复杂指令系统来说,硬连线控制器结构庞杂,实现困难,维护不易,扩充和修
改指令相当困难。如果指令系统太复杂的话,甚至都无法用有限状态机描述。因此,对于复
杂指令系统或其中的复杂指令,大多采用微程序方式来设计控制器。
微程序控制器是M.V.Wilkes最先在1951年提出的。用微程序方式实现的控制器称
为微程序控制器,其基本思想为:仿照程序设计方法,将每条指令的执行过程用一个微程序
来表示,每个微程序由若干条微指令组成,每条微指令相当于有限状态机中的一个状态。所
有指令对应的微程序都存放在一个ROM中,这个ROM称为控制存储器(control storage,
CS),简称控存,控存中的信息称为微代码。
在微程序控制器控制下执行指令时,CPU从控存中取出每条指令对应的微程序,在时
钟信号的控制下,按照一定的顺序执行微程序中的每条微指令。通常一个时钟周期执行一
条微指令。
一条指令的功能通过执行一系列基本操作来完成,这些基本操作称为微操作。每个微
操作在相应控制信号的控制下执行,这些控制信号在微程序设计中称为微命令。例如,前面
提到的控制信号PCWr就是一个微命令,可以控制将信息写入PC。
微程序是一个微指令序列,一个微程序对应一条机器指令的功能。每条微指令是一个
0/1序列,其中包含若干个微命令,相当于控制信号,每个微命令完成一个基本运算或传送
功能。有时也将微指令字称作控制字(control word,CW)。
图5.29给出了微程序控制器的基本结构。其输入是指令和条件码(即标志信息),输出
的是微命令。图中使用了一个微程序计数器μPC,用来指出微指令在控存中的地址。每次
<!-- page: 174 -->
中央处理器
把新指令装入IR时,“起始和转移地址发生器”将根据指令内容,生成微程序入口地址放入
μPC中,以后每来一个时钟,μPC自动增值(+“1”),这样,依次从控存中读出一条条微指令
执行。μIR为微指令寄存器,存放从控存取出的微指令,每条微指令被译码后,产生一系列
微命令,送到数据通路中。机器指令的执行过程常常与条件码有关,因此微程序中也引入了
条件转移概念。微指令中的“转移控制”部分,被送到转移地址发生器,根据条件码及相应微
命令产生新的微指令地址送入μPC。
微命令
μIR
译码
个
转移控制
控制存储器
Cs
来自主存
IR
起始和转移
地址发生器
条件码
CLK-
μPC
+“1”
图5.29 微程序控制器基本结构
取指令过程是每条指令的公共操作,可以专门用一个取指令微程序来实现。因此,微程
序控制器的工作流程就是不断地执行取指令微程序和执行相应指令功能对应的微程序的
过程。
微程序由微指令组成,微程序的执行要解决与程序的执行类似的两个问题:①微指令
格式和微命令编码问题;②下条微指令地址确定问题。
为了加快指令执行速度,通常采用定长微指令字格式。与指令由操作码和地址码组成
类似,微指令由微操作码和微地址码两部分组成。微操作码格式设计主要由微命令编码方
式决定。微命令编码方式主要有不译法(直接控制法)和字段直接编码法两种,早期还有字
段间接编码法和最小(最短、垂直)编码法,现在基本不用了。
当前微指令执行结束后,必须确定下一条执行的微指令。可以通过在微指令中明显或
隐含地指定下条微指令在控存中的地址(简称下条微地址)来解决下条微指令的确定问题。
下条微指令地址的确定方式有两种:计数器法(即增量法)和断定法(即下地址字段法)。前
者通过微程序计数器μPC自动加1确定下条微指令地址,后者在微指令中增加一个下地址
字段来直接给出下条微指令地址。
微程序设计的思想给计算机控制器的设计和实现技术带来了巨大的影响。与硬连线路
设计相比,它大大降低了控制器设计的复杂性,提高了设计的标准化程度。由于机器指令的
执行过程用微程序控制,因而提供了很大的灵活性,使得设计的变更、修改以及指令系统的
扩充都成为不太困难的事情。它与传统的程序设计有许多类似之处,但是,由于微程序相对
固定,且通常不放在主存内,而是利用工作速度较高的ROM存放微程序,从而缩短微程序
的运行时间。这是一种固化了的微程序,称为固件(firmware)。
微程序控制器的主要缺点是,它比相同或相近指令系统的硬布线控制器慢。因此,
第5章
157
<!-- page: 175 -->
计算机组成与系统结构(第3版)
RISC大多采用硬连线控制器,而Intel处理器这种CISC架构则采用硬连线和微程序相结
合的方式来实现控制器。
158
5.4带异常处理的处理器设计
5.4.1CPU 对异常和中断的处理
异常和中断处理都是由硬件和软件两者协同完成的,整个中断处理包含两大阶段:①
检测和响应,由硬件完成;②具体的处理过程,由软件完成。硬件检测到异常和中断请求
后,就会立即进行响应,而响应的结果就是中断当前程序的执行,然后转到异常处理程序或
中断服务程序(本书将两者统称为异常/中断处理程序)执行。
中断和异常处理过程如图5.30所示,图中反映了从CPU检测到发生异常或中断事件,
到CPU 改变指令执行控制流而转到操作系统中的异常或中断处理程序执行,再到从异常
或中断处理程序返回用户进程执行的过程。
用户进程
异常或
中断事件
第涤指令
第i+1条指令
·返回到当前指令
·返回到下条指令
·终止
os
异常/中断
处理程序
图5.30 异常和中断处理过程
从图5.30可看出,异常和中断处理大致过程如下:当CPU在执行当前程序或任务(即
用户进程)的第i条指令时,若检测到一个异常事件,或在执行第i条指令后发现有一个中
断请求信号,则CPU会中断当前程序的执行,跳转到操作系统中相应的异常/中断处理程
序去执行。若异常/中断处理程序能够解决相应问题,则在异常/中断处理程序的最后,
CPU通过执行“异常/中断返回指令”回到被打断的用户进程的第i条指令或第i+1条指令
继续执行;若异常/中断处理程序发现是不可恢复的致命错误,则终止用户进程。通常情况
下,对于异常和中断事件的具体处理过程全部由操作系统软件来完成。
CPU执行每条指令的过程中,都会对异常事件和中断请求进行检测,例如,在指令译码
时会检测指令操作码是否合法;在取指令或取数据时,会检测是否发生了缺页或访问越权等
存储保护错;执行整数除法指令时,会检测除数是否为0;在每条指令执行结束时,会检测有
没有中断请求。
一旦CPU检测到有异常事件或中断请求,就会进入异常/中断响应过程。在此过程中,
CPU完成以下两个任务:保护断点和程序状态、识别异常/中断类型并转相应处理程序执行。
1.保护断点和程序状态
对于不同的异常事件,其返回地址(即断点)不同。例如,在4.2.8节中提到,故障的断
点是发生故障的当前指令的地址;自陷的断点则是自陷指令后面一条指令的地址。显然,断
<!-- page: 176 -->
中央处理器
点的值由异常类型和发生异常时PC的值决定。例如,对于图5.25所示的多周期数据通路,
如果在执行lw/sw指令时发生“缺页”异常,则说明需要读写的数据所在的页面不在主存,
需要操作系统内核程序进行相应处理,以便将所需页面调入内存,缺页处理结束后,显然应
该回到发生缺页的指令重新执行一遍,因而其断点值应该是当前PC值减4。因为,在发现
缺页时,已在取指令状态执行了PC+4,所以,PC必须减4才能保证缺页异常处理返回后重
新执行lw/sw指令。
为了能在异常处理后正确返回到原被中断程序继续执行,数据通路必须能正确计算断
点值。假定计算出的断点值存放在PC中,则保护断点时,只要将PC内容送到栈或特定寄
存器中保存即可。
为了能够支持异常和中断的嵌套处理,大多数处理器将断点保存在栈中,如IA-32 处理
器的断点被保存在栈中。如果系统不支持多重中断嵌套处理,则可以将断点保存在特定寄
存器中,而无须送栈中保存,如MIPS处理器用EPC寄存器专门存放断点。
因为异常处理后可能还要回到原来被中断的程序继续执行,所以,被中断时原程序的状
态(如产生的各种标志信息、允许自陷标志等)都必须保存起来。通常每个正在运行程序的
状态信息存放在一个专门的寄存器中,这个专门寄存器统称为程序状态字寄存器(PSWR),
存放在PSWR中的信息称为程序状态字(program status word,PSW)。在IA-32 架构中,
程序状态字寄存器就是标志寄存器 EFLAGS。与断点一样,PSW也要被保存到栈或特定
寄存器中,在异常返回时,将保存的 PSW恢复到 PSWR中。
2.识别异常事件并转异常处理
在调出异常/中断处理程序之前,必须知道发生了什么异常或中断。一般来说,内部异
常事件和外部中断源的识别方式不同,大多数处理器会将两者分开来处理。内部异常事件
的识别大多采用软件识别方式,而外部中断源则可以采用软件识别或硬件识别方式。
软件识别方式是指,CPU设置一个异常状态寄存器,用于记录异常原因。操作系统使
用一个统一的异常查询程序,该程序按一定的优先级顺序查询异常状态寄存器,先查询到的
异常先被处理。例如,MIPS就采用软件识别方式,CPU中有一个 cause 寄存器,位于地址
0×8000 0180处有一个专门的异常查询程序,它通过查询 cause寄存器来检测异常类型,然
后转到内核中相应的异常处理程序进行具体的处理。
因为像故障和陷阱之类的内部异常通常是在执行某条指令时发现的,可以通过对指令
执行过程中某些条件的判断来发现是否发生了异常,而且一旦发现可以马上进行处理,所
以,内部异常事件也可以不通过专门的查询程序来识别,而在发现异常时直接得到异常类
型,根据类型号转到相应的异常处理程序执行。IA-32的处理方式就是这样。
由于外部中断的发生与CPU正在执行的指令没有必然联系,相对于指令来说,外部中
断是随机的、与当前执行指令无关,所以,并不能根据指令执行过程中的某些现象来判断是
否发生了中断请求。因此,对于外部中断,只能在每条指令执行完后、取下条指令之前去查
询是否有中断请求。通常 CPU通过采样对应的中断请求引脚来进行查询,如果发现中断
请求信号有效,则说明有中断请求,但是到底是哪个中断源发出的请求,还需要进一步识别。
有关外部中断源的响应、识别和中断处理程序的结构等内容,在第8章中将详细介绍。
假定在执行中断处理程序时,又发生了新的中断,怎么办?在发现中断并转到中断处理
程序的过程中,若在保存正在运行程序的现场时又发生新的中断,那么,就会因为要处理新
第5章
159
<!-- page: 177 -->
计算机组成与系统结构(第3版)
160
的中断,进而把原来进程的现场、返回的断点和程序状态等破坏掉,因此,应该有一种机制来
“禁止”在响应并处理中断时再响应新的中断。通常通过设置中断允许位来实现。当中断允
许位置1,则为“开中断”状态,表示允许响应中断;若中断允许位清0,则为“关中断”状态,表
示不允许响应中断。
5.4.2带异常处理的数据通路设计
异常和中断处理是处理器设计中最具挑战性的任务之一,为了说明 CPU如何处理异
常和中断,本书以 MIPS 为例简单说明带异常处理的数据通路的设计。
为简单起见,MIPS中的断点信息保存到一个特殊的32 位寄存器 EPC中。写入 EPC
的断点值可能是正在执行中的异常指令的地址(故障时),也可能是异常指令的下条指令的
地址(自陷时)。前者需要把PC的值减4后送到 EPC,后者则直接将 PC送 EPC。
MIPS采用软件识别方式,用一个专门的32位寄存器(cause)来记录异常原因,异常查
询程序的入口地址为0x8000 0180,该异常查询程序将根据 cause的值判断发生了何种异
常,然后根据异常类型控制转到相应的异常处理程序执行。
假定处理器能处理的异常类型有两种:非法操作码(cause=0)和溢出(cause=1),则在
图5.25的多周期数据通路中加入相应的异常处理后,得到如图5.31所示的带异常处理多周
期数据通路。其中右部加黑加粗部件是与异常处理相关的部分。
PCWr
PCWrCond
Zero
lorD MemWr
1RWr
RegWr:
RegDst
—Overflow
ALUSelA
EPCWr
BrWr PCSource
PC
CLK
0
MUX
Adr
存储器D
IR<25:21>
IR<20:16>
IR<15:0>
IR
CLK
IR<15:0>
26
0
MUX
0
MUX
Ra
Da
寄存器堆
Rb
Rw
Db
Dw
B
16
扩展器
左移”
2位
4
+PC<3L28-
左移
00
28
2位
01
0