《自己动手写CPU》第十一章-学习笔记

第十一章:异常相关指令的实现

本章是实现教学版OpenMIPS处理器的最后一步,将实现异常相关指令。

11.1MIPS32架构中定义的异常类型

在MIPS32架构中,有一些事件要倒短程序的正常执行流程,这些时间有中断陷阱、系统调用以及其他任何可以打断程序正常执行流程的情况,统称为异常。

 11.2精确异常

在MIPS32的文档中经常会读到“精确异常”这个术语,OpenMIPS的实现蓝图中也设计为实现精确异常,本节将介绍精确异常的相关概念。

当一个异常发生后,系统的顺序执行会被打断,此时有若干条指令处于流水线上的不同阶段,处理器会转移到异常处理议程,异常处理结束后返回原程序继续执行,因为不希望异常处理例程破坏原程序的正常执行,所以对于异常发生时,流水线上没有执行完的指令,必须记住它处于流水线的哪一个阶段,以便异常处理结束后能恢复执行,这便是精确异常。

对于一个实现精确异常的处理器,在异常发生时,都会有一个被异常打断的指令,称为异常受害者,也可称为发生异常的指令,该指令前面的所有指令都要被执行到流水线的最后一个阶段,也就是正常执行完成,但是该指令及该指令之后的指令都要被取消,就像从来没有执行过一样。为了实现精确异常,必须要求异常发生的顺序与指令的顺序相同,在非流水线的处理器上,这一点是显然的,但是对于拥有流水线的处理器,就会有些复杂。在流水线处理器上,异常会在流水线的不同阶段发生,带来潜在的问题。

在流水线处理器中,异常发生的顺序与指令的顺序不一定相同。为了避免这一情况,先发生的异常并不立即处理,异常事件只是被标记,并继续运行流水线。在大多数处理器中,会设计一个特殊的流水线阶段,专门用于处理异常。如果某一条指令的异常事件捣打料流水线的这个阶段,那么就会进行异常处理,并且当前处于流水线其余阶段的指令的异常事件都会被忽略。

11.3异常处理过程

 

 

 11.4异常相关指令介绍

11.4.1自陷指令

   自陷指令有12条,按照指令中是否包含立即数、可以分为两类

1.不包含立即数的自陷指令

 

 

2.包含立即数的自陷指令 

 

 11.4.2系统调用指令syscall

 11.4.3异常返回指令eret

 11.5异常处理实现思路

 11.5.1实现思路

OpenMIPS异常处理的实现思路是:在流水线的各个阶段收集异常信息,并传递到流水线访存阶段,在访存阶段统一处理异常信息。流水线各个阶段需要收集的异常信息如下。

--在流水线译码阶段判断是否有系统调用异常,是否是返回指令、无效指令。

--在流水线执行阶段判断是否有自陷异常、溢出异常

--在流水线访存阶段检查是否有中断发生。

 11.5.2修改数据流图

在访存阶段增加了异常判断模块,主要作用是依据从译码、执行阶段传递过来的信息,以及CP0中寄存器的值,判断是否要处理异常,如果要处理异常,那么按照异常类型给出新的指令地址送入PC。

 11.5.3修改系统结构

添加部分接口。

 11.6修改OpenMIPS以实现异常处理

11.6.1修改取指阶段

1.修改PC模块

 2.修改IF/ID模块

 

 11.6.2修改译码阶段

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值