第十一章:异常相关指令的实现
本章是实现教学版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修改译码阶段