您的位置:首页 > 其它

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

2012-04-19 22:25 253 查看
今天就将上面的函数,该函数实现的功能就是:该函数代码很小,主要就是:

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

之后再解释这些代码

现在解释一下上图的一些东东



其中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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