浅析arm的异常、中断和arm工作模式的联系
说到异常向量,会让人联想到中断向量。其实,中断是属于异常的子集的,也就是说中断其实是异常其中的一种。
回到异常向量,他其实是一张表格,每个格子里存放的是一个地址,或者是一个跳转命令,不管是哪个,其目的都是让PC跳转到真正处理异常的代码的地方。
以下是arm的异常向量表:

图1
初步介绍完异常向量,就来对比下ARM的arm的7种工作模式:

图2
User : 非特权模式,大部分任务执行在这种模式
FIQ : 当一个高优先级(fast) 中断产生时将会进入这种模式
IRQ : 当一个低优先级(normal) 中断产生时将会进入这种模式
Supervisor :当复位或软中断指令执行时将会进入这种模式
Abort : 当存取异常时将会进入这种模式
Undef : 当执行未定义指令时会进入这种模式
System : 使用和User模式相同寄存器集的特权模式
可以发现arm的7种工作模式其实是和arm的异常向量表有着一定的对应关系的。
接着来看ARM的一个非常重要的寄存器——CPSR程序状态寄存器,如图二所示:该寄存器在arm的任何工作模式中都存在,且是被所以工作模式共用的。
寄存器每一位的含义如下图所示:

图3
以上3者有着莫大的关联,结合三者分析,就会明白很多东西。
其一、arm的7种工作模式,和异常向量表有着一定的对应关系。 如SVC模式下发生普通中断(IRQ)arm自动切换到IRQ模式,进入IRQ模式后PC就会指向IRQ对应异常向量表,及0x18这个位置。
再比如复位时,就会进入svc模式,并且跳到Reset对应的异常向量表,及0x00位置(这也是为什么程序是从0x00开始执行的)
其二、工作模式的切换有主动和被动之分。上面所说的就是被动切换,他是随着某种异常的发生而导致的切换。
主动切换,就要靠cpsr这个寄存器了。可以看到这个寄存器的末四位就是用来设定进入哪种模式的。
何时需要cpsr主动切换模式呢:
1、一开始就想进入某种模式。如:一开始设置所有模式下的sp地址。示例如下:

2、进入某种模式后,想切换到之前的模式。这个过程通常是通过读回SPSR的值。示例如下:

接着,我们来区分异常和中断的区别和联系:
1、中断可以看作是异常的一种情况。
2、中断是可以屏蔽的,如通过cpsr寄存器的I位和F位分别屏蔽IRQ和FIQ。而异常是无法屏蔽的。
3、异常/中断发生时,PC都会指向相应的向量表。异常的发生往往会导致模式的自动切换。
4、IRQ和其他模式稍有不同。因为被动切换到IRQ模式下的情况有很多种,换句话就是,很多种中断,都会导致进入IRQ模式。进入IRQ模式还需要判断是那种情况导致了中断,所以IRQ往往还对应一张中断向量表。(区分于异常向量表)相当于异常向量表的子级表。
最后看,在模式切换时,都发生了什么?
1、当模式发生切换时(主动或者被动),硬件会自动帮我们完成一些事情。然后还需要软件完成一些事情。
做好这两件事,就可以在模式之间切换而不会相互影响,当然对应程序员而言只需要做好后者。
2、硬件帮我们完成的事情,是在模式切换时随之完成,而软件要完成的任务,是在模式切换之后。这点需要十分注意!比如当前是SVC模式切换到IRQ模式。那么软件需要完成的事情,是在当前IRQ模式下完成的。
3、那么硬件完成了什么事情,软件又需要做什么呢?
3.1、硬件完成的事情有:

切换到新的模式后,用的就是当前模式下的sp以及lr,但是pc只有一个。由于硬件帮我们
完成的一些事。所以当前IRQ模式下的lr寄存器存放的其实是上个模式SVC的PC值。当前IRQ模式下的
SPSR寄存器存放的其实是上个模式SVC的CPSR值。这充分为返回上一个模式做好了准备。
3.2、所以软件需要完成的任务有:
3.2.1、保存当前共用寄存器的值,(如SVC模式和IRQ模式共用r0~r12 以及r15及pc)到当前模式的栈内存。保证之前模式的值不被破坏。
这里CPSR虽然也是共用的,但是不用保存到栈中,这是因为硬件会自动把上个模式的CPSR保存到当前模式的SPSR。
而SPSR直到中断返回,及切换到之前的模式才会用到。有点同学会问了,pc的值也会由硬件自动保存到lr,为什么还需要保存到栈中呢?这是因为lr和SPSR不同,在中断执行的过程中,很可能需要使用lr,为了不把之前的pc值冲掉还是先将其发到栈中保存。
3.2.2、进入中断处理函数。处理中断。
3.2.3、中断返回,将之前保存到栈里的值读回,并SPSR的值赋值给CPSR实现主动切换到之前的模式。示例代码:

