2016-12-11 76 views
0

我的問題將基於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地址進行了分析,我發現它們在不好的情況下並沒有嚴重的區別。有人可以提出這是什麼?

回答

3

它看起來像比對或絕對解決問題

它。

你的矢量表16字節對齊:

.align 4 
.globl vec_table 
vec_table: 

但架構要求它是32字節對齊的(即,它的總大小) - 注意,直條的底部位保留。假設你的16字節對齊的表最終在0x12340010,那麼VBAR可能會忽略位0-4,取得有效值0x12340000,並且後續數據中止用來從該地址偏移0x10確實會發生登陸你的重置處理程序。