介绍

分支、跳转、异常(包括硬件中断)是三种改变控制流的事件。

同步异常是指程序执行到固定位置必定触发且每次现象一致的异常,如算术溢出异常、未定义指令异常、缺页异常等。

异步异常与当前执行程序无关,如I/O请求、内存错误、电源不稳定等。硬件中断是一种异步异常。

异常发生时,当前执行程序被中断,CPU跳转到对应的异常处理函数执行,异常处理完毕之后,继续执行被中断程序。

异常处理函数入口必须要保存被中断任务上下文,这样才能从异常返回。任务上下文包括CPU寄存器值、返回地址和栈顶指针等,通常是保存到内存中,那么就需要一个寄存器用来保存该内存段的基地址。MIPS预留了$k0和$k1两个寄存器,异常处理函数每次都会直接改写$k0和$k1寄存器值,这就意味着,正常运行的程序如果使用$k0或者$k1寄存器会导致不可预期的结果。

异常处理机制

MIPS的异常处理、MMU、Cache都是由CP0协处理器控制,CP0只能在内核态操作。

CP0寄存器使用下述指令操作:

异常处理相关CP0寄存器如下:

BadVAddr寄存器

保存异常发生时的内存地址(虚拟地址), 比如非对齐访问异常;

Cause寄存器

IP0~1表示软中断,IP2~7表示硬件中断类型,ExcCode表示异常类型,ExcCode 0表示中断。

ExcCode

Status寄存器

IM2~7为1表示使能对应中断,为0表示去使能;

IEc即当前中断模式,为1表示使能中断,为0表示禁用所有中断;

KUc即当前工作模式,为1表示User模式,为0表示Kernel模式;

IEp和KUp表示异常发生前的中断模式和工作模式;

IEo和KUo表示再之前的状态;

上述三组状态依次覆盖。

EPC寄存器

使用jal跳转指令时,发生了两件事情:

1)跳转到jal指定的地址执行

2)返回地址保存到$ra寄存器

但是当异常发生时,CPU跳转到一个固定的地址执行,即异常向量表。此时,返回地址不能保存在$ra寄存器中,因为它会覆盖$ra寄存器值,因此MIPS将异常返回地址保存在EPC寄存器中。

从异常返回

无延迟槽时

mfc0 $k0, $14 # get EPC in $k0
rfe # return from exception
jr $k0 # replace PC with the return address

有延迟槽时

mfc0 $k0, $14 # get EPC in $k0
addiu $k0, 4 # make sure it points to next instruction
rfe # return from exception
jr $k0 # replace PC with the return address

异常处理函数

当异常发生时,CPU会进入Kernel模式,同时禁用所有中断(CPU硬件实现,软件不可控)。

禁用中断的原因是异常处理函数首先需要保存处理器状态,随后才能处理中断。具体为:

1)确定异常类型,并保存相关信息(如EPC、Cause、Status寄存器值)

2)保存异常上下文,即所有CPU寄存器值

禁用中断并不代表不处理中断,只是延迟处理。当异常处理函数中使能中断,或者异常处理函数返回时,CPU会马上处理被Pending的中断(长时间Pending会丢失中断),跳转到中断处理函数处理。

如果异常处理函数可以在很短时间内执行完毕,那么,不需要在异常处理函数中使能中断,异常返回时CPU会使能中断。这也意味着,异常处理函数中不需要保存异常上下文,如EPC、Cause、Status寄存器值,但是仍然需要保存除$k0和$k1以外的通用寄存器值。

异常嵌套

异常处理函数执行时,中断被禁用,但是不代表CPU不会被trap。当异常处理函数本身出现异常时,仍然会触发异常。

参考文献

Exception in MIPS

