カーネル開発 GRUB マルチブートについて

参考文献

公式のマニュアルは下のサイトにあります。
GRUBマルチブートについて、詳しい情報はマルチブートの仕様書に書いてあります。
http://www.gnu.org/software/grub/manual/multiboot/

GRUBのマルチブートの利点

カーネル開発をするとき、多くのカーネルカーネルを読み込むのにブートのコードも書かなくては行けない。
GRUBのマルチブートの機能を使うことによって、カーネルを起動するときブート部分をGRUB側に任せる。

GRUBの機能

GRUBはフロッピー、CD-ROM、ハードディスク、ネットワーク越しにブートができる。

GRUBが立ち上がれば、起動するときのオプションを変えることができる。

例えば、次のようなシナリオを考える。

ハードディスクから立ち上がるとき、いつも/boot/kernel からカーネルを読み込んでいたがこのカーネルが起動しなくなった。
このような場合が起こると思われたのでレスキュー用のカーネルを保存しておいた(/boot/rescue)。
このとき、起動するカーネルGRUBの編集画面で/boot/kernelから/boot/rescueに変更し起動する事ができるようになる。

コンパイルしたカーネルのフォーマットがELF形式で読み込める。

カーネルの起動時に追加のモジュールを読み込める。

GRUBがやってくれることと

A20 gate

アドレスバスA20(A20 gate)の制御をしてくれる。
これで1M以降のメモリを使えるようになる。

CR0のBit 0(PE)

プロテクトモード(CR0のBit 0(PE))
リアルモードからプロテクトモード以降を行う。

EFLAGS (Bit 17 (VM), Bit 9 (IF))

Bit 17 (VM) 仮想8086モードのセマンティクス無しに保護モードに入る。
Bit 9 (IF) Interrupt Enable Flag(割り込み可能フラグ)がクリアされる。つまり、割り込みできないようににされている。

カーネルがこれからやること

コードセグメント、データセグメントの設定

スタックポインタの設定

グローバルディスクリプタテーブルの設定
割り込みディスクリプタテーブルの設定

次に、メモリの設定などを行う。