モジュールのロード
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()で行われる。)