ARM 异常处理过程,指令[ swi ]
1. 发生异常:
程序正常执行,突然被一个不正常的事件打断正在执行的程序,执行相应的异常事件对应的程序
2. 5 种异常模式对应着 7 种异常源:
异常工作模式 异常源
FIR FIR
IRQ IRQ
Abort data_abort / pref_abort
Undef undefine
SVC reset复位 / swi软中断指令
3. 同种异常源不可以被打断,reset 优先级最高,打断任何程序执行
4. 异常处理过程:
保护现场:由 CPU 自动完成,通过 4 步完成 ; 通用寄存器CPSR 中的状态,改变CPU状态
(1)CPU 保存现场当前状态 CPSR 到异常模式下的 SPSR 中 ,这步的目的是保护当前状态的CPSR(每种异常模式都对应一个自己的SPSR,以便将来在异常返回时,从SPSR恢复至CPSR)
(2)CPU 修改 CPSR 中 模式位,禁止相应中断源,切换 CPU 状态为ARM 状态(Thumb态和ARM态由CPSR的T位来决定)
(3)保存的返回地址到对应异常模式下的LR 寄存器中。(返回地址:异常发生前正在执行指令的下一条地址)
(4)pc 指向异常向量表中对应的异常
恢复现场: 需要自己手动完成(手动修改寄存器 CPSR 中对应的状态位)
(1) 把异常模式下的 SPSR_MODE 恢复到CPSR中
(2)把 异常模式下的 LR_MODE 恢复到 PC中
5. 异常向量表
1)异常向量表就是内存的一块空间,这块内存的空间的大小为32byte,平均分成了8份,每份4个byte,然后在里边存放7中异常源,多余的一份保留不用
2) 在异常量表中存放的一条跳转指令
3) 7种异常源在异常向量表中的位置固定,不可以随意更改。
示例: 手动修改到user模式,然后使用 swi 软中断切换到 SVC 异常模式
.text
.global _start
_start:
b reset_handler
b undef_handler
b swi_handler
b pref_abort_handler
b data_abort_handler
b .
b irq_handler
b fiq_handler reset_handler: @ 复位开始为 SVC 模式
ldr sp, =0x40000200 @ 初始化栈
mrs r0, cpsr @ 读取程序状态寄存器
mov r1, #0x1F
mvn r1, r1
and r0, r0, r1
mov r1, #0x10
orr r0, r0, r1 @ 修改 读取 的CPSR 中的数据, 然后再重新写入CPSR 寄存器
msr cpsr, r0 @ 保存状态寄存器 此时改为 user 模式
ldr sp, =0x40000100 @ 初始化此状态下的 sp 指针
swi # @ 使用指令 swi 产生异常,异常号为
mov r0, #
mov r1, #
swi # @ 使用指令 swi 产生异常,异常号为
mov r0, #
mov r1, #
loop:
b loop undef_handler:
swi_handler: @ 切换模式后, 先进行现场保护, cpsr和lr值保存,修改cpsr切换模式
.if
stmfd sp!, {r0-r10, lr} @ 入栈 拷贝过来的lr 值, lr内容没有改变
mov r0, #
mov r1, #
ldmfd sp!, {r0-r10, r12} @ 出栈
mrs r11, spsr
msr cpsr, r11
mov pc, r12 @ 恢复现场
.else
stmfd sp!, {r0-r12, lr}
mov r0, #
mov r1, # mov r0, lr
sub r0, r0, # @ 获取 lr 上一条指令(也就是swi)的地址
ldr r1, [r0] @ 提取 swi 指令对应的机器码
ldr r2, =0xFFFFFF @ 提取后24位 对应的 num号
and r0, r1, r2 @根据r0判断具体是哪个地方的swi ldmfd sp!, {r0-r12, pc}^ @ 恢复现场, ^ 表示同时操作两个步骤
.endif pref_abort_handler:
data_abort_handler:
irq_handler:
fiq_handler: .end
ARM 异常处理过程,指令[ swi ]的更多相关文章
- 四、ARM 异常处理
4.1 模式与异常 当正常程序流程被暂时停止发生异常,例如响应一个来自外设的中断.在处理异常前,必须保护当前的处理器状态,以便在完成处理程序后能恢复到原来的程序 . 异常的类型: Reset unde ...
- Linux kernel的中断子系统之(六):ARM中断处理过程
返回目录:<ARM-Linux中断系统>. 总结:二中断处理经过两种模式:IRQ模式和SVC模式,这两种模式都有自己的stack,同时涉及到异常向量表中的中断向量. 三ARM处理器在感知到 ...
- or1200处理器的异常处理类指令介绍
下面内容摘自<步步惊芯--软核处理器内部设计分析>一书 我们在计算机体系结构的学习中知道:中断实质上包含由外部事件引起的硬中断(又称外中断)和由内部预先安排的特定指令或内部异常引起的软中断 ...
- ARM的栈指令
ARM的指令系统中关于栈指令的内容比较容易引起迷惑,这是因为准确描述一个栈的特点需要两个参数: 栈地址的增长方向:ARM将向高地址增长的栈称为递增栈(Descendent Stack),将向低地址增长 ...
- ARM的栈指令(转)
ARM的指令系统中关于栈指令的内容比较容易引起迷惑,这是因为准确描述一个栈的特点需要两个参数: 栈地址的增长方向:ARM将向高地址增长的栈称为递增栈(Descendent Stack),将向低地址增长 ...
- ARM指令集—SWP指令
ARM指令集-SWP指令 SWP和SWPB是ARM指令集中对存储单元的原子操作.即对存储单元的一次读和一次不可被切割. SWP和SWPB分别完毕存储器和寄存器之间 一个字(32bit)和一个字节(8b ...
- (二十三)ARM平台NEON指令的编译和优化
ARM平台NEON指令的编译和优化 本文介绍了ARM平台基于ARM v7-A架构的ARM Cortex-A系列处理器(Cortex-A5, Cortex-A7,Cortex-A8, Cortex-A9 ...
- Linux中断 - ARM中断处理过程
一.前言 本文主要以ARM体系结构下的中断处理为例,讲述整个中断处理过程中的硬件行为和软件动作.具体整个处理过程分成三个步骤来描述: 1.第二章描述了中断处理的准备过程 2.第三章描述了当发生中的时候 ...
- ARM指令集——数据处理指令
ARM汇编指令集 ARM汇编文件的组成 指令:编译完成后作为一条指令(机器码)存储在内存单元中,CPU执行时能够完成处理的操作 伪指令:在编译时替换成能被识别的ARM指令 伪操作:知道编译器进行编译, ...
随机推荐
- Java技术专区-虚拟机系列-虚拟机参数(常用)
基础参数系类(内存分配) -server:一定要作为第一个参数,在多个CPU时性能佳 -Xmn:young generation的heap大小,一般设置为Xmx的3.4分之一-Xms:初始Heap大小 ...
- Maven入门指南11:使用Nexus搭建Maven私服
1 . 私服简介 私服是架设在局域网的一种特殊的远程仓库,目的是代理远程仓库及部署第三方构件.有了私服之后,当 Maven 需要下载构件时,直接请求私服,私服上存在则下载到本地仓库:否则,私服请求外部 ...
- 算法竞赛模板 AC自动机
AC自动机基本操作 (1) 在AC自动机中,我们首先将每一个模式串插入到Trie树中去,建立一棵Trie树,然后构建fail指针. (2) fail指针,是穿插在Trie树中各个结点之间的指针,顾名思 ...
- KiCAD实用操作
KiCAD实用操作之一:自动编辑线宽 今天偶然间发现的一个比较实用的功能,算是KiCAD的一个优点吧(或许是在AD上面没发现):当整个PCB布完线或者在布线过程中,我们有可能需要对某个线的宽度进行调整 ...
- 获取min-max之间的随机数
private static String getRandom(int min, int max){ Integer random =(int)(min+Math.random()*(max-min+ ...
- 浏览器表单默认记忆功能input的 autocomplete="off"属性
一般情况下浏览器会有自动记录密码等的功能,但是有时候我们不需要这样的功能,下面有两种情况下关闭记忆功能有效: 1:在form中,如果有input[type=password],autocomplete ...
- linux find相关 (持续更新中)
按名字查找 find . -name *.txt find . -name test* # . 指的是当前路径, 查找全局的话把. 换成/ 查找并删除多个文件 find -type f -name & ...
- python爬虫 mac下安装使用Fiddler
HTTP代理工具Fiddler Fiddler是一款强大Web调试工具,它能记录所有客户端和服务器的HTTP请求. Getting started 在安装之前需要准备Mono环境 If you don ...
- 二叉树总结及部分Lintcode题目分析 1
1. 遍历问题 Preorder / Inorder / Postorder preorder: root left right inorder: left root right postorder: ...
- linux:lrzsz安装
Linux中的lrzsc是linux里可代替ftp上传和下载的程序. yum install lrzsc 没有可用软件包 lrzsc. 这时使用 -y即可安装 centos安装:yum -y inst ...