下面内容摘自《步步惊芯——软核处理器内部设计分析》一书

我们在计算机体系结构的学习中知道:中断实质上包含由外部事件引起的硬中断(又称外中断)和由内部预先安排的特定指令或内部异常引起的软中断(又称内中断或异常)两大类。在OR1200处理器中将中断称之为异常(exception),硬中断是当中的一种异常,当然这仅仅是说法的不同而已。当异常发生时,有关处理器的状态信息被存储到某些寄存器。OR1200处理器转移到事先定义好的一个地址。在那个地址中往往有异常处理例程。在当中进行异常处理,这个地址称为异常处理例程入口地址。

OR1200中有32个异常处理例程入口地址。当中明白定义使用了前14个。后18个作为将来扩展使用。异常类型下表所看到的。

參照计算机体系结构中关于中断的定义,也能够将OR1200中的异常区分为:硬中断、内部异常、特定指令引发的异常。例如以下:

  • 硬中断:硬复位、计时器中断、外部中断
  • 内部异常:软复位、总线错误、数据页失效、指令页失效、对齐异常、无效指令、数据TLB失靶、指令TLB失靶、溢出
  • 特定指令引发的异常:系统调用、自陷

本章将仅仅对特定指令引发的异常进行分析,其余类型异常在处理器中的处理过程与此类似。将在本书后面对详细模块分析的时候再作讨论,比方:在分析IMMU模块的时候就会讨论指令TLB失靶异常以及指令页失效异常的处理过程。

OR1200中的异常处理过程

当异常发生时,OR1200会进行例如以下操作:

(1)设置EPCR:假设当前指令不在延迟槽中。那么当前指令(或下一条指令)地址被存储到EPCR寄存器中。假设当前指令在延迟槽中。那么当前指令的上一条转移指令地址被存储到EPCR寄存器中。

(2)设置EEAR:假设发生的异常是总线错误、指令页失效、数据页失效、指令TLB失靶、数据TLB失靶等异常,那么会把例外发生时正在訪问的指令或数据的有效地址EA(Effective Address)保存到EEAR寄存器。

(3)保存SR到ESR寄存器。

(4)设置新的SR值:使得IMMU、DMMU都禁用,计时器中断、外部中断也禁止,而且进入特权模式。即设置SR[DME]=0、SR[IME]=0、SR[TEE]=0、SR[IEE]=0、SR[SM]=1。

(5)转移到对应的异常处理例程继续运行。

当异常处理结束后,须要使用指令l.rfe从异常返回,l.rfe指令会将ESR的值恢复到SR。同一时候将EPCR的值恢复到PC,处理器回到异常发生前的状态继续运行。

此处对异常发生时保存到EPCR、EEAR的值进行说明,如表7.1所看到的。

针对不同的异常类型保存到EPCR的值不同。而且该值与异常发生时处于运行阶段的指令是否位于延迟槽中也有关系。

读者朋友可能会有一个疑问:为什么当异常发生,且处于运行阶段的指令是延迟槽中的指令时保存在EPCR中的返回地址是上一条转移指令的地址呢?这是由于在引入延迟槽之前,处理器运行转移指令的顺序是:

转移指令->转移目标地址的指令

引入延迟槽之后,处理器运行转移指令的顺序是:

转移指令->延迟槽指令->转移目标地址的指令

在中间插入了延迟槽指令,当异常发生,且处于运行阶段的指令是延迟槽中的指令时,假设在EPCR中保存延迟槽指令地址,那么当从异常处理例程返回时。将回到延迟槽指令地址。又一次运行的指令顺序是:

延迟槽指令->延迟槽指令的下一条指令

可见没有发生转移,这样就全然不是被打断之前的指令顺序,所以为了恢复原来的指令顺序,在这里将延迟槽之前的转移指令地址保存到EPCR中。

表7.1中另一列显示异常的优先级,数字越小表示优先级越高。表中的优先级与OR1200手冊给的不一样,笔者是从代码中总结出这些优先级的。OR1200手冊对各个异常的优先级表述与实现不符。

异常处理类指令说明

OR1200中异常处理类指令共同拥有3条,表7.2给出了全部的异常处理类指令及其说明。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGVpc2hhbmd3ZW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

关于异常处理类指令有例如以下几点补充说明:

(1)l.sys指令中的马上数K,在ORBIS32说明中指出这个K是一个參数,操作系统能够利用该值确定怎样处理这个系统调用请求,但在OR1200的实现中并没有保存这个參数。也没有使用这个參数。

(2)l.trap指令中的马上数K,在ORBIS32说明中指出仅仅有在SR[K]为1时,才会进入自陷异常的处理例程。但从本章对l.trap的分析中能够发现OR1200处理器并没有实现这一推断过程,马上数K没有作用。

