异常种类
- 中断 IRQ FIQ 外部硬件触发
- 软中断 Soft interrupt 系统调用
- 复位 Reset 如手机死机了,按power键
- 未定义指令 Undefined instruction
- 数据异常 Data abort 数据越界
中断异常
ARM有俩级外部中断 FIQ ,IRQ
大多数基于ARM的系统有 > 2个中断源,因此需要一个中断控制器
Note: 通常中断处理程序总是包含清除中断源的代码
异常处理过程
异常向量表
异常与工作模式关系
复位,软中断 --> SVC
Prefetch(预取),Data Abort --> Abort
user system 模式不是异常触发切换的·,是程序员修改CPSR,实现切换的
软中断程序:
.text
@异常向量表
b reset @0x00 reset
ldr pc,_udef @0x04 udef
ldr pc,_swi_handler @0x08 swi 软中断程序的入口 突破32m空间的限制
ldr pc,_prefech @0x0c prefetch abort
ldr pc,_data_abort @0x10 data abort
nop @0x14 reserved
ldr pc,_irq @0x18 irq
ldr pc,_fig @0x1c fig
_udef:
.word _udef
_swi_handler:
.word swi_handler
_prefech:
.word _prefech
_data_abort:
.word _data_abort
_irq:
.word _irq
_fig:
.word _fig
swi_handler:
stmfd sp!,{r0,lr} @进栈保护现场
sub ro,lr,#4
ldr r0,[r0]
bic r0,#0xff000000
bl swi_num_handler
ldmfd sp!,{r0,pc}^ @出栈恢复现场
swi_num_handler:
@switch(num)
@{
@ case 2:
@ ...
@ case 4:
@ ...
cmp r0,#2
moveq r7,#2
cmp r0,#4
moveq r7,#4
mov pc,lr
reset:
ldr sp,=stack_base
@切换到应用程序
msr cpsr,#0x10
mov r0,#3
@ open read write ioctl ...通过系统调用访问内核数据
@ 2 4 6 7
swi 2 @跳转到异常向量表软中断的入口位置
@保存返回地址到LR
@切换到SVC工作模式
mov r1,r0
swi 4
mov r6,#3
nop
nop
swi 7
mov r8,#0
b reset
.data
buf:
.space 32
stack_base:
.end