Linuxカーネルに関する技術情報を集めていくプロジェクトです。現在、Linuxカーネル2.6解読室の第2章までを公開中。
プロセスはexecシステムイコールにより、新しいコマンドを実行することができる。execシステムイコールは一度全ての仮想空間を解放し、その後新しい空間を生成し新しいコマンドオブジェクトをマップする。
do_execve(ファイルパス, 引数・環境) ファイルのオープン(open_namei関数) exec後のユーザID/グループID計算、ファイルヘッダの読み込み(prepare_binprm関数) コマンド名、環境変数、起動引数を読み込む(copy_strings関数) 各バイナリ種別毎のハンドラ呼び出し(search_binary_handler関数)
ELFフォーマットの場合は、search_binary_handler関数から以下のdo_load_elf_binary関数が呼び出される。ダイナミックリンクの場合、ダイナミックリンカもマップする。
do_load_elf_binary(linux_binprm* bprm, pt_regs* regs) ELFヘッダの解析 プログラムヘッダ読み込み(read_exec関数) if(インタプリタ型のプログラムヘッダがあれば) { インタプリタ名(xxx.so.x)を読み出す(read_exec関数) インタプリタファイルのオープン(open_namei関数) インタプリタファイルのヘッダ読み込み(read_exec関数) } 空間の開放、シグナル解放、close-on-exec指定のファイルのクローズ(flush_old_exec関数) stack空間を生成し、環境変数/引数域をはめ込む(setup_arg_pages関数) for (ローダブルな全てのプログラムヘッダ) { ファイルを空間をマップ(do_mmap関数) } ファイルの解放(fput関数) if (ダイナミックリンクなら) { ダイナミックリンカのマップ(load_elf_interp関数) } 実行時のUID、GIDを決定する(compute_creds関数) bss領域の生成(set_brk関数) bss領域の0クリア(padzero関数) execから復帰したときのIP,SPの設定(start_thread関数) (ダイナミックリンクのときIPは、インタプリタのエントリを指す)
(NIS)HirokazuTakahashi
2000年06月11日 (日) 22時29分57秒 JST1
[PageInfo]
LastUpdate: 2008-08-27 14:46:48, ModifiedBy: hiromichi-m
[Permissions]
view:all, edit:login users, delete/config:members