or1200处理器的异常处理类指令介绍的更多相关文章

  1. SpringMVC的处理器全局异常处理类

    SpringMVC的处理器全局异常处理类 package com.huawei.utils; import org.springframework.web.servlet.HandlerExcepti ...

  2. or1200中载入存储类指令说明

    下面内容摘自<步步惊芯--软核处理器内部设计分析>一书 OR1200中实现的载入存储类指令有8条,每条指令的作用与说明如表9.1所看到的. watermark/2/text/aHR0cDo ...

  3. OR1200处理器中Wishbone总线接口模块WB_BIU介绍

    下面内容摘自<步步惊芯--软核处理器内部设计分析>一书 WB_BIU模块是OR1200处理器与外部Wishbone总线连接的接口模块.15.1节给出了WB_BIU模块的对外连接关系,并指出 ...

  4. ARM汇编初探---汇编代码中都有哪几类指令---ARM伪指令介绍

    要学习一个东西首先要把概念搞清楚,以下仅仅是自己的一些关于汇编的理解. 可运行文件里的01码是机器码,机器码不等于汇编码,尽管机器码能够非常easy翻译成汇编码. 汇编码中包括非常多汇编指令.伪指令和 ...

  5. (转)64位开源处理器Rocket的源代码简单介绍

    转载地址: http://blog.csdn.net/leishangwen/article/details/46604819 最近大概阅读了一下UCB发布的Rocket处理器的源码,对源代码各个文件 ...

  6. corosync+pacemaker的crmsh的常用指令介绍

    配置crmsh的yum仓库,此仓库的RPM包有openSUSE提供,将这个network:ha-clustering:Stable.repo文件直接下载到本地并且命名为crmsh.repo wget ...

  7. 【转】Spring学习---Bean配置的三种方式(XML、注解、Java类)介绍与对比

    [原文]https://www.toutiao.com/i6594205115605844493/ Spring学习Bean配置的三种方式(XML.注解.Java类)介绍与对比 本文将详细介绍Spri ...

  8. Docker学习(三): Dockerfile指令介绍

    特别声明: 博文主要是学习过程中的知识整理,以便之后的查阅回顾.部分内容来源于网络(如有摘录未标注请指出).内容如有差错,也欢迎指正! =============系列文章============= 1 ...

  9. CSAPP阅读笔记-汇编语言初探(控制类指令)-来自第三章3.6的笔记-P135-P163

    1.正溢出与负溢出: 首先,一个正数与一个负数相加,不可能溢出,因为结果的绝对值一定小于两个加数的绝对值,既然两个加数能合理表示出来,结果一定也能合理表示出来. 其次,正溢出是由于两个很大的正数相加, ...

随机推荐

  1. asp.net 自定义的模板方法接口通用类型

    本来想写这个帖子已经很久了,但是公司事情多,做着做着就忘记了.公司因为需要做接口,而且用的还是asp.net的老框架,使用Handler来做,没得办法,自己照着MVC写了一个通过的接口操作模板. 上送 ...

  2. 11) 十分钟学会android--Intent消息处理与传递详解

    一个Android app通常都会有多个activities. 每个activity的界面都扮演者用户接口的角色,允许用户执行一些特定任务(例如查看地图或者是开始拍照等).为了让用户能够从一个acti ...

  3. ionic生成apk使用build命令下载gradle-2.2.1-all.zip卡,解决方案

    ionic生成apk使用build命令下载gradle-2.2.1-all.zip卡,解决方案 直接使用ionic build android命令,自动下载gradle-2.2.1-all.zip超慢 ...

  4. linux终端自定义命令的别名

    alias : 给某个命令定义别名. 如:alias gpush='Git push origin HEAD:refs/for/master'这样在终端中,只需要输入 gpush 就ok了.但是只是这 ...

  5. 插件lombok的介绍安装

    Lombok插件 介绍一个不错的Eclipse插件Lombok 该插件对Log4j简化的代码,因为不大,所以jar包也存在呢! Lombox是Eclipse的一个插件,用来自动生成Java代码,减少手 ...

  6. 多少牛逼的程序员毁在low逼的英文发音上(JAVA)

    最最常用的关键词及音标 数据类型:boolean.byte.short.int.long.double.char.float.double. 包引入和包声明:import.package. 用于类和接 ...

  7. (转)从史上八大MySQL宕机事故中学到的经验

    一.Percona网站宕机事件 震级:3 发生时长:2011年7月11日 持续时长:数日 地点:加州Pleasanton(幸福屯) 宕机原因:Percona网站主服务器上的3块硬盘损坏,同时因为人员变 ...

  8. C语言一些知识点回顾

    1.多行宏定义 #include <stdio.h> #define _PyObject_HEAD_EXTRA \ struct _object *_ob_next; \ struct _ ...

  9. Celery 源码解析七:Worker 之间的交互

    前面对于 Celery 的分布式处理已经做了一些介绍,例如第五章的 远程控制 和第六章的 Event机制,但是,我认为这些分布式都比较简单,并没有体现出多实例之间的协同作用,所以,今天就来点更加复杂的 ...

  10. _2Python_注释命名等基本操作

    注释:注解,解释 主要用于在代码中给代码标识出相关的文字提示(提高代码的可读性)或调试程序,方便别人阅读和自己日后修改. Python中注释分为两类.单行注释:单行注释以#号开头,在一行内,#号后面的 ...