Linux Version : 2.6.29
1. start_kernel-->setup_arch-->early_trap_init
1: memcpy((void *)vectors, __vectors_start, __vectors_end - __vectors_start);
2: memcpy((void *)vectors + 0x200, __stubs_start, __stubs_end - __stubs_start);
3: memcpy((void *)vectors + 0x1000 - kuser_sz, __kuser_helper_start, kuser_sz);
对于第一行:
__vectors_start 和 __vectors_end 定义在 arch/arm/kernel/entry-armv.S , 它们之间保存了中断向量表。
1:
.globl __vectors_start
2:
__vectors_start:
3:
swi SYS_ERROR0
4:
b vector_und + stubs_offset
5:
ldr pc, .LCvswi + stubs_offset
6:
b vector_pabt + stubs_offset
7:
b vector_dabt + stubs_offset
8:
b vector_addrexcptn + stubs_offset
9:
b vector_irq + stubs_offset
10:
b vector_fiq + stubs_offset
11:
12:
.globl __vectors_end
13:
__vectors_end:
vectors 的地址为CONFIG_VECTORS_BASE , 在.config中定义为0xffff0000
所以 第1行就是把中断向量表拷贝到0xffff0000
对于第二行:
vector_stub是一个带参数的宏,第一个是name,第二个是arm excepiton mode,第三个是为了得到返回地址,lr需要减去的偏移
1:
.macro vector_stub, name, mode, correction=0
2:
.align 5
3:
4:
vector_/name:
5: .if /correction
6:
sub lr, lr, #/correction @得到正确的返回地址
7:

本文详细解析了Linux 2.6.29版本中ARM架构的中断向量表建立流程,包括从start_kernel到setup_arch再到early_trap_init的步骤。介绍了__vectors_start和__vectors_end在entry-armv.S中的定义,以及中断向量表被拷贝到0xffff0000的过程。同时,文章阐述了vector_stub宏的作用,以及不同异常模式下的处理入口。通过分析汇编代码,解释了异常入口如何使用‘b’指令跳转,并通过objdump反汇编验证了计算的正确性。

1697

被折叠的 条评论
为什么被折叠?



