下面的图是2440的中断向量表
我们可以看到这个中断向量表是4字节对齐
其中 supervisor 的模式表示的是管理模式 此模式相当于管理员模式 可以访问硬件,如果死机则需要重启
undefined 模式 当命令或者地址不是2440所定义的命令 则触发其中断
FIQ 快速中断模式
IRQ 普通中断模式
其中可以看到未定义指令异常是在04这个地方
1. 首先看手册
这里是异常中断之后的寄存器,其中加灰色三角的表示此寄存器是唯一的 不与其他的寄存器共用,只是当进入此模式的时候才使用其寄存器。比如undefined mode 自己的寄存器是R13 和 R14里面分别存的是R13 是这个模式下的栈 需要存入栈的地址。R14是存入发生异常之后那条命令的地址 用来返回原先程序 R15是PC指针。
当发生异常的时候 CPU会做如下事情(ARM 模式下):
1. ARM会自动的把这个异常的下一句话保存到R14
2. 把之前的CPSR的状态拷贝到SPSR
3. 根据发生不同的异常 CPSR会发生了变化 (如下图)
4. PC会指向中断的片段。。
程序要做的事情是:
1. 我们需要保存R1-R12 和 R14的数据 包括一般数据和返回主程序的地址 保存在栈里面
2. 在中断中处理信息 (注意 R0 和 R1存可存入C语言的函数入口变量)
3. 把所有的寄存器的数据弹出栈,把R14返回的地址给PC
ldr sp ,= 0x34000000 //先建立栈
stmdb sp!, {r0, r12, lr} //把数据存入栈
msr r0, cpsr /*把CPSR 的值读入r0*/
ldr r1, = und_string
bl print_und
/**恢复现场**/
ldmia sp, {r1, r12, pc}^ //恢复现场