PC起動時のフロー - MBRとブートローダとパーティションテーブル

先日、Linuxを入れていたPCにWindowsを入れようとしたら上手くブートできなくなるという事態が発生したので、これを期にブート回りをちゃんと勉強しなおしてみました。
忘れないようにメモ書き。

PC起動時のフロー

  1. M/B上のBIOSが起動する。
  2. BIOSは初期化処理後、起動ドライブを探す。
  3. 起動ドライブの先頭セクタがロードされ、MBRが読み込まる。
  4. ブートローダが作動し、パーティションテーブルの4つのテーブルエントリーから起動フラグが立っている基本領域が無いか探す。
  5. 起動フラグの立っている基本領域が見つかったらその領域の先頭位置をパーティションテーブルから取得する。
  6. BIOSにその位置にあるブートセクタをロードしてもらい、制御を受け渡す。
  7. OS固有の起動処理。

MBRとは

マスターブートレコード(Master Boot Record)の略。
ハードディスクの先頭部分(セクタ)に置かれ、パソコン起動時に最初に読み込まれる。

PC/AT互換機におけるマスターブートレコードの構造は以下

アドレス 内容 サイズ
0000 ブートローダ 446
01BE パーティションテーブル 64
01FE ブートシグニチャ 2

サイズは計512バイトで、ブートシグニチャは「MBRが有効である」事を示す固定値(0xAA55)が入る。

ブートローダとは

またはブートストラップローダ、マスターブートローダ、マスターブートコード、イニシャル・プログラム・ローダ(正式な名称はない)。
電源を入れた後、OS起動までの一連の処理を行うソフトウェア。
ブートローダは多段階で使われ、MBRに記録されたプログラムがさらに別のプログラムを呼ぶ。
MBRに記録されているプログラムは非常に小さいが、OSをロードして起動するための別のプログラムをロードするには十分な機能を持っている。

パーティションテーブルとは

ディスクのパーティション情報を管理している領域。
4エントリあり、それぞれ以下の情報を持つ。

アドレス 内容 サイズ
0x00 ブート可能かどうかのフラグ(「PC起動時のフロー」での起動フラグはこれ) 1
0x01 パーティションの開始位置(CHS方式) 3
0x04 パーティションのタイプ(NTFSとかFAT32とか) 1
0x05 パーティションの終了位置(CHS方式) 3
0x08 パーティションの開始位置(LBA方式) 4
0x0C 総セクター数(LBA方式) 4
サンプル

自分のWinPCのMBRをダンプして、パーティションテーブル部分を抜き出してみたのが下記。

第1エントリ - 80 00 01 fe 07 ff ff 00 3f 00 00 ea cc 09 ff 00
第2エントリ - 00 ff c1 fe 0f ff ff eb 0b 09 ff ac f5 1b 42 00
第3エントリ - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
第4エントリ - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

第1エントリに起動フラグが立っていて、第2エントリは拡張DOS領域(拡張パーティション)となっている事等が分かる。(第3エントリ、第4エントリはnull)
ここで示されている各パーティションの先頭位置にはブートセクタ (PBR) が存在するが、拡張パーティションの場合はMBRと同じ構成の拡張ブートレコード (EPBR)が存在し、パーティションテーブルの最初の2エントリのみが使用される(拡張パーティションテーブル)。
この拡張ブートレコード (EPBR)は、第1エントリに自身のブートセクタ(PBR)の位置を、第2エントリに次のパーティションのEPBRの位置を管理することにより、入れ子になる形で多数のパーティションの作成が可能となっている。