Exception in MIPS的更多相关文章

  1. 【原创】MIPS中断系统的板级验证及实例测试

    “五一”假期前后这约五天时间,终于将MIPS中断系统进行了板级验证及实例测试.因为老师给的交叉编译工具不会用,所以测试代码完全用MIPS汇编编写.使用MARS而没有用QtSpim,其实我觉得SPIM这 ...

  2. 【原创】MIPS浅议之——中断系统之我见

    最近,准确的说应该是最近两个月的时间,我都在研究MIPS的异常与中断.或者可以说,最近这两个月,我才真正了解中断系统的整个结构和处理流程以及为什么要这样做?这段时间我最大的体会就是以前我们在“计算机组 ...

  3. java应用破解之破解 jeb mips 2.3.3

    前言 jeb 的新版支持 mips的反编译 ,于是去官网申请一个试用版,试用版的限制还是比较多的,比如 使用时间验证,没法复制粘贴 等,于是想尝试看看能否破解,同时填了 java破解 这个坑. 修改版 ...

  4. [C#] C# 知识回顾 - 你真的懂异常(Exception)吗?

    你真的懂异常(Exception)吗? 目录 异常介绍 异常的特点 怎样使用异常 处理异常的 try-catch-finally 捕获异常的 Catch 块 释放资源的 Finally 块 一.异常介 ...

  5. 浅谈java异常[Exception]

    学习Java的同学注意了!!! 学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:589809992 我们一起学Java! 一. 异常的定义 在<java编程思想 ...

  6. Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory

    学习架构探险,从零开始写Java Web框架时,在学习到springAOP时遇到一个异常: "C:\Program Files\Java\jdk1.7.0_40\bin\java" ...

  7. Exception in thread "main" java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(I)V

    在学习CGlib动态代理时,遇到如下错误: Exception in thread "main" java.lang.NoSuchMethodError: org.objectwe ...

  8. Atitit 解决Unhandled event loop exception错误的办法

    Atitit 解决Unhandled event loop exception错误的办法 查看workspace/.metadata/.log org.eclipse.swt.SWTError: No ...

  9. Java中的Checked Exception——美丽世界中潜藏的恶魔?

    在使用Java编写应用的时候,我们常常需要通过第三方类库来帮助我们完成所需要的功能.有时候这些类库所提供的很多API都通过throws声明了它们所可能抛出的异常.但是在查看这些API的文档时,我们却没 ...

随机推荐

  1. opencv的imread函数相对路径问题和 main 参数问题

    参考: https://blog.csdn.net/u013404374/article/details/80178822 https://blog.csdn.net/fujilove/article ...

  2. P4821 [中山市选]生成树

    题目链接 我们可以看一下题目中给的这张图. 首先,树是没有环的,所以我们要把所有的环上的边都删去一条. 我们可以现在每个五边形上删去一条边. 但删完之后我们会发现,里面还有一圈. 这时候,我们就要在这 ...

  3. spring redis 配置

  4. 扩展、接管MVC都不会,还说会Spring Boot?

    持续原创输出,点击上方蓝字关注我 目录 前言 Spring Boot 版本 如何扩展MVC? 如何自定义一个拦截器? 什么都不配置为什么依然能运行MVC相关的功能? 如何全面接管MVC?[不推荐] 为 ...

  5. js 基础概念

    一 执行上下文 和 执行上下文栈 执行上下文:一段javascript代码执行前的准备工作 问题一:js引擎遇到怎样一段代码才会做"准备工作呢"? 可执行代码类型:全局代码.函数代 ...

  6. 解决:npm install ERR! Unexpected end of JSON input

    npm ERR! Unexpected end of JSON input npm i -g npm@5 npm install --registry=https://registry.npm.tao ...

  7. python中的对文件的读写

    简单的实例 open函数获取文件,w是写权限,可以对文件进行io操作 file=open('C:/Users/Administrator/Desktop/yes.txt','w') file.writ ...

  8. 浅谈MircoPython---ESP8266

    一.连接WIFI 在Putty会话窗口输入 >>>help() 打印的消息会告诉你如何连接WIFI import network sta_if = network.WLAN(netw ...

  9. 35岁的程序员正在消失?No,我认识了一个50岁的程序员!

    35岁的话题真是无穷无尽.一开始的时候,以为只有社交媒体上会有这种问题的讨论,没想到,公司内部的论坛上也有不少这类的文章.大家各有各的说法,但终究也没有找到银弹似的解决方案. 这段时间,倒是接触了一个 ...

  10. kafka-消费者测试

    1. 在窗口1创建一个producer,topic为test,broker-list为zookeeper集群ip+端口   /usr/local/kafka/bin/kafka-console-pro ...