ポポロイア記念文化センター

 

  • フォントサイズを大きくする
  • デフォルトフォントサイズ
  • フォントサイズを小さく

GRUBの実行

印刷 PDF

GRUB の実行

ここから先は、POST 処理の後にハードディスクから MBR が読み出されるところから説明を続ける。ここでは Linux 用のブートローダの例として、0.93 版の GRUB を利用した場合のブートシーケンスを説明する。

i386アーキテクチャ用の Linux では、この他にも LILO などのブートローダが広く用いられているが、ここでは取り上げない。また、2.4 版の Linux カーネルソースには、フロッピーディスクをブートメディアとする、ごくプリミティブなブートローダのソースが含まれるが、これもここでは取り上げない。

便宜上、一番目のハードディスクの MBR としてあらかじめ GRUB の stage1 イメージがインストールされているものとする。

GRUB の概要

GRUBのメモリマップ

GRUB の実体は、stage1 と stage2 の名を持つバイナリイメージから構成される。 GRUB の stage1 イメージは 512byte長で固定されているため、 MBR がディスクからメモリへロードされた時点で stage1 のロードも完了する。 stage2 イメージは場合によって100Kbyte よりも大きな長さを持つことがある。 このため stage2 イメージは複数のセクタに跨りディスク上に格納される。 これらのセクタには隣接しないものも含まれうる。 これらのセクタのディスク上での位置はMBR のようには固定されておらず、 ブートローダのインストール作業の直前になるまで具体的な位置は判明しない。

GRUB では、プロテクトモード下のCPUからのみ利用可能な 高位アドレス(1Mbyte 超)のメモリ領域と、 リアルモード下のCPUからのみ利用可能なBIOS サービスの双方を利用する。 そのため、GRUB の実行時にはリアルモードとプロテクトモードのモード切り替えが 何度も行われる。

stage1 の実行

物理アドレス 0x07c00 から始まるメモリ上へ MBR としてロードされた stage1 のブートコードの先頭へ制御が移ることにより、物理アドレス 0x08000 からのメモリ上に stage2 の先頭 512byte が収められた1セクタがディスクからロードされ、0x08000 へと制御が移る。このセクタのロードには BIOS サービス INT 0x13 が用いられる。BIOS サービスが必要とするセクタの位置情報は、ブートローダのインストール時に MBR の一部へと埋め込まれる。

stage2 のロード

物理アドレス 0x08000 へロードされた stage2 の先頭箇所へ制御を移すことにより、残り全ての stage2 イメージがロードされる。ここでも BIOS サービス INT 0x13 がセクタのロードのために用いられる。残り全ての stage2 イメージをロードするために BIOS サービスが必要とする複数のセクタの位置情報は、ブートローダのインストール時に stage2 の先頭 512byte の内部に埋め込まれる。最終的に stage2 イメージの全てが連続して 0x08000 以降にロードされ、0x08200へと制御が移ることにより、ブートローダ GRUB 本体の実行が開始される。

イメージファイルの選択

GRUB は、インストール時に「ルートデバイス」として指定されたパーティション上のファイルシステム種別を自動認識し、パス名「/boot/grub/grub.conf」に相当する設定ファイルをファイルシステムを通じて読みに行く。設定ファイルのパス名は、ルートデバイス名と共に GRUB のインストール時に変更することができる。(GRUBの「ルートデバイス」として指定されるパーティションは、Linux のルートパーティションと一致しなくてもよい)

GRUB は設定ファイルの内容に従い、GRUB がメモリ上へロードすべきイメージファイルと、それが収められたパーティションを最終的に決定する。あるいは、ブートプロンプトやメニュー形式のユーザイ ンタフェースを通じて、イメージファイル名を初めとする各種ブート環境の指定を利用者に行わせることもできる。

イメージファイルのロード

bzImage展開結果

GRUB は、メモリ上へのロードを指示されたイメージファイルの先頭部に ファイルシステムを通じてアクセスし、その種別を自動判別する。 ここでは、Linuxの bzImage 形式のファイルであると 認識したものとして話を進める。

ここで、bzImage 形式のファイルは バイナリイメージ bbootsectbsetupbvmlinux.out をこの順で連結したものであることを 思い出して欲しい。 GRUB はファイルシステムを通じて bzImage 形式のファイル全体を 読み込み、以下の三つのメモリ領域へとロードを行う。

  • bbootsect に相当する部分を 0x90000(576Kbyte目)以降へロードする。
  • bsetup に相当する部分を 0x90200(576K+512byte目)以降へロードする。
  • bvmlinux.out に該当する部分を 0x100000(1Mbyte目)以降へロードする。

bbootsect は フロッピーディスク用の貧弱なブートコードが収められたバイナリイメージであるが、 ここでそのブートコードが実行されることは決して無い。


ブート環境パラメータの設定

bbootsect の長さは 512byte 長固定なため、bbootsectbsetup は常に隣接した領域にロードされる。ブート環境を反映するための各種パラメータは、この境界を跨ぎ 1Kbyte 弱にわたって収められる。GRUB はこれらのパラメータをブート環境に合わせ適切に書き換える。パラメータによっては、上記の設定ファイル「grub.conf」を通じて値を設定することや、GRUB のブートプロンプトを通じて利用者が手作業で値を設定することが可能である。bzImage のカスタマイズの項で示したカスタマイズ項目も、最終的にこれらのパラメータへと反映される。これらブート環境パラメータの詳細は、カーネルソース上のドキュメント TOPDIR/Documentation/i386/boot.txt において、 bbootsect 領域の先端からのオフセット値と共に詳しく述べられている。

GRUB はこの他にも、

  • ブートプロンプトや設定ファイル grub.conf で指定された「hdd=ide-scsi」のようなカーネルパラメータ文字列を収めた領域をメモリ上に確保し、その先頭アドレスをブート環境パラメータに設定する。
  • ブートプロンプトや設定ファイル grub.conf で指定されたinitrd イメージを、ファイルシステムを通じてメモリ上にロードし、その先頭アドレスをブート環境パラメータに設定する。

などの機能を持つ。

カーネルへの制御の移行

GRUB は最終的にリアルモードへとCPUのモードを変更し、0x90200 へ far ジャンプ(9020:0000)する。以降、GRUB のコード stage1 や stage2 がメモリ上に占めていた領域は不要となる。また、BIOS サービス INT 0x13 を通じてディスクへのアクセスが行われることもなくなる。