0から作るソフトウェア開発

日々勉強中。。。

0から作るOS開発

環境準備

環境設定

ブートローダ

カーネルローダ

GRUB

カーネル

ドライバーその他

0から作るOS開発 Grubその4 GRUBから自作OSを起動する

前回までの内容

これまでで、 についてわかりました。それではGRUBから自作OSを作成していきましょう!

今回は前回みてきましたCygwindeでインストールしたGRUBを使用して

起動できる自作OSを作成していきます。



それでは、順番に見ていきます。

推奨

カーネルから開発してみたいという方もいらっしゃるかと存じますが、一度ブートローダーを

アセンブラで作ってみることをおすすめ致します。CPU周りの制御の仕方の基本的なことが

わかるようになりますので、ぜひ一度最初から作ってみてください。

GRUBから自作OS(カーネル)を起動する

では、前々回作成しました GRUBレスキューイメージから前回作成しました

自作カーネルを起動していきます。

自作カーネルをフロッピーディスクに入れる

ImDiskを インストール し、 フロッピーディスクの設定 を行ってマウントしておきます。

そして、さきほどコンパイルしました、前回作成したカーネルKImageをフロッピーディスクにコピーします。

(KImageとカーネルの作成例はダウンロードしていただけます。)

カーネルKImageファイルをフロッピーディスクのルートフォルダーに格納する

GRUBを起動する

前々回の「GRUBをVirtualBoxで起動してみる」 の設定を行ってから、GRUBを起動します。

GRUBを起動するとコマンドプロンプトが表示されます。


grub> _



GRUBのコマンドを次のように入力します。


grub> ls



すると、GRUBが認識しているGRUBデバイスが表示されています。

ここでの例では次のように表示されました。


grub> ls
(hd0) (hd96) (fd0)



ここで表示されるGRUBデバイスは括弧()で閉じてあるのが1つのデバイス

となります。ここでは3つのGRUBデバイスが表示されました。GRUBのコマンド

でこのデバイスを指定します。括弧も必要です。

先ほどフロッピーディスクにカーネルイメージをコピーしておきましたので、

(fd0)から自作カーネルを起動する方法について見ていきます。

GRUBから自作カーネルを起動する

まずは、次のようにコマンドを入力します。


grub> set root=(fd0)



このコマンドはカーネルが格納されているルートGRUBデバイスの設定を行っています。

ルートデバイスには(fd0)を指定します。GRUBのコマンド入力時は英語キーボード

設定になっていますので、入力がしにくいです。文字と日本語キーボード入力は

次のように入力します。 英字キーは日本語キーボードの対応と同じです。



次に、ルートデバイスとしてフロッピーディスクドライブ(fd0)が設定されているか

確認します。確認するには次のようにコマンドを入力します。


grub> root



コマンド入力すると次のように結果が表示されます。


grub> root
(fd0): Filesystem is fat.



これでGRUBはフロッピーディスクのファイルシステムとしてFATを認識しています。

次にフロッピーディスクに格納されているカーネルイメージファイルKImageを設定します。

次のようにコマンドを入力します。


grub> multiboot /KImage



フロッピーディスクの直下であるルートディレクトリにカーネルイメージファイルを置きました

ので、/KImageと指定します。



そして、いよいよ自作カーネルを起動させます。次のようにコマンドを入力します。


grub> boot



すると”Hello world!と画面左上に表示されます!

自作カーネルをGRUBで起動

ようやく自作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で起動してみます。

次のようなメニューが表示されると思います。

GRUBメニューの表示

Enterキーを押すと選択したメニュー(ここではMy OS)のカーネルが起動します。

またこのメニュー画面で"c"を押すとGRUBのコマンドプロンプトに切り替わります。

GRUBメニューからのカーネル起動

メニューからカーネルを起動することができました。メニューからの起動だとスクリーンを

クリアーしてくれるようです。



これでようやくGRUBから自動的に自作OSを起動することができるようになりました!!



カーネル本体の開発を進めて行きましょう。

inserted by FC2 system