我的問題將基於this code. 這是用於arm-based板(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
此外,當啓動代碼會跳轉到kernel_main
// Call kernel_main
ldr r3, =kernel_main
主要功能將調用向量表的設置是這樣的:
extern uint32_t vec_table;
void install_vector_table()
{
asm volatile("mcr p15, 0, %[r], c12, c0, 0": :[r]"r" (&vec_table):);
}
當我已經測試過這個異常是否真的發生,我注意到如果我在啓動開始時添加一些.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地址進行了分析,我發現它們在不好的情況下並沒有嚴重的區別。有人可以提出這是什麼?