中断剖析一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
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
相关文章推荐
- C++模板剖析:函数模板、类模板解析
- INIT_DELAYED_WORK和INIT_WORK定时器中断函数
- 无法解析的外部符号 _mysql_init@4,该符号在函数 _main 中被引用
- jQuery源码剖析--jQuery入口函数-init实现
- 错误 1 error LNK2019: 无法解析的外部符号 __imp____glutInitWithExit@12,该符号在函数 _glutInit_ATEXIT_HACK@8 中被引用
- Linux中__init、__devinit等初始化宏解析和入口函数
- error LNK2019: 无法解析的外部符号 _Direct3DCreate9@4,该符号在函数 "int __cdecl InitD3D(struct HWND__ *,unsigned lo
- error LNK2019: 无法解析的外部符号 ___glutInitWithExit@12,该符号在函数 _glutInit_ATEXIT_HACK@8 中被引用 1>GEARS.obj : er
- 关于stm32的MY_NVIC_Init()中断管理函数的使用心得!
- Android读取init.rc配置文件parse_config函数解析
- error LNK2019: 无法解析的外部符号 ___glutInitWithExit@12,该符号在函数 _glutInit_ATEXIT_HACK@8 中被引用 1>GEARS.obj : error LNK2019: 无法解析的外部符号 ___gl
- init_fnc_t *init_sequence[] 函数解析
- DeInit函数中不释放中断会造成什么后果?
- INIT_DELAYED_WORK() 函数剖析
- INIT_DELAYED_WORK() 函数剖析
- INIT_DELAYED_WORK() 函数剖析 (2013-01-07 15:45:11)
- DirectX的error LNK2019: 无法解析的外部符号 _Direct3DCreate9@4,该符号在函数 "long __cdecl InitD3D(struct HWND__ *)"
- 块设备剖析之块设备注册 - add_disk()函数解析
- error LNK2019: 无法解析的外部符号 ___glutInitWithExit@12,该符号在函数 _glutInit_ATEXIT_HACK@8 中被引用 1>GEARS.obj : er
- 错误 1 error LNK2019: 无法解析的外部符号 __imp____glutInitWithExit@12,该符号在函数 _glutInit_ATEXIT_HACK@8 中被引用 D:\C+