[MBR の構造]
ここでは PC/AT アーキテクチャでのブートの仕組みを理解するために
必要な MBR(マスタブートレコード) の構造について解説します。
PC/AT アーキテクチャではハードディスクの先頭 512 bytes の領域を
MBR と呼び、そこには OS をブートするためのプログラムおよびハード
ディスクの 4 つのパーティション情報が格納されています(図1参照)。
通常は 1 つのハードディスクには 4 つのパーティション(正確には基
本パーティション)しか作成できません。拡張パーティションを用いる
ことで 5 つ以上のパーティションを作成することができますがここで
は拡張パーティションには触れません。
図1. MBR の構造
ハードディスクの 0x0000 から 0x01BE (446 bytes)まではブートプロ
グラムが、0x01BE から 0x01FE まではパーティション情報(16 * 4 =
64 bytes)が格納されています。0x01FE にはマジックナンバが入ってお
り、MBR の検査に使われます。
パーティションテーブルの各エントリの内容は以下の通りです。
Active | 起動フラグ。ブート可能かどうかを
示す。DOS/Windows のブートローダではこのフラグがない領域からブー
トできません。 |
Start CHS | パーティションの開始位置。CHS
(Cylinder, Head, Sector)で表現。 |
Patition ID | パーティション種別。使用し
ているファイルシステムの ID が入る。 |
End CHS | パーティションの終了位置。CHS
(Cylinder, Head, Sector) で表現。 |
Start Sector | パーティションの開始位置。
LBA (Logical Block Address) で表現。 |
# of Sector | パーティションサイズ。
LBA (Logical Block Address) で表現。 |
ここでパーティションの範囲をあらわすための情報として {Start CHS,
End CHS} と {Start Sector, # of Sector}の組の二つが存在します。
従来は CHS 方式だけでしたので {Start CHS, End CHS} のみでパーティ
ションの範囲をあらわしていました。CHS 値は 24 bits (C = 10
bits, H = 8 bits, S = 6 bits)で表現されており、1セクタ = 512
bytes 固定ですので 1パーティションの最大サイズは 2^24 * 512 =
8,589,934,592 bytes = 約 8 Gbytes となります。昔に世間を騒がせ
た 8 G bytes の壁です。
これを解決するために採用されたのが LBA (Logical Block
Addressing) 方式です。この方式は SCSI で用いられているものとほぼ
同様であり、CHS といったジオメトリでディスク上のアドレスを表現す
るのではなく、リニアアドレスを用いてディスク上のアドレスを表現す
る方式です。当時はパーティションテーブルにはまだ未使用の領域があっ
たので、その領域を利用してLBA 方式をパーティションテーブルに導入
しました。ただ、LBA 方式自体が 8Gbytes の壁を突破したのではなく、
LBA 方式を導入するときに 32bits 値で範囲を表現することにしたため、
2^32* 512 = 2,199,023,255,552 bytes = 約 2200 GBytesまで表現可能
となったというほうが正確でしょう。ジオメトリ方式でも大きい値を表
現することは可能です(E-IDE 自体は約 128 GBytes まで表現できた)。
LBA 方式に BIOS, ハードディスクコントローラの両方が対応すること
によって 8 Gbytes の壁が突破できるようになりました。ちなみに 32
GBytes の壁も少し問題になりましたが、それは LBA 方式に対応すると
きに一気に 32 bits に対応したのではなく、数 bit 拡張したのみだっ
たことに起因します。
ここまでがブートシーケンスの理解に必要な MBR に関する最低限の情
報です。理解を簡単にするためにすこし大まかな説明になっていますが、
概要はつかめてもらえたと思います。
|