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

マルチプロセッサシステムであっても、システム起動時はシングルプロセッサマシンとして動作している。二つ目以降の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初期化処理用のプロセスを生成(task_structを初期化し
          init_tasksテーブルに登録)し、他のCPUを起動(smp_boot_cpus関数)
        二つ目のCPUの初期化処理との同期をとる(smp_commence関数)

起動された二つ目以降のCPUもやはり一つ目のCPUと同様にLinuxカーネルテキストの先頭stextから実行を開始する。一つ目のCPUの場合はstart_kernel関数を呼び出すが、二つ目以降のCPUの場合は、initialize_secondary関数を呼び出す。

このinitialize_secondary関数は、一つ目のCPUが先のsmp_boot_cpus関数で生成した初期化プロセスのコンテキストのロードを行う。

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

    stext() {
            :
            :
        ★if (二つ目以降のCPUの場合は)
                 initialize_secondary();
          else /* 一つ目のCPUの場合 */
                 start_kernel();
    } /* never return here */

    start_secondary()
        CPUコンテキストの初期化(cpu_init関数)
        CPU固有の初期化処理(smp_callin関数)
           (ローカルタイマーの起動などもここでおこなう)
        1一つ目のCPU初期化完了との同期をとる(ビジーウェイト)
        このCPU上で動くアイドルプロセスとなる(cpu_idle関数)
img129.gif

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