Assembly 访问向量表时出错

Assembly 访问向量表时出错,assembly,arm,embedded,raspberry-pi2,Assembly,Arm,Embedded,Raspberry Pi2,我的问题是基于 这是基于arm的主板(rpi2)的启动代码。我最感兴趣的是与向量表设置相关的部分。向量表如下所示: // Vector table .align 4 .globl vec_table vec_table: ldr pc,add_handler_00 ldr pc,add_handler_04 ldr pc,add_handler_08 ldr pc,add_handler_0C ldr pc,add_handler_10 ldr pc,add_handler_14 ldr pc,

我的问题是基于 这是基于arm的主板(rpi2)的启动代码。我最感兴趣的是与向量表设置相关的部分。向量表如下所示:

// Vector table
.align 4
.globl vec_table
vec_table:
ldr pc,add_handler_00
ldr pc,add_handler_04
ldr pc,add_handler_08
ldr pc,add_handler_0C
ldr pc,add_handler_10
ldr pc,add_handler_14
ldr pc,add_handler_18
ldr pc,add_handler_1C
add_handler_00: .word _start
add_handler_04: .word handler_04
add_handler_08: .word handler_08
add_handler_0C: .word handler_0C
add_handler_10: .word handler_10
add_handler_14: .word handler_14
add_handler_18: .word handler_18
add_handler_1C: .word handler_1C

// Low-level vector table handlers
.macro vec_handler num
handler_\num:
    mov r0,#0x\num
    ldr r3,=exception_handler
    bx r3
.endm

vec_handler 04
vec_handler 08
vec_handler 0C
vec_handler 10
vec_handler 14
vec_handler 18
vec_handler 1C
extern uint32_t vec_table;
void install_vector_table()
{
    asm volatile("mcr p15, 0, %[r], c12, c0, 0": :[r]"r" (&vec_table):);
}
此外,当引导代码将跳转到内核_main时

// Call kernel_main
ldr r3, =kernel_main
主函数将调用向量表设置,如下所示:

// Vector table
.align 4
.globl vec_table
vec_table:
ldr pc,add_handler_00
ldr pc,add_handler_04
ldr pc,add_handler_08
ldr pc,add_handler_0C
ldr pc,add_handler_10
ldr pc,add_handler_14
ldr pc,add_handler_18
ldr pc,add_handler_1C
add_handler_00: .word _start
add_handler_04: .word handler_04
add_handler_08: .word handler_08
add_handler_0C: .word handler_0C
add_handler_10: .word handler_10
add_handler_14: .word handler_14
add_handler_18: .word handler_18
add_handler_1C: .word handler_1C

// Low-level vector table handlers
.macro vec_handler num
handler_\num:
    mov r0,#0x\num
    ldr r3,=exception_handler
    bx r3
.endm

vec_handler 04
vec_handler 08
vec_handler 0C
vec_handler 10
vec_handler 14
vec_handler 18
vec_handler 1C
extern uint32_t vec_table;
void install_vector_table()
{
    asm volatile("mcr p15, 0, %[r], c12, c0, 0": :[r]"r" (&vec_table):);
}
当我测试这个异常是否真的发生时,我注意到如果我在boot.S文件的开头添加一些.word块,异常逻辑就会停止工作。例如,如果我移动此数据

und_stack: .word 0xc0026000
dab_stack: .word 0xc0028000
svc_stack: .word 0xc0032000
从文件末尾到开始,异常停止工作。我的意思是-例如,它不调用数据中止异常处理程序,而是不断地旋转以重置

我发现:

这看起来像是对齐或绝对寻址问题,当我在开始处添加更多数据时,有些东西出现了故障。当我添加两个单词时,它如下所示:

periph_base: .word 0x3f200000
virtual_base: .word 0xc0000000
und_stack: .word 0xc0026000
dab_stack: .word 0xc0028000
如果我再加上一个词,它工作得很好,它就崩溃了。我以异常调用的方式分析了每个跳转的objdump地址,在坏的和好的情况下,我看不到它们之间的关键区别。有人能告诉我这是什么吗

它看起来像是对齐或绝对寻址问题

是的

向量表是16字节对齐的:

.align 4
.globl vec_table
vec_table:
但体系结构要求它是32字节对齐的(即与总大小对齐)-请注意,VBAR的底部5位是保留的

假设您的16字节对齐表结束于0x12340010,VBAR很可能只忽略位0-4,取有效值0x12340000,并且从该地址偏移0x10的后续数据中止将确实发生在重置处理程序中

它看起来像是对齐或绝对寻址问题

是的

向量表是16字节对齐的:

.align 4
.globl vec_table
vec_table:
但体系结构要求它是32字节对齐的(即与总大小对齐)-请注意,VBAR的底部5位是保留的

假设您的16字节对齐表结束于0x12340010,VBAR很可能只忽略位0-4,取有效值0x12340000,并且从该地址偏移0x10的后续数据中止将确实发生在重置处理程序中