デバイス(周辺機器)の検出・初期化が完了すると、システムBIOSはブートメディアの選択動作に移ります。
ブートメディアの選択と言っても、システムBIOSはあらかじめ決められている優先順位に従って、ドライブのチェックを(メディアの有無確認)するだけです。
ブート メディアの優先順位はCMOSに記録されていて、一般的に、(1)CD/DVD、(2)フロッピーディスク、(3)ハードディスクの順になっています。この優先順位はパソコン起動時のBIOS(CMOS)setupの "Boot sequence" で変更可能です。
当然ですがリムーバブル メディアドライブ(FDD, CDD)の場合は、メディアがセットされていなければスキップされます。
ハードディスが複数接続されている場合、その優先順位はハードディスを接続しているインターフェースによって決まります。インターフェース相互のデフォルトの優先順位は以下の通りに決められています。
インターフェースの種類 | 優先順位 |
高 | 低 |
ATA(IDE)とSCSI | ATA(IDE) | SCSI |
ATA(IDE)のチャネル | プライマリー | セカンダリー |
同一チャネル内 | マスター | スレーブ |
SCSIのID | 若番 | 老番 |
SCSIカードの挿入スロット | 若番 | 老番 |
優先順位に従ってチェックを進めたシステムBIOSは、最初に検出したドライブをブート メディアに決定します。
ブート メディアを決定したシステムBIOSは、そのドライブ(ディスク)の先頭セクターをロード(読み出してメモリに格納)する動作に移ります。
ディスクの先頭セクターにはブートローダー(OSを検出し起動する役目を担います)が含まれているので、システムBIOSはそちらに制御を渡して役目を終えます。
ブートローダーをロードするために、システムBIOSは次のような処理を行います。
[ 以下ではHD(ハードディスク)が選択されたものと仮定しています ]
- レジスターに選択ディスクの先頭セクター情報をセットします。
DL=ドライブ番号(ブート メディアを識別するコード。FD:0x00〜、HD:0x80〜 ) |
AH=0x02(ディスクからの読み出し) | CH=0(シリンダー番号) |
AL=0x01(読み出すセクター数) | DH=0(ヘッド番号) |
BX=0x7C00(ロードデータの格納アドレス) | CL=1(セクター番号) |
- ソフトウェア割り込み INT 13H を実行します。
INT 13H はレジスターにセットされた情報に基づいて、指定ディスクの指定セクターから読み出したデータを、指定のメモリ アドレスへ格納します。
ここでは該当ディスクの先頭セクターのデータ(ブートローダー)を、メモリ上のアドレス0x07C00から始まる領域へロードする事になります。
- ブート メディアがHDの場合、ロードしたセクター データ(512バイト)の末尾2バイトの値が、0x55AA(Boot Signature)であることを確認します。
- Boot Signatureを確認したシステムBIOSは、ブートローダーを格納してある先頭アドレス0x0000:0x7C00への far ジャンプを実行します。
以後OS起動までの処理はブートローダーによって行われる事になります。
システムBIOSの処理はここで終了し、以降はブートローダーに制御が移ります。ブートセクターやMBR(下記の囲み記事参照)に何が書き込まれるているかは、ディスクをフォーマットしたツールやインストールするブートローダーによって異なります。
ブートローダーには、OSやOSインストール時の選択によって幾つかの種類があります。またブートローダーのみを別途インストールすることも可能です。
MS-DOS等では短いコードで済むブートローダーも、WindowsやLinuxのブートローダーになると、そのコード サイズは1セクター(512バイト)に収まりません。WindowsやLinuxに使用されるブートローダーは、一般的にサイズの小さなプライマリーと、ブートローダーの中核であるセカンダリーの2段階構成となっています。
主に使用されるブートローダーの2段階の構成要素は、概ね次のように呼ばれています。
種類 | プライマリー ブートローダー | セカンダリー ブートローダー |
Windows | Boot Strap Loader | IPL(Initial Program Loader) |
grub | stage1 | stage2 |
LILO | 1st(first) boot loader | 2nd(second) boot loader |
ハードディスクの先頭セクターはMBR(Master Boot Recode)と呼ばれ、プライマリー ブートローダーやパーミッション テーブルで構成されています。
また、パーミッションの先頭セクターもブートセクターと呼ばれる特殊なセクターで、Windowsの場合はセカンダリー ブートローダーやBPB(BIOS Parameter Block)が格納されています。
システムBIOSによってメモリアドレス0x07C00にロードされたブートローダーは、CPUの制御(プログラム実行)がシステムBIOSからブートローダーへ移行(ジャンプ)することで動作を開始します。
以降各章でFDにインストールされたMS-DOSの起動、HDにインストールされたWindowsおよびLinuxのブート シーケンスを追います。
FDの先頭セクター(ブートセクター)には、MS-DOSインストール時にディスク情報等と共にIPLコード(ブートローダー)が書き込まれています。これらがシステムBIOSによってメモリの0x07C00以降のエリアにロードされ、制御が渡されることでMS-DOSの起動が始まります。