2016-12-11 6 views
0

私の質問はthis code.に基づいています これはアームベースのボード(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 

、ブートコードは、このようなベクタテーブルの設定呼ぶよう

// Call kernel_main 
ldr r3, =kernel_main 

主な機能をkernel_mainにジャンプしますとき:

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ブロックを追加すると、例外ロジックが機能しなくなります。たとえば、このデータを移動すると、ファイルの最後から最初に、このデータを移動すると、例外が機能しなくなります。つまり、データの中断例外ハンドラを呼び出す代わりに、リセットするために常に回転しています。

をそれはアライメントまたは絶対アドレス指定の問題、私が最初にデータを追加する場合であるが故障した何かのようになります。私が発見した何

。 2つの単語を追加すると、次のように表示されます。

periph_base: .word 0x3f200000 
virtual_base: .word 0xc0000000 
und_stack: .word 0xc0026000 
dab_stack: .word 0xc0028000 

もう1つ言葉を追加すると問題なく動作します。私は例外コールの方法で各ジャンプのobjdumpアドレスを分析しています。悪いケースや良いケースでは、それらの間に大きな違いは見られません。誰がこれは何を示唆することができますか?

答えて

3

それはあるアライメントまたは絶対アドレス指定の問題

ように見えます。

あなたのベクタテーブルは、16バイト境界で整列され:

.align 4 
.globl vec_table 
vec_table: 

しかしアーキテクチャは32バイト境界で整列されることを必要とする(すなわち、その合計サイズまで) - VBARの底ビットがあることに注意予約済み。

16バイト境界に整列したテーブルが0x12340010になると、VBARはビット0-4を無視し、実効値0x12340000を受け取り、そのアドレスからオフセット0x10に引き続くデータアボートが発生しますあなたのリセットハンドラに入ってください。

関連する問題