マルチプロセッサシステムの起動

マルチプロセッサシステムであっても、システム起動時はシングルプロセッサマシンとして動作している。二つ目以降のCPUの起動は、一つ目のCPUがカーネル初期化関数(start_kernel関数)の一番最後に呼び出す関数 smp_init関数にて行われる。

smp_init関数では各CPU専用の初期化プロセスを生成する。これら、各CPU専用の初期化プロセスは、start_secondary関数から実行を開始するようにコンテキストを初期化する。各CPU専用の初期化プロセスの生成完了後に、ハード的に各CPUの起動を行う。

    start_kernel()
        (各種初期化処理)
            :
            :
            :
        ★smp_init();
        initプロセス起動(kernel_thread(init)関数)
    smp_init()
        他のCPU初期化処理様のプロセスを生成し、他のCPUの起動(smp_boot_cpus関数)
        他のCPUと同期をとる(smp_commence関数)

起動された二つ目以降のCPUもやはり一つ目のCPUと同様にLinuxカーネルテキストの先頭stextから実行を開始する。その後、start_kernel関数が呼び出されるが、start_kernel関数先頭の判定文があり、二つ目以降のCPUはinitialize_secondary関数を実行する。このinitialize_secondary関数は、一つ目のCPUが先のsmp_boot_cpus関数で生成した初期化プロセスのコンテキストのロードを行う。

ロードを行った直後、二つ目以降のCPU上では初期化プロセスがstart_secondary関数から実行を開始する。二つ目以降のCPU上で動作する初期化プロセスは処理が終了するとそのままアイドルプロセスへと変化する。その後は、スケジューラによりプロセスが割り当てらられるのを待ち続ける。

    start_kernel()
        ★if (二つ目以降のCPUの場合は) initialize_secondary();

        Linux起動メッセージの出力
        (各種初期化処理)
            :
            :
            :

    start_secondary()
        CPU固有の初期化処理(smp_callin関数)
           (ローカルタイマーの起動などもここでおこなう)
        1一つ目のCPUとの同期をとる
        このCPU上で動くアイドルプロセスとなる(cpu_idle関数)

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