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

文章目录[隐藏]

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

在MIPS32架构中,有一些事件要打断程序的正常执行流程,这些事件有中断(Interrupt)、陷阱(Trap)、系统调用(System Call)以及其他任何可以打断程序正常执行流程的情况,统称为异常。异常类型及其优先级如表所示。

在这里插入图片描述在这里插入图片描述 OpenMIPS处理器只实现对其中6种异常情况的处理,列举如下:

  • 硬件复位
  • 中断(包含软中断、硬中断)
  • syscall系统调用
  • 无效指令
  • 溢出
  • 自陷指令引发的异常
    异常发生后,会进入异常处理例程进行具体的异常处理,处理结束后,返回到异常发生前的状态进行执行。在上面的6中异常中,硬件复位是一种特殊的异常,特殊之处在于不用从异常处理例程返回,所以不用考虑保护现场,也不用保存返回地址,OpenMIPS对硬件复位异常的处理方法是很简单的:全部寄存器清零,从地址0x0处取指执行,这实际也就是复位的过程,所以硬件复位异常的处理过程不再论述

11.2 精确异常

当一个异常发生后,系统的顺序执行会被中断,此时有若干条指令处于流水线上的不同阶段,处理器会转移到异常处理例程,异常处理结束后返回原程序继续执行,因为不希望异常处理例程破坏原程序的正常执行,所以对于异常发生时,流水线上没有执行完的指令,必须记住它处于流水线的哪一阶段,以便异常处理结束后能恢复执行,这便是精确异常。
对一个实现精确异常的处理器,在异常发生时,都会有一个被异常打断的指令,称为异常受害者(Exception Victim),也可称为发生异常的指令,该指令前面的所有指令都要被执行到流水线的最后一个阶段,也就是正常执行完成,但是该指令及该指令之后的指令都要被取消,就像从来没有执行过一样。如图11-1所示。第2条指令add在执行阶段发生溢出异常,在这种情况下,已经到达访存阶段的第1条指令ori会继续执行完成,而第2,3,4条指令都会被取消,不会有任何影响处理器的情况发生,就像没有进过流水线一样。在这里插入图片描述
为了实现精确异常,必须要求异常发生的顺序与指令的顺序相同,在非流水线的处理器上,这是必然的,但是对于拥有流水线的处理器,就会有些复杂。在流水线处理器上,异常会在流水线的不同阶段发生。带来潜在的问题。比如:以图11-2为例,加载指令lw会在流水线的访存阶段发生地址未对齐的异常(因为加载地址是0x3,指令lx要求加载地址的最后两位为00),该异常应该会在第4个时钟周期发生,而它的后一条指令di是无效指令(MIPS32架构没有定义该指令,所以是无效指令),会在流水线的译码阶段引发无效指令异常,也就是在第3个时钟周期,而此时上一条加载指令lw还处于执行阶段,没有进入访存阶段,所以先发生的异常就是无效指令异常。从而不满足异常发生的顺序与指令的顺序相同这一要求。在这里插入图片描述
为了避免上述情况,先发生的异常并不立即处理,异常事件只是被标记,并继续运行流水线。在大多数处理器中,会射击一个特殊的流水线阶段,专门用于处理异常。如果某一条指令的异常事件到达了流水线的这个阶段,那么会进行异常处理,并且当前处于流水线其余阶段的指令的异常事件都会被忽略。还是以图11-2为例,假设处理器会在访存阶段处理异常情况,那么di指令虽然在第3个时钟周期发生了异常,但是并不处理,只是保存一个异常标记,等到第5个时钟周期该指令进入访存阶段再处理。但是,在第4个时钟周期,上一条指令lw进入了访存阶段,并且发生了地址未对齐异常,因为已经处于访存阶段了,所以会处理该异常,而包括无效指令异常在内的流水线其余阶段的异常都被忽略。
通过以上方法就可以在流水线处理器中实现“按指令执行的顺序处理异常,而不是按异常发生的顺序处理异常处理”。

11.3 异常处理过程

当检测到异常发生后,处理器会执行一系列动作以处理异常,不同处理器的处理过程也不同,OpenMIPS处理器的处理过程如下:在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

11.4 异常相关指令介绍

MIPS32指令集架构中定义的异常相关指令包括:自陷指令、系统调用指令syscall、异常返回指令eret,下面分别介绍。

11.4.1 自陷指令

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

  1. bububaohan 立即数的自陷指令
    不包含立即数的自陷指令有6条,指令格式如图所示。
    在这里插入图片描述在这里插入图片描述在这里插入图片描述

  2. 包含立即数的自陷指令
    包含立即数的自陷指令也就是6条,指令格式如图所示。
    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述

11.4.2 系统调用指令syscall

在这里插入图片描述在这里插入图片描述在这里插入图片描述

11.4.3 异常返回指令eret

在这里插入图片描述

11.5 异常处理实现思路

在这里插入图片描述

11.5.1 实现思路

在这里插入图片描述在这里插入图片描述

11.5.2 修改数据流图

在这里插入图片描述

11.5.3 修改系统结构

为了实现异常处理,需要修改系统结构,添加部分接口,如图所示。

在这里插入图片描述在这里插入图片描述在这里插入图片描述

版权声明:本文为CSDN博主「小刘真的很努力」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/dieyouxiu/article/details/122755663

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

在MIPS32架构中,有一些事件要打断程序的正常执行流程,这些事件有中断(Interrupt)、陷阱(Trap)、系统调用(System Call)以及其他任何可以打断程序正常执行流程的情况,统称为异常。异常类型及其优先级如表所示。

