私の質問は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アドレスを分析しています。悪いケースや良いケースでは、それらの間に大きな違いは見られません。誰がこれは何を示唆することができますか?