Linux Kernel(2.6)の実装に関するメモ書き

モジュール


モジュールのロード

sys_init_module()


	load_module()
		フォーマット(ELFか?等)をチェック

		module_alloc() - 単なるvmalloc()

		セクションヘッダテーブル内の全エントリに対して以下を実行
			SHF_ALLOCが設定されているセクションを移動

		simplify_symbols()
			シンボルテーブル内の全エントリに対して以下を実行
			st_shndx: SHN_UNDEFならresolve_symbol()

		/* Now do relocations. */
		セクションヘッダテーブルを全てチェック。

		セクションのタイプが
			SHT_REL ならapply_relocate()
			SHT_RELAならapply_relocate_add()

	mod->init() - モジュールの初期化ルーチン呼び出し


resolve_symbol() - シンボルのアドレス解決
	__find_symbol() - シンボルの検索
		カーネル内のシンボルテーブルから検索
			__start___ksymtab
			__start___ksymtab_gpl

		組み込み済のモジュール内のシンボルテーブルから検索
			mod->syms[i]
			mod->gpl_syms[i]


apply_relocate() - 再配置(アドレスの書き換えを行う)

	再配置テーブル内の全エントリに対して以下を実行

		rel[i].r_offsetが指しているアドレスにシンボルテーブル
		から引っ張って来たアドレスを設定する。
		*location += sym->st_value;

		(シンボルのアドレス解決(sym->st_value)の設定は
		simplify_symbols()で行われる。)




最終更新 2006/06/23 22:23:21 - kztomita
(2006/03/27 12:59:43 作成)


リンク
最近更新したページ
検索