在这里插入图片描述在这里插入图片描述 OpenMIPS处理器只实现对其中6种异常情况的处理,列举如下:

  • 硬件复位
  • 中断(包含软中断、硬中断)
  • syscall系统调用
  • 无效指令
  • 溢出
  • 自陷指令引发的异常
    异常发生后,会进入异常处理例程进行具体的异常处理,处理结束后,返回到异常发生前的状态进行执行。在上面的6中异常中,硬件复位是一种特殊的异常,特殊之处在于不用从异常处理例程返回,所以不用考虑保护现场,也不用保存返回地址,OpenMIPS对硬件复位异常的处理方法是很简单的:全部寄存器清零,从地址0x0处取指执行,这实际也就是复位的过程,所以硬件复位异常的处理过程不再论述

11.2 精确异常

当一个异常发生后,系统的顺序执行会被中断,此时有若干条指令处于流水线上的不同阶段,处理器会转移到异常处理例程,异常处理结束后返回原程序继续执行,因为不希望异常处理例程破坏原程序的正常执行,所以对于异常发生时,流水线上没有执行完的指令,必须记住它处于流水线的哪一阶段,以便异常处理结束后能恢复执行,这便是精确异常。
对一个实现精确异常的处理器,在异常发生时,都会有一个被异常打断的指令,称为异常受害者(Exception Victim),也可称为发生异常的指令,该指令前面的所有指令都要被执行到流水线的最后一个阶段,也就是正常执行完成,但是该指令及该指令之后的指令都要被取消,就像从来没有执行过一样。如图11-1所示。第2条指令add在执行阶段发生溢出异常,在这种情况下,已经到达访存阶段的第1条指令ori会继续执行完成,而第2,3,4条指令都会被取消,不会有任何影响处理器的情况发生,就像没有进过流水线一样。在这里插入图片描述
为了实现精确异常,必须要求异常发生的顺序与指令的顺序相同,在非流水线的处理器上,这是必然的,但是对于拥有流水线的处理器,就会有些复杂。在流水线处理器上,异常会在流水线的不同阶段发生。带来潜在的问题。比如:以图11-2为例,加载指令lw会在流水线的访存阶段发生地址未对齐的异常(因为加载地址是0x3,指令lx要求加载地址的最后两位为00),该异常应该会在第4个时钟周期发生,而它的后一条指令di是无效指令(MIPS32架构没有定义该指令,所以是无效指令),会在流水线的译码阶段引发无效指令异常,也就是在第3个时钟周期,而此时上一条加载指令lw还处于执行阶段,没有进入访存阶段,所以先发生的异常就是无效指令异常。从而不满足异常发生的顺序与指令的顺序相同这一要求。在这里插入图片描述
为了避免上述情况,先发生的异常并不立即处理,异常事件只是被标记,并继续运行流水线。在大多数处理器中,会射击一个特殊的流水线阶段,专门用于处理异常。如果某一条指令的异常事件到达了流水线的这个阶段,那么会进行异常处理,并且当前处于流水线其余阶段的指令的异常事件都会被忽略。还是以图11-2为例,假设处理器会在访存阶段处理异常情况,那么di指令虽然在第3个时钟周期发生了异常,但是并不处理,只是保存一个异常标记,等到第5个时钟周期该指令进入访存阶段再处理。但是,在第4个时钟周期,上一条指令lw进入了访存阶段,并且发生了地址未对齐异常,因为已经处于访存阶段了,所以会处理该异常,而包括无效指令异常在内的流水线其余阶段的异常都被忽略。
通过以上方法就可以在流水线处理器中实现“按指令执行的顺序处理异常,而不是按异常发生的顺序处理异常处理”。

11.3 异常处理过程

当检测到异常发生后,处理器会执行一系列动作以处理异常,不同处理器的处理过程也不同,OpenMIPS处理器的处理过程如下:在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

11.4 异常相关指令介绍

MIPS32指令集架构中定义的异常相关指令包括:自陷指令、系统调用指令syscall、异常返回指令eret,下面分别介绍。

11.4.1 自陷指令

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

  1. bububaohan 立即数的自陷指令
    不包含立即数的自陷指令有6条,指令格式如图所示。
    在这里插入图片描述在这里插入图片描述在这里插入图片描述

  2. 包含立即数的自陷指令
    包含立即数的自陷指令也就是6条,指令格式如图所示。
    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述

11.4.2 系统调用指令syscall

在这里插入图片描述在这里插入图片描述在这里插入图片描述

11.4.3 异常返回指令eret

在这里插入图片描述

11.5 异常处理实现思路

在这里插入图片描述

11.5.1 实现思路

在这里插入图片描述在这里插入图片描述

11.5.2 修改数据流图

在这里插入图片描述

11.5.3 修改系统结构

为了实现异常处理,需要修改系统结构,添加部分接口,如图所示。

在这里插入图片描述在这里插入图片描述在这里插入图片描述

版权声明:本文为CSDN博主「小刘真的很努力」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/dieyouxiu/article/details/122755663

生成海报
点赞 0

小刘真的很努力

我还没有学会写个人说明!

暂无评论

相关推荐

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

11.1 MIPS32架构中定义的异常类型 在MIPS32架构中,有一些事件要打断程序的正常执行流程,这些事件有中断(Interrupt)、陷阱(Trap)、系统调用(Sy

32位芯片IO口的工作模式详解

一、IO口基本信息 以STM32单片机为例,共有7组IO口,从GPIOA~GPIOG,每组IO口有16个IO,一共有7×16112个IO。另外还有两个PH0和PH1,共11