*参照元 [#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]

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS