中断剖析一early_trap_init()函数解析

今天就将上面的函数,该函数实现的功能就是:该函数代码很小,主要就是:

  memcpy((void *)vectors, __vectors_start, __vectors_end - __vectors_start);
    memcpy((void *)vectors + 0x200, __stubs_start, __stubs_end - __stubs_start);而关于vector变量, __vectors_start, __vectors_end  ,__stubs_start, __stubs_end 变量都在arch/arm/kernel/entry-armv.s中定义。其中__vectors_start, __vectors_end 地址之间是有关异常向量表,__stubs_start, __stubs_end 存放的是异常变量表跳转的位置。

.globl __vectors_start

__vectors_start:


        swi SYS_ERROR0:

        b vector_und + stubs_offset //复位异常:

        ldr pc, .LCvswi + stubs_offset        //未定义指令异常:

        b vector_pabt + stubs_offset        //软件中断异常:

        b vector_dabt + stubs_offset        //数据异常:

        b vector_addrexcptn + stubs_offset        //保留:

        b vector_irq + stubs_offset        //普通中断异常:

        b vector_fiq + stubs_offset        //快速中断异常:

        .globl __vectors_end:

__vectors_end:


__stubs_start, __stubs_end 地址之间:__stubs_start:
。。。。
__stubs_end
之后再解释这些代码

现在解释一下上图的一些东东
中断剖析一early_trap_init()函数解析_第1张图片
其中irq_PC就是异常向量表跳转指令的对应标号。而vector_irq就是跳转的对应的位置。其中有关 stubs_offset的定义,大家结合上图,就是vector_irq相对于中断入口地址0xffff0000(vector)的偏移量。就是200+vector_irq在stubs中的偏移量再减去中断入口在向量表中的偏移量,即200+ vector_irq-stubs_start-irq_PC+vectors_start = (vector_irq-irq_PC) + vectors_start+200-stubs_start,对于括号内的值实际上就是中断向量表中写的vector_irq,减去irq_PC是由汇编器完成的,而后面的 vectors_start+200-stubs_start就应该是stubs_offset


你可能感兴趣的:(linux,vector,user,domain,Signal,linux内核)