ARM—异常中断处理
文章目录
一. ARM程序执行流程
在ARM体系中,程序执行的流程有三种:
- 顺序执行程序,在正常顺序执行代码的时候,每次执行一条ARM指令,PC=PC+4(Byte)。(THUMB状态下PC=PC+2)
- 跳转执行程序,利用跳转指令,程序可以跳转到指定的地址处执行程序,或者跳转到特定的子程序处执行。
- 异常中断发生,当发生异常时,程序会跳转到相应的异常中断处理程序处执行,在执行完异常中断处理程序之后,又会返回原地址继续执行程序。
要了解ARM处理异常中断的流程原理,就要先熟悉一下ARM的工作模式与寄存器。
二. ARM工作模式

如图,ARM有七种工作模式,大多数程序是工作在用户模式usr下的,其他六种工作模式属于特权模式,特权模式的存在是为了处理中断、异常,或者访问被保护的系统资源。不同模式之间的转换可以通过软件来切换,或者是发生各类中断、异常时CPU自动进入相应的模式。在特权模式下可以编程操作CPSR寄存器直接进入其他模式,用户模式下不可以通过写程序进入其他模式(只能通过发生各类中断、异常时CPU自动进入相应的模式)。
各种模式的简要介绍如下:
- usr:用户模式,程序执行的正常状态
- sys:兴奋模式,系统模式
- und:未定义指令中止模式,当遇到未定义的指令时进入此模式
- svc:管理模式,操作系统使用的保护模式
- abt:中止模式:当数据或指令预取终止时进入该模式,可用于虚拟存储以及存储保护
- IRQ:中断模式,系统中各外设通常通过中断模式来处理异常中断
- FIQ:快中断模式,可以快速处理异常中断
三. ARM中异常中断的种类
ARM体系中的异常中断种类如下图:


可以看出,异常中断的种类与ARM的模式基本对应。
四. 异常中断向量表及优先级
ARM中要进入异常中断的处理程序,首先要触发异常中断的条件,然后通过异常中断向量表跳转到相应的异常中断处理程序的地址中去执行程序,当同时触发多个异常中断,就涉及到异常中断的优先级问题了。
中断向量表中指定了异常中断及其处理程序的对应关系,通常存放在存储地址低端,ARM体系中,异常中断向量表的大小是32字节,每个异常中断占据4个字节大小。这4字节大小的空间中一般存放一个跳转指令或者是一个向PC赋值的数据访问指令(这样也可以跳转程序),具体的向量表如下:

在相应的地址中,存放着程序跳转指令,当发生异常中断时,程序就会指向向量表中的相应地址(与中断种类对应),然后执行地址中的指令,通过地址中的程序跳转指令跳转到异常中断处理程序中,或者是执行重启等相关操作。
当有多个异常中断同时发生的时候,就要给不同的异常中断规定不同的优先级了,各异常中断的优先级如下:

关于不同异常中断有相同的优先级问题,是因为有些异常中断是不可能同时发生的。
五. 异常中断用到的寄存器
不同的ARM模式下对应的寄存器也是不一样的,而且在处理异常中断的时候保持现场、转换模式、恢复现场等操作的实现都需要用到寄存器。
ARM920T中有31个通用寄存器和6个程序状态寄存器,一共37个寄存器,37个寄存器分为七组(与七种模式相对应),进入哪个模式就使用哪组的寄存器,有些寄存器是共用的、有些寄存器在不同的模式下有独有的副本,这些独有的寄存器称为备份寄存器,在图中用灰色三角做了标记:

通用寄存器
r0~r15的寄存器都可以直接访问,除了r15都是通用寄存器,通用寄存器既可以用于保存数据也可以保存地址,其中r13、r14这两个寄存器比较特殊。r13又称为栈指针寄存器sp,常用于保存栈指针。r14又称为程序连接寄存器lr,用于保存发生异常时的指令地址,在程序跳转的时候lr得到pc的备份,以便于恢复现场。
程序状态寄存器
每种模式下除了r0~r15寄存器之外,还共有一个程序状态寄存器CPSR,顾名思义CPSR寄存器中位用来标识当前模式的状态。当程序切换工作模式的时候,要将原来工作模式的信息(也就是CPSR)存储在SPSR中进行保存,以便恢复现场。CPSR寄存器中每个位相应的作用如下:

其中条件代码解释如下:

控制位解释如下:


另外,PSR中的其余位是保留的。在更改PSR的标志或控制位时,必须确保这些未使用的位没有被更改
六. ARM进入处理异常中断时的操作

1.将下一条指令的地址保存在相应的链接寄存器lr中。如果从ARM状态输入了异常,那么下一条指令的地址将被复制到链接寄存器(即当前PC + 4或PC + 8,这取决于异常)。
2.将当前的CPSR拷贝到SPSR中。
3.根据异常中断修改CPSR中对应的值。
4.强制pc从异常中断向量表中跳转到异常中断处理程序。
注意:还可以设置中断禁用标志,以防止异常的难以管理的嵌套
lr与pc的偏移量的关系如示:

七. ARM退出处理异常中断时的操作
从异常中断中返回时的操作与进入异常中断时的操作对称的:

