initプロセスの起動

即/etc/initが動作を始める訳ではなく、最初は下記関数を実行するカーネルスレッドとして実行を開始する。initはファイルシステム上のinitコマンドを実行する前に、カーネル初期化処理の続き(do_basic_setup関数)を行う。 これら処理をstart_kernel関数でなく、こちらで行う理由は、start_kernel関数と異なり待ちに入ることが出来るためだと思われる。

    init()
        カーネル初期化処理を行う(do_basic_setup関数)
        標準入出力用にコンソール(/dev/console)をオープン

        if(BOOTからの要求があれば)
            BOOTから指定されたコマンドをexecする
        initコマンドをexecする
        if(initコマンドのexecに失敗したら)
            シェル(/bin/sh)をexecする

    do_basic_setup()
        (各種初期化)
            :
            :
        kflushdデーモンをカーネルスレッドとして起動
        スワップの初期化(kswapd_setup関数)
        スワップ処理のデーモン(kpiod, kswapd)をカーネルスレッドとして起動

        各種デバイスドライバの初期化(device_setup関数)
        各種実行可能オブジェクト登録(binfmt_setup関数)
        各種ファイルシステムの登録(filesystem_setup関数)
        rootファイルシステムのマウント(mount_root関数)

        if(ラムディスクがrootの場合) {
                スレッドを生成 "/linuxrc" コマンドを実行する。
        }
}

(NIS)HirokazuTakahashi
2000年06月11日 (日) 22時29分57秒 JST
1