パソコン実習室
ブート ストラップ - パソコンの起動 by BIOS
≪ previous next ≫

U.4.ブート メディアの選択

 デバイス(周辺機器)の検出・初期化が完了すると、システムBIOSはブートメディアの選択動作に移ります。

ブートメディア : 起動対象OSが記録されている媒体(ハードディスク、フロッピーディスク、USBメモリ等)

 ブートメディアの選択と言っても、システムBIOSはあらかじめ決められている優先順位に従って、ドライブのチェックを(メディアの有無確認)するだけです。

 ブート メディアの優先順位はCMOSに記録されていて、一般的に、(1)CD/DVD、(2)フロッピーディスク、(3)ハードディスクの順になっています。この優先順位はパソコン起動時のBIOS(CMOS)setupの "Boot sequence" で変更可能です。
 当然ですがリムーバブル メディアドライブ(FDD, CDD)の場合は、メディアがセットされていなければスキップされます。

 ハードディスが複数接続されている場合、その優先順位はハードディスを接続しているインターフェースによって決まります。インターフェース相互のデフォルトの優先順位は以下の通りに決められています。

インターフェースの種類優先順位
ATA(IDE)とSCSIATA(IDE)SCSI
ATA(IDE)のチャネルプライマリーセカンダリー
同一チャネル内マスタースレーブ
SCSIのID若番老番
SCSIカードの挿入スロット若番老番
※ 上表よりも、Boot sequenceの設定内容が優先されます。

ATA と IDE
 CompaqやWestern Digitalが、ハードディスク用インターフェースとして共同開発したIDEを、ANSIが標準規格に採用し、1989年にATA規格として策定しました。

 優先順位に従ってチェックを進めたシステムBIOSは、最初に検出したドライブをブート メディアに決定します。



U.5.ブートの開始

 ブート メディアを決定したシステムBIOSは、そのドライブ(ディスク)の先頭セクターをロード(読み出してメモリに格納)する動作に移ります。
 ディスクの先頭セクターにはブートローダー(OSを検出し起動する役目を担います)が含まれているので、システムBIOSはそちらに制御を渡して役目を終えます。

ブートローダーをロードするために、システムBIOSは次のような処理を行います。
[ 以下ではHD(ハードディスク)が選択されたものと仮定しています ]
  1. レジスターに選択ディスクの先頭セクター情報をセットします。

  2. DL=ドライブ番号(ブート メディアを識別するコード。FD:0x00〜、HD:0x80〜 )
    AH=0x02(ディスクからの読み出し)CH=0(シリンダー番号)
    AL=0x01(読み出すセクター数)DH=0(ヘッド番号)
    BX=0x7C00(ロードデータの格納アドレス)CL=1(セクター番号)

    ※ シリンダー 0、ヘッド 0、セクター 1 は、ディスクの先頭セクター。
    ※ この段階(OS未起動)ではファイルという概念はありません。
      ディスクへのアクセスは、読み出し位置を直接指定する以外に方法がありません。

  3. ソフトウェア割り込み INT 13H を実行します。
    INT 13H はレジスターにセットされた情報に基づいて、指定ディスクの指定セクターから読み出したデータを、指定のメモリ アドレスへ格納します。
    ここでは該当ディスクの先頭セクターのデータ(ブートローダー)を、メモリ上のアドレス0x07C00から始まる領域へロードする事になります。

  4. ブート メディアがHDの場合、ロードしたセクター データ(512バイト)の末尾2バイトの値が、0x55AA(Boot Signature)であることを確認します。
    ※ FDにもBoot Signatureは記録されていますが、確認せずに処理を続行します。

    ※ Boot Signatureは、当該セクターが正常なブート セクター(またはMBR)であることの証明として
      記録することが決められています。
    ※ Boot Signature が正常値でない(0x55AA以外)場合は、"invalid(無効)" 等を表示して停止するか
      "Strike F1 to retry boot, F2 for setup utility" と表示してユーザーの入力を待つ事になります。

  5. Boot Signatureを確認したシステムBIOSは、ブートローダーを格納してある先頭アドレス0x0000:0x7C00への far ジャンプを実行します。
    以後OS起動までの処理はブートローダーによって行われる事になります。
 システムBIOSの処理はここで終了し、以降はブートローダーに制御が移ります。ブートセクターやMBR(下記の囲み記事参照)に何が書き込まれるているかは、ディスクをフォーマットしたツールやインストールするブートローダーによって異なります。

