Skip to content

x86上でOSをブートする流れ

x86ハードウェア上でOSがブートされる流れを示す。ここではLinuxを例として使っているが、他のOSでも概ね同じ挙動をする。

電源を投入すると、0xFFFFFFF0 にUEFI BIOSがマップされてエントリポイントに実行を移す。

  1. BIOSがハードウェアを初期化(起動に必要な最低限だけ)
  2. CPUの機能を有効化
  3. メモリコントローラの初期化

これ以降で物理メモリに自由なアクセスができる。最初はUEFI BIOS領域だけなので広げていく。

  1. 各種ハードウェアを初期化して、メモリマップの更新
  2. GPTパーティションからBSPパーティションを探す
  3. BIOSはブートローダ(UEFIアプリ)を探して実行する
  4. ブートローダが /boot にBSPをマウントする
  5. bzImageカーネルを探す

カーネルは圧縮されていて、ヘッダに

  • エントリポイントのアドレス
  • 展開コード
  • 圧縮されたカーネル本体のコード

が入っている。なのでまずは圧縮されたコードを展開しなければならない。

  1. bzImageカーネルをロードして制御を展開コードに移す
  2. カーネル本体が展開されるのでカーネル本体に制御を移す
  3. カーネルがマシンの初期化をする(ここで必要な初期化を全部する)

あとはファイルシステムをマウントしたりサービスを実行したりしていく。

  1. rootfs をマウント
  2. init を実行