exec

プロセスはexecシステムイコールにより、新しいコマンドを実行することができる。execシステムイコールは一度全ての仮想空間を解放し、その後新しい空間を生成し新しいコマンドオブジェクトをマップする。

do_execve(ファイルパス, 引数・環境)
        ファイルのオープン(open_namei関数)
        exec後のユーザID/グループID計算、ファイルヘッダの読み込み(prepare_binprm関数)
        コマンド名、環境変数、起動引数を読み込む(copy_strings関数)
        各バイナリ種別毎のハンドラ呼び出し(search_binary_handler関数)

ELFフォーマットの場合は、search_binary_handler関数から以下のload_elf_binary関数が呼び出される。ダイナミックリンクの場合、ダイナミックリンカ(ld*.so)もマップする。

load_elf_binary(linux_binprm* bprm, pt_regs* regs)
        ELFヘッダの解析
        プログラムヘッダ読み込み(kernel_read関数)
        if (インタプリタ型のプログラムヘッダがあれば) {
                インタプリタ名(ld*.so)を読み出す(kernel_read関数)
                インタプリタファイルのオープン(open_exec関数)
                インタプリタファイルのヘッダ読み込み(kernel_read関数)
        }
        空間の開放、シグナル解放、close-on-exec指定のファイルのクローズ(flush_old_exec関数)
        stack空間を生成し、環境変数/引数域をはめ込む(setup_arg_pages関数)
        for (ローダブルな全てのプログラムヘッダ) {
                ファイルを空間をマップ(elf_map, do_mmap関数)
        }
        if (ダイナミックリンクなら) {
                ダイナミックリンカのマップ(load_elf_interp関数)
        }
        ファイルの解放(sys_close関数)
        実行時のUID、GIDを決定する(compute_creds関数)
        bss領域の生成(set_brk関数)
        bss領域の0クリア(padzero関数)
        execから復帰したときのIP,SPの設定(start_thread関数)
             (ダイナミックリンクのときIPは、インタプリタのエントリを指す)

(NIS)HirokazuTakahashi
2000年12月09日 (土) 23時55分06秒 JST
1