先頭セクターの呼称
 ディスクの先頭セクターは特別な場所で、通常は起動時にのみ参照されます。
それらは次のように呼ばれています。
MBR
(Master Boot Recode)
ハードディスクの先頭セクター
ブートセクターフロッピーディスクおよびハードディスク各パーティションの先頭セクター

※ 詳細は [FD の構造と FAT 12]、 [ HD の構造とパーティション] 参照。


U.6.ブートローダーの種類

 ブートローダーには、OSやOSインストール時の選択によって幾つかの種類があります。またブートローダーのみを別途インストールすることも可能です。

 MS-DOS等では短いコードで済むブートローダーも、WindowsやLinuxのブートローダーになると、そのコード サイズは1セクター(512バイト)に収まりません。WindowsやLinuxに使用されるブートローダーは、一般的にサイズの小さなプライマリーと、ブートローダーの中核であるセカンダリーの2段階構成となっています。

主に使用されるブートローダーの2段階の構成要素は、概ね次のように呼ばれています。
種類プライマリー ブートローダーセカンダリー ブートローダー
WindowsBoot Strap LoaderIPL(Initial Program Loader)
grubstage1stage2
LILO1st(first) boot loader2nd(second) boot loader
※ すべてのブートローダーに正式な名称が付いているわけではありません。ここでは便宜上このように呼んでいます。


 ハードディスクの先頭セクターはMBR(Master Boot Recode)と呼ばれ、プライマリー ブートローダーやパーミッション テーブルで構成されています。
 また、パーミッションの先頭セクターもブートセクターと呼ばれる特殊なセクターで、Windowsの場合はセカンダリー ブートローダーやBPB(BIOS Parameter Block)が格納されています。
※ Linuxはブートセクターを使用しない方法が一般的です。
  ブートローダーのインストール先を明示的にブートセクター(パーティション)と呼ぶ事もあります。


 システムBIOSによってメモリアドレス0x07C00にロードされたブートローダーは、CPUの制御(プログラム実行)がシステムBIOSからブートローダーへ移行(ジャンプ)することで動作を開始します。

 以降各章でFDにインストールされたMS-DOSの起動、HDにインストールされたWindowsおよびLinuxのブート シーケンスを追います。




V.MS-DOSの起動

 ここではFDにインストールされたMS-DOSの起動の様子を追います。

 FDの先頭セクター(ブートセクター)には、MS-DOSインストール時にディスク情報等と共にIPLコード(ブートローダー)が書き込まれています。これらがシステムBIOSによってメモリの0x07C00以降のエリアにロードされ、制御が渡されることでMS-DOSの起動が始まります。
※ 実際のIPLコードはブートセクターの0x003E〜0x01FDバイトの間に記録されています。
  メモリに格納された時点で、0x07C3E以降のアドレスに存在している事になります。

MS-DOSのブートローダーの動作は概ね次のようになります。
  1. IPLコードの先頭アドレス0x07C3Eへジャンプします。
  2. ※ メモリの0x07C00にはIPLコード先頭位置へのジャンプ命令がありま。
  3. ブートセクター内のBPB(BIOS Parameter Block)を0x07C00以降のブートコード エリアにコピーします。
  4. ※ BPBにはディスクの諸元が記録されていて、ここからディスクの情報が得られます。
  5. FDのルート ディレクトリの先頭セクターを、メモリのワークエリアにロードします。
  6. ワークエリアのルート ディレクトリデータを検査し、先頭に "IO.SYS" があることを確認します。
  7. ※ "IO.SYS" が先頭にない場合は "No system" を表示してユーザーのキー入力待ちになります。
      その後の動作はフォーマットしたツール毎に異なります。
  8. FD上の "IO.SYS" が保存されている位置(セクター)を算出します。
  9. "IO.SYS" をメモリにロード(アドレスはフォーマットしたツール毎に異なります)します。
  10. "IO.SYS" をロードしたアドレスへジャンプします("IO.SYS" に制御が渡ります)。
  11. 以後、"MSDOS.SYS"、"COMMND.COM" のロードと制御の移行が順次行われます。
  12. MS-DOSの起動が完了し、カーソルが点滅します。




≪ previous [[ ブート ストラップ - パソコンの起動 by BIOS ]] next ≫