void __init early_trap_init(void)
memcpy((void *)KERN_SIGRETURN_CODE, sigreturn_codes,
sizeof(sigreturn_codes)); //复制代码向量表
memcpy((void *)KERN_RESTART_CODE, syscall_restart_code,
sizeof(syscall_restart_code));//复制应用代码部分
.globl __vectors_start
__vectors_start:
ARM( swi SYS_ERROR0 )//复位是,cpu跳转的指令
THUMB( svc #0 )
THUMB( nop )
W(b) vector_und + stubs_offset //未定义异常时,CPU将执行的指令
W(ldr) pc, .LCvswi + stubs_offset //SWI 异常
W(b) vector_pabt + stubs_offset //指令预取终止异常
W(b) vector_dabt + stubs_offset //数据访问终止异常
W(b) vector_addrexcptn + stubs_offset //没有到
W(b) vector_irq + stubs_offset//IRQ 异常
W(b) vector_fiq + stubs_offset //FIQ异常
/*
* Interrupt dispatcher
*/
vector_stub irq, IRQ_MODE, 4 //计算处理完异常后返回的地址,保存寄存器(r0,lr,spsr)然后进入管理员模式,最后根据被被中断的工作模式调用下面的某个分支
.long __irq_usr @ 0 (USR_26 / USR_32) //在用户模式下发生的中断
.long __irq_invalid @ 1 (FIQ_26 / FIQ_32) //不可能发生的情况,用irq_invalid处理
.long __irq_invalid @ 2 (IRQ_26 / IRQ_32)
.long __irq_svc @ 3 (SVC_26 / SVC_32) //在管理员模式下发生的异常
.long __irq_invalid @ 4
.long __irq_invalid @ 5
.long __irq_invalid @ 6
.long __irq_invalid @ 7
.long __irq_invalid @ 8
.long __irq_invalid @ 9
.long __irq_invalid @ a
.long __irq_invalid @ b
.long __irq_invalid @ c
.long __irq_invalid @ d
.long __irq_invalid @ e
.long __irq_invalid @ f