Top > FreeBSD > 起動概要


カーネルの起動概要

FreeBSD のブートプロセスは、boot0 というプログラムから始まる。 Boot Manager とも呼ばれており、BIOS によってディスクから読み込まれる。
その後、カーネルを読み込み、カーネルがハードウェアを順番に初期化する。 最後に、init プロセスを起動してカーネルのブートは終了。


起動の流れ

  1. boot0.s (ハードディスクからのロード)
    • boot0 は MBR に書かれている
    • ユーザが選択したパーティションの第 1 セクタをロードする
    • FreeBSD の場合は、boot1 がロードされる

  2. boot1.s (boot2 のロード)
    • boot0 から起動され、第 2 セクタ以降に続く boot2 をロードする
    • boot2 から利用されるサブルーチンを含んでいる

  3. btx.s (プロテクトモードへの移行)
    • BTX (BooT eXtender)は、プロテクトモードで動くプログラムの為のサブルーチン群
    • boot1 はリアルモードのプログラムだが、boot2 はプロテクトモード用に書かれている為、CPUの動作モードをリアルモードからプロテクトモードに切り替えなければならない

  4. boot2.c (カーネルのロード)
    • カーネルや loader をメモリにロードするプログラム
    • これらのプログラム・ファイルは、FreeBSD のファイルシステムに保存されている
    • boot2 は FreeBSD のファイルシステムにアクセスできる機能を備えている

  5. locore.s (セグメントテーブルと割込みテーブルの初期化)
  6. init_main.c (ルートパーティションのマウント、システム時間の初期化)
  7. init プロセスの起動
    • locore.s 内で、CPU アーキテクチャに依存しない初期化が先に行われる
    • その後、mi_startup() が呼ばれ、下記処理を行う
      • メモリアロケータの初期化
      • swapperの生成 (process 0)
      • init プロセスの生成
      • アイドルスレッドの生成
      • init を実行可能に設定し、その他のカーネルスレッドを生成


mi_startup()

  • sys/kern/init_main.c 内に、大まかな処理概要とコードが記述されている
  • 関数自体は、登録されている初期化オブジェクトを順に実行するだけのシンプルな仕組み
    すべてを展開すべてを収束
      1
      2
      3
      4
      5
      6
      7
      8
      9
     10
     11
     12
     13
     14
     15
     16
    
     
     
     
     
     
     
     
     
     
     
     
     
     
    -
    |
    !
    
    /*
     * System startup; initialize the world, create process 0, mount root
     * filesystem, and fork to create init and pagedaemon.  Most of the
     * hard work is done in the lower-level initialization routines including
     * startup(), which does memory initialization and autoconfiguration.
     *
     * This allows simple addition of new kernel subsystems that require
     * boot time initialization.  It also allows substitution of subsystem
     * (for instance, a scheduler, kernel profiler, or VM system) by object
     * module.  Finally, it allows for optional "kernel threads".
     */
    void
    mi_startup(void)
    {
      ...
    }


参考


リロード   凍結解除 コピー 名前変更   ホーム 一覧 検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS
Last-modified: Mon, 03 Jun 2019 14:37:49 UTC (865d)