|
0から作るOS開発 Grubその4 GRUBから自作OSを起動する
|
前回までの内容
これまでで、
- GRUBから起動できるカーネルを作るには
マルチブート仕様
に対応した
カーネルを作る必要がある
- マルチブート仕様に対応したカーネルはカーネルイメージに
マルチブートヘッダーを付ける必要がある
- マルチブートヘッダーに必ず必要なものにmagic、flags、checksum
フィールドがある
- magicフィールドは0x1BADB002を設定する
-
flagsフィールドのビット0,ビット1をセットする
- checksumフィールドは-(magic+flags)を設定する
- マルチブートヘッダーとしてアセンブラでmultiboot.Sを作成し
カーネルを起動する。
- 起動するカーネルのサンプルを作成
についてわかりました。それではGRUBから自作OSを作成していきましょう!
今回は前回みてきましたCygwindeでインストールしたGRUBを使用して
起動できる自作OSを作成していきます。
それでは、順番に見ていきます。
推奨
カーネルから開発してみたいという方もいらっしゃるかと存じますが、一度ブートローダーを
アセンブラで作ってみることをおすすめ致します。CPU周りの制御の仕方の基本的なことが
わかるようになりますので、ぜひ一度最初から作ってみてください。
GRUBから自作OS(カーネル)を起動する
では、前々回作成しました
GRUBレスキューイメージから前回作成しました
自作カーネルを起動していきます。
自作カーネルをフロッピーディスクに入れる
ImDiskを
インストール
し、
フロッピーディスクの設定
を行ってマウントしておきます。
そして、さきほどコンパイルしました、前回作成したカーネルKImageをフロッピーディスクにコピーします。
(KImageとカーネルの作成例は
ダウンロードしていただけます。)
GRUBを起動する
前々回の「GRUBをVirtualBoxで起動してみる」
の設定を行ってから、GRUBを起動します。
GRUBを起動するとコマンドプロンプトが表示されます。
grub> _
GRUBのコマンドを次のように入力します。
grub> ls
すると、GRUBが認識しているGRUBデバイスが表示されています。
ここでの例では次のように表示されました。
grub> ls
(hd0) (hd96) (fd0)
ここで表示されるGRUBデバイスは括弧()で閉じてあるのが1つのデバイス
となります。ここでは3つのGRUBデバイスが表示されました。GRUBのコマンド
でこのデバイスを指定します。括弧も必要です。
-
(hd0)
ハードディスクドライブです。VirtualBoxの設定時に作成した仮想HDDと
なります。
-
(hd96)
CD/DVD-ROMドライブです。こちらもVirtualBoxの設定でGRUBのレスキュー
イメージを読み込ませたドライブです。GRUBはここから起動されます。
-
(fd0)
VirtualBoxで認識しているホストドライブ'A:'です。ホストドライブ'A:'とは
ImDiskでフロッピーディスクイメージをマウントしているAドライブとなります。
ここにカーネルイメージファイルKImageを置きました。
先ほどフロッピーディスクにカーネルイメージをコピーしておきましたので、
(fd0)から自作カーネルを起動する方法について見ていきます。
GRUBから自作カーネルを起動する
まずは、次のようにコマンドを入力します。
grub> set root=(fd0)
このコマンドはカーネルが格納されているルートGRUBデバイスの設定を行っています。
ルートデバイスには(fd0)を指定します。GRUBのコマンド入力時は英語キーボード
設定になっていますので、入力がしにくいです。文字と日本語キーボード入力は
次のように入力します。
-
=は日本語キーボードの^を押します。
-
(は日本語キーボードのシフトキーを押しながら9を押します。
-
)は日本語キーボードのシフトキーを押しながら0を押します。
英字キーは日本語キーボードの対応と同じです。
次に、ルートデバイスとしてフロッピーディスクドライブ(fd0)が設定されているか
確認します。確認するには次のようにコマンドを入力します。
grub> root
コマンド入力すると次のように結果が表示されます。
grub> root
(fd0): Filesystem is fat.
これでGRUBはフロッピーディスクのファイルシステムとしてFATを認識しています。
次にフロッピーディスクに格納されているカーネルイメージファイルKImageを設定します。
次のようにコマンドを入力します。
grub> multiboot /KImage
フロッピーディスクの直下であるルートディレクトリにカーネルイメージファイルを置きました
ので、/KImageと指定します。
そして、いよいよ自作カーネルを起動させます。次のようにコマンドを入力します。
grub> boot
すると”Hello world!と画面左上に表示されます!
ようやく自作OSを起動することができました!!!(特になにもできませんが。。。)
しかし、OSを作ってはデバッグしてを繰り返すとしていちいちコマンド入力をしていては
とてつもなく面倒くさいです。。。そこで、コマンド入力を自動化して、メニュー入力で
自作OSを起動できるようにGRUBを設定します。
GRUBの設定とメニューからの自作OS起動
GRUB 2のレスキューイメージの作成
で作成しまたレスキューイメージの
内容を見てみます。レスキューイメージファイルrescue.isoを右クリックして
”プログラムから開く”→”エクスプローラー”を選択します。するとWindowsがISOイメージを
マウントしてくれて中身が見れるようになります。(対応していないWindowsの場合は
UltraISO
、
PowerISO
などの無料版をインストールすると中身が見れるようになります。
見なくても問題ありませんが、、、)
レスキューイメージの内容としては、
/boot/grub/i386-pc
にGRUBのboot.img、core.imgやモジュールが入っています。
またこのフォルダーにはgrub.cfgというファイルが入っています。
これが今回設定するGRUBの設定ファイルとなります。grub.cfgを
取り出して中身を見てみましょう。
[grub.cfg]
insmod part_acorn
insmod part_amiga
insmod part_apple
insmod part_gpt
insmod part_msdos
insmod part_sun
source /boot/grub/grub.cfg
となっています。insmodはGRUb起動時にcore.imgが読み込むモジュールと
なります。これだけでは、メニューが出て来ませんのでgrub.cfgファイルを編集します。
insmod part_acorn
insmod part_amiga
insmod part_apple
insmod part_gpt
insmod part_msdos
insmod part_sun
source /boot/grub/grub.cfg
set timeout=15
set default=0
menuentry "My OS"{
set root=(fd0)
multiboot /KImage
boot
}
編集したファイルをHDDのどこかにgrub.cfgのファイル名で保存しておきます。
ここで設定内容を部分的に見ていきます。
set timeout=15
GRUBはメニューが表示されてから何も操作していないでいるとデフォルトのOSを
起動します。デフォルトのOSが起動するまでの時間を秒で設定します。
この場合ですと15秒の設定となります。
set default=0
デフォルトで起動するOSを設定します。メニューの上から順番に数えた番号を
指定します。この場合ですと、デフォルトは0ですので、メニューの”My OS”のOSを
起動する設定となります。
menuentry "My OS"{
set root=(fd0)
multiboot /KImage
boot
}
menuentryでメニューを作ります。"My OS"と書かれた部分がGRUBのメニューに
表示されます。その後の項目は、さきほどGRUBのコマンドプロンプトで入力した
コマンドを順番に書いて置きます。これで自動的に自作カーネルを読み込んで
くれるようになります。
そして、編集したgrub.cfgをレスキューイメージに入れ込みます。
編集したgrub.cfgをレスキューイメージに入れる
Cygwin上で現在のディレクトリにrescueというディレクトリを作ります。
mkdir rescue
そして、レスキューイメージのフォルダー構成と同じディレクトリ構成を作ります。
mkdir -p rescue/boot/grub/i386-pc
mkdirコマンドに-pオプションをつけると一気に下層のディレクトリも作ってくれます。
作ったディレクトリに編集したgrub.cfgファイルをコピーします。
cp grub.cfg rescue/boot/grub/i386-pc
(Windowsのエクスプローラーで操作して頂いても問題ありません。)
次に、
grub-mkrescueコマンドで
レスキューイメージを作る際にgrub.cfgを入れ込みます。
コマンドの引数として先ほど作ったrescueディレクトリを指定します。
grub-mkrescue --output=rescue.iso rescue
このコマンドで、rescueディレクトリ以下のファイルに置き換えてくれます。
また、rescueディレクトリ以下のファイルをレスキューイメージに入れてくれます。
例えばCDに自作カーネルを入れておきCDからカーネルを起動したい場合には
rescueディレクトリにカーネルイメージファイルを置いて、コマンドを実行すると
カーネルイメージが入ったレスキューイメージができあがります。
では、
GRUBをVirtualBoxで起動してみます。
次のようなメニューが表示されると思います。
Enterキーを押すと選択したメニュー(ここではMy OS)のカーネルが起動します。
またこのメニュー画面で"
c"を押すとGRUBのコマンドプロンプトに切り替わります。
メニューからカーネルを起動することができました。メニューからの起動だとスクリーンを
クリアーしてくれるようです。
これでようやくGRUBから自動的に自作OSを起動することができるようになりました!!
カーネル本体の開発を進めて行きましょう。