异常处理

处理器中很多事情都会导致异常控制流,此时,程序执行的正常流程被破坏掉。异常可以由程序执行从内部产生,也可以由某个外部信号从外部产生,这里我们介绍三种内部异常:(1)halt指令(2)有非法指令和功能码组合的指令(3)取指或数据读写试图访问一个非法地址。我们把导致异常的指令称为异常指令,在一个完整的设计中,处理器遇到异常会继续调用异常处理程序。

细节问题:
1.首先,可能同时有多条指令引起异常,例如,在一个流水线操作的周期内,取指阶段中有halt指令,而数据内存会报告访存阶段中指令的地址越界。我们必须确定处理器应该向操作系统报告哪个异常,基本原则是:由流水线中最深的指令引起的异常,优先级最高。
2.当首先取出一条指令,开始执行时,导致了一个异常,而后来由于分支预测错误,取消了该指令。
3.流水线化的处理器会在不同阶段的更新系统状态的不同部分,有可能会出现这样的情况,一条指令导致了一个异常,它后面的指令在异常指令完成之前改变了部分状态。

通过在流水线结构中加入异常处理逻辑,我们既能够从各个异常中做出正确的选择,也能够避免出现由于分支预测错误取出的指令造成的异常。因此,我们在每个流水线寄存器中包括一个状态码stat。如果一条指令在其处理中于某个阶段产生了一个异常,这个状态字段就会被设置成异常的种类,异常状态和该指令的其他信息一起沿着流水线传播,直到他到达写回阶段。在此,流水线控制逻辑发现出现了异常,并停止执行。为了避免异常指令之后的指令更新任何程序员可见的状态,当处于访存或写回阶段中的指令导致异常时,流水线控制逻辑必须禁止更新条件码寄存器或是数据内存。

现在我们来回顾一下状态码stat:
AOK代表着正常操作
HLT代表遇到执行halt指令
ADR代表遇到非法地址
INS代表遇到非法指令

当流水线中有一个或多个阶段出现异常时,**异常事件不会对流水线中的指令有任何影响,除了会禁止流水线中后面的指令更新程序员可见的状态(条件码寄存器和内存)**直到异常指令到达最后的流水线阶段。因为指令到达写回阶段的顺序与他们在非流水线化的处理器中执行顺序相同,所以我们可以保证第一条遇到异常的指令会第一个到达写回阶段,此时程序会停止,流水线寄存器W中的状态码会被记录为程序状态。如果取出了某条指令,过后又取消了,那么所有关于这条指令的异常状态信息也都会被取消。所有导致异常的指令后面的指令都不能改变程序员可见的状态。携带指令的异常状态以及所有其他信息通过流水线的简单原则是处理异常的简单而可靠的机制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值