资源描述:
《arm linux 中断分析》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、ARMLinux中断分析 ARM体系结构中,把复位、中断、快速中断等都看作‘异常’,当这些‘异常’发生时,CPU会到固定地址处去找指令,他们对应的地址如下:地址异常类型进入时的工作模式0x00000000ResetSupervisor0x00000004UndUndefined0x00000008SoftinteruptSupervisor0x0000000c Abort(prefetch) Abort0x00000010Abort(data)Abort0x00000014Reserved Reserved0x00000018IRQIRQ0x0000001cFIQFIQ
2、首先要明确的一点就是,无论内存地址空间是如何映射的,以上这些地址都不会变,比如当有快速中断发生时,ARM将铁定到0X0000001C这个地址处取指令。这也是BOOTLOADER把操作系统引导以后,内存必须重映射的原因!否则操作系统不能真正接管整套系统! LINUX启动以后要初始化这些区域,初始化代码在main.c中的start_kernel()中,具体是调用函数trap_ini()来实现的。如下面所示(具体可参照entry-armv.S):.LCvectors: swi SYS_ERROR0 b __real_stubs_start+(ve
3、ctor_undefinstr-__stubs_start) ldr pc,__real_stubs_start+(.LCvswi-__stubs_start) b __real_stubs_start+(vector_prefetch-__stubs_start) b __real_stubs_start+(vector_data-__stubs_start) b __real_stubs_start+(vector_addrexcptn-__stubs_start
4、) b __real_stubs_start+(vector_IRQ-__stubs_start) b __real_stubs_start+(vector_FIQ-__stubs_start)ENTRY(__trap_init) stmfd sp!,{r4-r6,lr} adr r1,.LCvectors @setupthevectors ldmiar1,{r1,r2,r3,r4,r5,r6,ip,lr}
5、 stmiar0,{r1,r2,r3,r4,r5,r6,ip,lr} add r2,r0,#0x200 adr r0,__stubs_start @copystubsto0x200 adr r1,__stubs_end1: ldr r3,[r0],#4 str r3,[r2],#4 cmp r0,r1 blt 1b LOADREGS(fd,sp!,{r4-r6,p
6、c}) 以上可以看出这个函数初始化了中断向量,实际上把相应的跳转指令拷贝到了对应的地址。当发生中断时,不管是从用户模式还是管理模式调用的,最终都要调用do_IRQ():__irq_usr: sub sp,sp,#S_FRAME_SIZE stmiasp,{r0-r12} @saver0-r12 ldr r4,.LCirq add r8,sp,#S_PC ldmiar4,{r5-r7} @getsa
7、vedPC,SPSR stmiar8,{r5-r7} @savepc,psr,old_r0 stmdb r8,{sp,lr}^ alignment_trapr4,r7,__temp_irq zero_fp1: get_irqnr_and_baser0,r6,r5,lr movne r1,