最后,聊一个面试经常问的问题,FIQ相比IRQ,FIQ称为快速中断,IRQ称为普通中断。FIQ为什么比IRQ快!
我们可以结合图1和图2进行分析:
1、先看图1,FIQ的异常向量地址为0x1C,位置处于最顶部,这就意味着,FIQ真正的异常处理代码可以紧接着0x1C,及无需跳转,不跳转意味着无需打断arm的流水线,所以可以提高中断响应。
2、再看图2,FIQ模式下具有更多的独立寄存器,如r8~r14,这些寄存器都是FIQ模式下独自享用的。这就意味着,当发生快速中断,进行模式切换时,只有少量的寄存器需要备份到栈中,从而也能节省时间,提高中断的响应速度。
以上两点就是FIQ为什么比IRQ快的原因,别小看节省的这么一点点时间,有的时候就是这么“兵贵神速”。
浅析arm的异常、中断和arm工作模式的联系的更多相关文章
- ARM体系的7种工作模式
一.ARM体系的CPU有以下7种工作模式: 用户模式(usr) 大多数程序运行于用户模式 特权模式 系统模式(sys) 运行具有特权的操作系统任务 异常模式 中断模式(irq) ...
- 嵌入式中 ARM的几种工作模式 以及异常模式的优先级
一.Arm工作模式: Arm微处理器支持7种工作模式,分别为: 1. 用户模式(Usr) 用于正常执行程序 2. 快速中断模式(FIQ) 用于高速数据传输 3. 外部中断模 ...
- ARM体系的异常中断
在ARM体系中,通常有3种方式控制处理器的流程 1:在正常执行过程中,每执行一条ARM指令,程序计数器寄存器PC的值加四个字节,在每执行一条Thumb指令,程序计数器寄存器PC的值加两个字节,整个过 ...
- 2—ARM中的异常中断
ARM体系中的3种控制程序执行的方式 正常执行过程中,每执行1条ARM指令,PC的值加4个字节:每执行1条Thumb指令,PC的值加2个字节.整个过程按照顺序执行. 通过跳转指令,调到特定的地址开始执 ...
- ARM异常中断返回的几种情况
在学习韦老师视频中中断异常部分时候,对于发生中断时需要执行的#保存异现场 #恢复现场 中的“返回”弄不清楚,查阅网络文章后,发现一篇概述我觉得我能理解的一篇如下: 重要基础知识:R15(PC)总是 ...
- ARM工作模式
ARM工作模式 学习ARM的最好的资料是ARM公司发布的资料:ARM Architecture Reference Manual.pdf 找到章节:Programmers’ Model 由文档可知:A ...
- ARM的工作模式和寄存器
以前学的时候学的是S3C6410的开发板,它是三星公司推出的基于ARM v6架构(指令集),处理器是ARM11. ARM架构是构建每个ARM处理器的基础. 目前最新的是ARM v8架构:http:// ...
- ARM处理器工作模式
学习ARM处理器参考的首选资料是ARM Architecture Reference Manual,是最专业权威的学习资料. ARM处理器共有7种工作模式,如表1-1和1-2所示: 表1-1 处理器工 ...
- [国嵌笔记][021-022][ARM处理器工作模式]
[ARM处理器工作模式] 处理器工作模式 1.User(urs):用户模式,linux应用程序运行在用户模式 2.FIQ(fiq):快速中断模式 3.IRQ(irq):中断模式 4.Superviso ...
随机推荐
- 国内使用kubeadm部署kubernetes的完整流程
使用阿里云的镜像安装kubeadm和kubectl cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Ku ...
- SQL Server FileStream (转载)
从SQL SERVER 2008开始,SQL SERVER引入了一种新的文件组类型叫FileStream文件组,如下图所示: 那么这种文件组是用来做什么的呢? 以往我们对文件管理有两种方法: 数据库只 ...
- 配置jboss EAP 6.4 数据库连接超时时间
Environment Red Hat JBoss Enterprise Application Platform (EAP) 6.x 7.x Issue Server throws followin ...
- MySQL索引选择不正确并详细解析OPTIMIZER_TRACE格式
一 表结构如下: CREATE TABLE t_audit_operate_log ( Fid bigint(16) AUTO_INCREMENT, Fcreate_time int(10) un ...
- python 3.6 的 venv 模块
今天,在在使用 pycharm 的使用,进行创建 python的时候,发现使用默认的创建的选项使用的python 3环境 .而我系统默认的python环境是 python 2.7 环境:这就引起了我的 ...
- oracl数据库中的substr()函数的用法
substr:字符串截取. 1.substr:(字符串 | 列 ,开始点):从开始一直截取到结尾. select substr(zym,2) from bqh4 2.substr:(字符串 | 列 , ...
- JAVA 连接 SQL Server 2008:java.lang.ClassNotFoundException: com.microsoft.jdbc.sqlserver.SQLServerDriver
新项目需要修改Java开发的MES系统...Java忘的也差不多了...简单尝试以下JAVA连接SQL Server吧,没想到坑还是很多的.以前直接连oracle时没有这么多麻烦啊....可能微软和o ...
- Linux运维之shell脚本基础知识
1.bash中的算术运算 let运算符 [root@:vg_adn_tidbCkhsTest ~/tidb-bench/sysbench]#echo $i [root@:vg_adn_tidbCkhs ...
- 阿里八八Alpha阶段Scrum(10/12)
今日进度 叶文滔: 正在解决日程模块合并至主项目的问题 俞鋆: 完成了上传和下载头像的api,完善了登陆和注册的api 李嘉群: 正在尝试json文件的转化和发送请求 黄梅玲: 学习json数据解析和 ...
- 8.4Solr API使用(Result Grouping分组查询)
转载请出自出处:http://eksliang.iteye.com/blog/2169458 一.概述 分组统计查询不同于分组统计(Facet),facet只是简单统计记录数,并不能为每组数据返回实际 ...