1.将lr寄存器减去适当的偏移量,赋值给pc,恢复到原来的指令地址中。
2.将SPSR中保留的值返回给CPSR,恢复原来的CPSR。
3.清除中断禁用标志(如果它们是在进入时设置的)。
参考资料:杜春雷《ARM体系结构与编程》
ARM—异常中断处理的更多相关文章
- ARM异常中断处理
ARM异常中断处理 在ARM体系中,通常有以下3种方式控制程序的执行流程: 在正常程序执行过程中,每执行一条ARM指令,程序计数器寄存器(PC)的值加4个字节:每执行一条Thumb指令,程序计数器寄存 ...
- 【ARM】arm异常中断处理知识点
ARM处理器7种类型异常 按优先级从高到低的排列如下: 复位异常(Reset) 数据异常(Date Abort) 快速中断异常(FIQ) 外部中断异常(IRQ) 预取异常(Prefetch Abort ...
- ARM异常中断返回的几种情况
在学习韦老师视频中中断异常部分时候,对于发生中断时需要执行的#保存异现场 #恢复现场 中的“返回”弄不清楚,查阅网络文章后,发现一篇概述我觉得我能理解的一篇如下: 重要基础知识:R15(PC)总是 ...
- 【原创】中断子系统-ARM GPIO中断处理流程
目录 第一部分 GIC中断控制器的注册 1. GIC驱动分析 2.GIC驱动流程分析 第二部分 device node转化为platform_device 第三部分:platform_device注册 ...
- STM32程序异常——中断处理要谨慎
问题背景 最近有一个新项目(车载项目),板子上除了原来的ARM + STM32F030K6Tx又多了一个8bit的mcu的单片机,这可真是嵌入式全家福了. 系统的主要核心工作是由arm来完成,但是在开 ...
- ARM异常---一个Uart中断的触发处理过程:
首先给出一些定义: //2440addr.inc INTOFFSET EQU 0x4a000014 ;Interruot request source offset //option.inc _ISR ...
- ARM异常---一个DataAbort的触发过程:
一个DataAbort异常的触发过程://////////////////////////////xxxx.inc_STACK_BASEADDRESS EQU 0x33ff8000_MMUTT_STA ...
- Arm v8 中断处理
转 https://blog.csdn.net/firefox_1980/article/details/40113637
- ARM体系的异常中断
在ARM体系中,通常有3种方式控制处理器的流程 1:在正常执行过程中,每执行一条ARM指令,程序计数器寄存器PC的值加四个字节,在每执行一条Thumb指令,程序计数器寄存器PC的值加两个字节,整个过 ...
随机推荐
- 深入理解Java多线程——ThreadLocal
目录 定义 API 场景分析 场景实验,观察Spring框架在多线程场景的执行情况 10000此请求,单线程 10000次请求,线程数加到100 对c的访问加锁 把c设为ThreadLocal 收集多 ...
- Apache Flink目录遍历(CVE-2020-17519)
1.漏洞描述 2021年1月5日,Apache Flink官方发布安全更新,修复了由蚂蚁安全非攻实验室发现提交的2个高危漏洞,漏洞之一就是Apache Flink目录遍历漏洞(CVE-2020-175 ...
- C语言:赋值语句
赋值语句 1.赋值号:= 2.赋值号具有方向性,只能将右边的常数 变量的值 表达式的值赋值给左边的变量 3.赋值号左边只能是变量,不能是表达式.常数.符号常量.常量 如下列是非法的语句:a+b=3; ...
- WIN10小技巧
WIN10激活: powershell管理员运行slmgr /skms kms.03k.orgslmgr /ato CMD:%TEMP% 全选垃圾,删除 手机投屏到WIN10:win+i---系统-- ...
- DEV C++ CPU窗口
push rbp#push实现压入操作的指令,将指定内存地址或操作数压入堆栈(先进后出)mov rbp,rsp# 将rsp所保存的地址或操作数送到目的操作数rbp(修改rbp内容)sub rsp,0x ...
- nginx+waf防火墙
1.官网下载nginx源码包(nginx-1.20.0.tar.gz) 新建nginx安装目录mkdir -p /opt/nginx新增nginx运行用户useradd -s /sbin/nol ...
- [刘阳Java]_CSS数字分页效果
先给出效果图,见下图.下图主要的完成当鼠标放到分页数字的上会呈现一个变大的效果 实现思路: (1). 使用浮动属性,以便让li元素水平排列. (2).将a元素设置为块级元素,然后设置它们的尺寸. (3 ...
- artTemplate学习
参考:https://www.2cto.com/kf/201711/699818.html 参考:https://blog.csdn.net/ruisenLi/article/details/8841 ...
- 使用jquery的on方法注册事件遇到的坑
1,使用on注册事件 $(selector).on(event,childSelector,data,function) 2,$(selector)中的selector可以是document,那么意味 ...
- Linux + .net core 开发升讯威在线客服系统:首个经过实际验证的高性能版本
业余时间用 .net core 写了一个在线客服系统.并在博客园写了一个系列的文章,写介绍这个开发过程: .net core 和 WPF 开发升讯威在线客服系统:目录 https://blog.she ...