*参照元 [#t353b33b] #backlinks *説明 [#wf05c71b] -パス: [[linux-2.6.33/arch/arm/kernel/traps.c]] -FIXME: これは何? --割り込みベクタの初期化を行う。 -基本的には、割り込みベクタ -> スタブ関数 -> 例外ハンドラへ制御が移る。 -基本的には、例外発生 -> 例外ベクタ -> スタブ関数 -> 例外ハンドラへ制御が移る。 --詳細は vector_stub マクロにて説明しています。 --[[linux-2.6.33/vector_stub()]] -例外ベクタとスタブ関数、補助ルーチンについて。 割り込みベクタ、スタブ関数、補助ルーチンの配置 ---------------------------------------- (*1) vectors = CONFIG_VECTORS_BASE (*2) kuser_sz = __kuser_helper_start 〜 __kuser_helper_end のサイズ vectors --> +--------+ | | | | <-- __vectors_start 〜 __vectors_end をコピー | | br 命令や ldr pc, address などが並んでいる。 | | 1エントリの長さ = 1命令分(32bit) vectors --> +--------+ + 0x200 | | | | <-- __stubs_start 〜 __stubs_end をコピー | | ベクタのジャンプ命令でこの領域にある | | スタブ関数にジャンプする。 vectors --> +--------+ + stubs の | | サイズ | | | 空 | | | | | vectors --> +--------+ + 0x1000 | | - kuser_sz | | | | <-- __kuser_helper_start 〜 __kuser_helper_end をコピー | | vectors --> +--------+ + 0x1000 --[[linux-2.6.33/CONFIG_VECTORS_BASE]] --[[linux-2.6.33/vector_stub()]] **引数 [#uf337ba7] -なし **返り値 [#qf61c5c2] -なし **参考 [#cdd45586] *実装 [#i41ec67f] void __init early_trap_init(void) { unsigned long vectors = CONFIG_VECTORS_BASE; - --[[linux-2.6.33/]] extern char __stubs_start[], __stubs_end[]; extern char __vectors_start[], __vectors_end[]; extern char __kuser_helper_start[], __kuser_helper_end[]; int kuser_sz = __kuser_helper_end - __kuser_helper_start; - --[[linux-2.6.33/__stubs_start(global)]] - --[[linux-2.6.33/__stubs_end(global)]] - --[[linux-2.6.33/__vectors_start(global)]] - --[[linux-2.6.33/__vectors_end(global)]] - --[[linux-2.6.33/__kuser_helper_start(global)]] - --[[linux-2.6.33/__kuser_helper_end(global)]] /* * Copy the vectors, stubs and kuser helpers (in entry-armv.S) * into the vector page, mapped at 0xffff0000, and ensure these * are visible to the instruction stream. */ memcpy((void *)vectors, __vectors_start, __vectors_end - __vectors_start); - --[[linux-2.6.33/memcpy()]] memcpy((void *)vectors + 0x200, __stubs_start, __stubs_end - __stubs_start); memcpy((void *)vectors + 0x1000 - kuser_sz, __kuser_helper_start, kuser_sz); /* * Copy signal return handlers into the vector page, and * set sigreturn to be a pointer to these. */ memcpy((void *)KERN_SIGRETURN_CODE, sigreturn_codes, sizeof(sigreturn_codes)); - --[[linux-2.6.33/KERN_SIGRETURN_CODE]] - --[[linux-2.6.33/sigreturn_codes()]] memcpy((void *)KERN_RESTART_CODE, syscall_restart_code, sizeof(syscall_restart_code)); - --[[linux-2.6.33/KERN_RESTART_CODE]] - --[[linux-2.6.33/syscall_restart_code()]] flush_icache_range(vectors, vectors + PAGE_SIZE); - --[[linux-2.6.33/flush_icache_range()]] modify_domain(DOMAIN_USER, DOMAIN_CLIENT); - --[[linux-2.6.33/modify_domain()]] - --[[linux-2.6.33/DOMAIN_USER]] - --[[linux-2.6.33/DOMAIN_CLIENT]] } *コメント [#qe67de77]