Exception in MIPS
介绍
分支、跳转、异常(包括硬件中断)是三种改变控制流的事件。
同步异常是指程序执行到固定位置必定触发且每次现象一致的异常,如算术溢出异常、未定义指令异常、缺页异常等。
异步异常与当前执行程序无关,如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的更多相关文章
- 【原创】MIPS中断系统的板级验证及实例测试
“五一”假期前后这约五天时间,终于将MIPS中断系统进行了板级验证及实例测试.因为老师给的交叉编译工具不会用,所以测试代码完全用MIPS汇编编写.使用MARS而没有用QtSpim,其实我觉得SPIM这 ...
- 【原创】MIPS浅议之——中断系统之我见
最近,准确的说应该是最近两个月的时间,我都在研究MIPS的异常与中断.或者可以说,最近这两个月,我才真正了解中断系统的整个结构和处理流程以及为什么要这样做?这段时间我最大的体会就是以前我们在“计算机组 ...
- java应用破解之破解 jeb mips 2.3.3
前言 jeb 的新版支持 mips的反编译 ,于是去官网申请一个试用版,试用版的限制还是比较多的,比如 使用时间验证,没法复制粘贴 等,于是想尝试看看能否破解,同时填了 java破解 这个坑. 修改版 ...
- [C#] C# 知识回顾 - 你真的懂异常(Exception)吗?
你真的懂异常(Exception)吗? 目录 异常介绍 异常的特点 怎样使用异常 处理异常的 try-catch-finally 捕获异常的 Catch 块 释放资源的 Finally 块 一.异常介 ...
- 浅谈java异常[Exception]
学习Java的同学注意了!!! 学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:589809992 我们一起学Java! 一. 异常的定义 在<java编程思想 ...
- 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" ...
- Exception in thread "main" java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(I)V
在学习CGlib动态代理时,遇到如下错误: Exception in thread "main" java.lang.NoSuchMethodError: org.objectwe ...
- Atitit 解决Unhandled event loop exception错误的办法
Atitit 解决Unhandled event loop exception错误的办法 查看workspace/.metadata/.log org.eclipse.swt.SWTError: No ...
- Java中的Checked Exception——美丽世界中潜藏的恶魔?
在使用Java编写应用的时候,我们常常需要通过第三方类库来帮助我们完成所需要的功能.有时候这些类库所提供的很多API都通过throws声明了它们所可能抛出的异常.但是在查看这些API的文档时,我们却没 ...
随机推荐
- 日志分析平台ELK之日志收集器logstash常用插件配置
前文我们了解了logstash的工作流程以及基本的收集日志相关配置,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13761906.html:今天我们来了解下l ...
- Book of Shaders 04 - 网格噪声:Worley Noise
0x00 思路 假设要生成 4 个网格,可以先在空间中指定 4 个特征点.对于每个像素点,计算它到最近特征点的距离,将这个距离当作结果值输出. #ifdef GL_ES precision mediu ...
- Numpy中的shape和reshape()
shape是查看数据有多少行多少列reshape()是数组array中的方法,作用是将数据重新组织 1.shape import numpy as np a = np.array([1,2,3,4,5 ...
- P1297 单选错位 题解
这是一道我们的考试题 前置芝士 期望 定义:试验中每次可能结果的概率乘以其结果的总和(来自百度某科 滑稽) 性质:\(E(ax+by)\) = \(xE(a)\) * \(yE(b)\) 计算式: \ ...
- vue使用vueCropper裁剪功能,代码复制直接使用
//先安装包 npm install vue-cropper --save-dev <template> <div id="merchantInformation" ...
- 【3】Java面试-Servlet
Servlet面试问题 Q1.什么是servlet? Java Servlet是服务器端技术,通过提供对动态响应和数据持久性的支持来扩展Web服务器的功能. javax.servlet和javax.s ...
- nginx完美支持thinkphp3.2.2(需配置URL_MODE=>3 rewrite兼容模式)
来源:http://www.thinkphp.cn/topic/26637.html 环境:nginx 1.6,thinkphp3.2.2 第一步,修改server块 server { listen ...
- protoc-c 阅读笔记
以前和山哥做过类似的,最近想起来,抽空又看了下 protoc-c. 山哥做的报文流向: rpc -> lydtree -> motree -> struct 涉及的细节很多 1) l ...
- Java工程师应该掌握的知识,按重要程度排出六个阶段如下
第一阶段:计算机组成原理.数据结构和算法.网络通信原理.操作系统原理: 第二阶段:Java基础.JVM内存模型和GC算法.JVM性能调优.JDK工具.设计模式: 第三阶段:Spring系列.Myb ...
- Linux给特定进程单独指定DNS
Linux本身只能通过/etc/resolv.conf设置全系统的DNS.这里有一种给特定进程单独设置DNS的方法,通过免root的mount namespace达成.使用脚本只需要一条简洁的命令就可 ...