カーネルの起動概要
FreeBSD のブートプロセスは、boot0 というプログラムから始まる。
Boot Manager とも呼ばれており、BIOS によってディスクから読み込まれる。
その後、カーネルを読み込み、カーネルがハードウェアを順番に初期化する。
最後に、init プロセスを起動してカーネルのブートは終了。
起動の流れ
- boot0.s (ハードディスクからのロード)
- boot0 は MBR に書かれている
- ユーザが選択したパーティションの第 1 セクタをロードする
- FreeBSD の場合は、boot1 がロードされる
- boot1.s (boot2 のロード)
- boot0 から起動され、第 2 セクタ以降に続く boot2 をロードする
- boot2 から利用されるサブルーチンを含んでいる
- btx.s (プロテクトモードへの移行)
- BTX (BooT eXtender)は、プロテクトモードで動くプログラムの為のサブルーチン群
- boot1 はリアルモードのプログラムだが、boot2 はプロテクトモード用に書かれている為、CPUの動作モードをリアルモードからプロテクトモードに切り替えなければならない
- boot2.c (カーネルのロード)
- カーネルや loader をメモリにロードするプログラム
- これらのプログラム・ファイルは、FreeBSD のファイルシステムに保存されている
- boot2 は FreeBSD のファイルシステムにアクセスできる機能を備えている
- locore.s (セグメントテーブルと割込みテーブルの初期化)
- init_main.c (ルートパーティションのマウント、システム時間の初期化)
- 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
|
-
|
!
|
void
mi_startup(void)
{
...
}
|
参考