x86上でOSをブートする流れ
x86ハードウェア上でOSがブートされる流れを示す。ここではLinuxを例として使っているが、他のOSでも概ね同じ挙動をする。
電源を投入すると、0xFFFFFFF0 にUEFI BIOSがマップされてエントリポイントに実行を移す。
- BIOSがハードウェアを初期化(起動に必要な最低限だけ)
- CPUの機能を有効化
- メモリコントローラの初期化
これ以降で物理メモリに自由なアクセスができる。最初はUEFI BIOS領域だけなので広げていく。
- 各種ハードウェアを初期化して、メモリマップの更新
- GPTパーティションからBSPパーティションを探す
- BIOSはブートローダ(UEFIアプリ)を探して実行する
- ブートローダが /boot にBSPをマウントする
- bzImageカーネルを探す
カーネルは圧縮されていて、ヘッダに
- エントリポイントのアドレス
- 展開コード
- 圧縮されたカーネル本体のコード
が入っている。なのでまずは圧縮されたコードを展開しなければならない。
- bzImageカーネルをロードして制御を展開コードに移す
- カーネル本体が展開されるのでカーネル本体に制御を移す
- カーネルがマシンの初期化をする(ここで必要な初期化を全部する)
あとはファイルシステムをマウントしたりサービスを実行したりしていく。
- rootfs をマウント
- init を実行