TorilOS - 30日でできるOS(はりぼてOS)を改造する

 まだ若かりし、それなりにプログラミングに自身がついてきたころにふと気づいたこと

 「それなりにプログラムはつくれるんだけど、OSとコンパイラがないと何もできないんだよなぁ。」

 気づいてからというもの、「自力でPCをブートさせたい。WindowsやLinuxの力を借りずに!」という 思いはずーっとありました。だけど、具体的な方法がちっともわからないのでどうしようもなかったのです。

 そんな野望?を心に秘めていた所で「30日でできるOS自作入門」を見つけました。

 この本はすごいです。”30日でできる”かどうかは試してないのでわかりませんが、ホントに自作できます!野望を実現できるのです! 3,800円する本ですが、僕の中では10倍以上の価値のある本です。川合さんありがとう!

 そういうわけで、この本の中で説明されているOS(はりぼてOS)をもとに自分なりのアレンジを ほどこしたOSを作りました。

 初期のコード(IPLだけのもの、OS入門でいうと1日目のhelloos2)が2008年1月19日になっているので、10ヶ月近くかかったことになります(このhtmlを書いている今は2008年の11月9日)。
 「30日でできるOS自作入門」なのに10ヶ月かかった理由はTorilosの特徴を 見てもらえばわかってもらえるのではないでしょうか。

 野望達成の証拠としてできあがったものを公開します。OSの名前はTorilOSです。


スクリーンショット(WindowsXP上で動かしたものです)


起動後に"ls"を実行したところ


tredit使用中の画面


trschemeを実行


ダウンロード

ダウンロードはこちらからどうぞ


TorilOSの実行

  1. QEMUを準備してください。以下の環境で動作確認しています。
     Debian GNU/Linux etch - QEMU ver 0.8.2
     WindowsXP - QEMU ver 0.9.0
  2. ダウンロードしたファイルをzip解凍してtorilos_bootfd.bin, torilos_hda.imgの2つのファイルを取り出し、 任意のディレクトリにおいてください。
  3. 解凍したファイルのあるフォルダに移動して以下のコマンドを実行してください。

    Debian GNU/Linux etch
    qemu -m 8 -fda torilos_bootfd.bin -hda torilos_hda.img -boot a
    
    WindowsXP
    qemu -L %QEMU_HOME% -m 8 -fda torilos_bootfd.bin -hda torilos_hda.img -boot a -std-vga
    
    ※環境変数%QEMU_HOME%はQEMUをインストールしたディレクトリを指定してください。

TorilOSの特徴

特に”はりぼてOS”との違いをならべるとこんなふうになります。

表面的には”はりぼてOS”の原型をとどめてないのですが、ソースの中をみると ”はりぼてOS”がベースであることが確認できるはずです(フォント描画やGDT/IDT設定など)。

※実機で試すにはプライマリハードディスクを丸々使っちゃうことになります。パーティションに対応してないんです。 (実機を使うなんて勇者はいないと思いますが念のため)


Torilosコマンド

コマンド 意味
ls ファイルの一覧がみれます。
cat ファイルの中身がみれます。
mkdir ディレクトリを作成します。
trscheme trscheme(不完全なschemeインタプリタ)を起動します。
tredit めっちゃ遅くてしょぼいエディタが起動します。

treditの使い方

ファイルを保存する
  1. 左Altキーを押してメニューを起動します。
  2. カーソル上下キーで"Save"に合わせてリターンキーを押してください。
  3. ダイアログが表示されるので、ファイル名を入力し、リターンキーを押してください。
終了
  1. 左Altキーを押してメニューを起動します。
  2. カーソル上下キーで"Exit"に合わせてリターンキーを押してください。

ソースからのビルド

開発は以下の環境で行いました。ようはDebian etch付属のgccです。
なので、ソースコードはこの環境での開発を前提としています。

また必須ではありませんが、IDEとしてEclipse CDTを使いました。(初期の頃はEmacsだったんですけどね。IDE万歳!Eclipse万歳!)

ビルド方法はソースコードを解凍してできたディレクトリ"torilos"の下にMakefileがありますので"make run"としてください。 これで、torilos/torilos/bin配下にOS本体兼ブートイメージとルートイメージ(ハードディスクのイメージ)が出来上がり、 QEMUでTorilOSが起動します。
バイナリイメージはtorilos/torilos/bin配下に出来ているはずです。

補足
makeの中でgccのヘッダファイルを取り込むところがあるので注意してください。 他のLinuxディストリビューションだと場所が違うんじゃないかなと思ってます。 torilos/trlib/gccinclude/Makefileを見てみてください。


"Hello World!"してみる

よくある"Hello World"アプリをつくってみましょう。 アプリはC言語(GCC)で作ります。Makefileの使い方を知らないと厳しいかもしれません。
ソースからのビルドで説明した開発環境を前提としています。

1.HelloWorldソースコードの作成

 torilos/trapp/src配下にhello.cを作ります。こんな感じ
#include<stdio.h>

int main(int argc, char** argv) {
	puts("Hello World!");
	return 0;
}

2.Makefileの修正

 torilos/trapp/src配下のMakefileを修正します。

(1) 11行目あたりにある変数TARGETを修正し、helloを追加します。
 変数TARGETにhelloを追加した後(TARGETの2行目、mkdirの後ろに追加しています)
‥‥(省略)‥‥

srcdir= ../src

TARGET = myapp06.elf myapp07.elf myapp0701.elf myapp08.elf myapp0702.elf \
	 cat pwd trshell01 ls mkdir hello 	\
	 myapp05.elf myapp0502.elf myapp09.elf myapp10.elf myapp1002.elf \
	 myapp11.elf myapp12.elf myapp13.elf myapp1302.elf \
	 myapp14.elf myapp1402.elf myapp1403.elf \
	 myapp1501.elf myapp1502.elf myapp1503.elf myapp1601.elf \
	 myapp1701.elf myapp1801.elf

default	: all

‥‥(省略)‥‥

(2) 50行目にあるmkdirターゲットをコピー修正してhelloターゲットを追加します。
 helloターゲットを追加した後
‥‥(省略)‥‥

mkdir: mkdir.o $(CRT0) lib
	ld $(CRT0)  mkdir.o -M -Ttext 0x401000 -S -o $@ -ltrc -Bstatic -L$(LIB_DIR) > mapmkdir.txt

hello: hello.o $(CRT0) lib
	ld $(CRT0)  hello.o -M -Ttext 0x401000 -S -o $@ -ltrc -Bstatic -L$(LIB_DIR) > maphello.txt

#myapp0401.elf: myapp0401.o $(CRT0)
#	ld $(CRT0) myapp0401.o -M -Ttext 0x401000 -S -o $@ -ltrc -Bstatic -L$(LIB_DIR) > mapmyapp0401.txt

‥‥(省略)‥‥

3.コンパイル

 torilos/trapp/binディレクトリに移動し、"make"としてください。
~/torilos/trapp/bin$ make
gcc -nostdinc -Iinclude -Igccinclude -Wall -c ../src/hello.c
ld ./trcrt0.o  hello.o -M -Ttext 0x401000 -S -o hello -ltrc -Bstatic -Llib > maphello.txt

4.ルートイメージへの書き込み準備

 torilos/torilos/mkdisk/makefileを編集します。

(1) 8行目の変数APPSにhelloを追加します。
 APPSにhelloを追加した後
‥‥(省略)‥‥

default: mkdisk

APPS = pwd cat trshell01 ls mkdir trscheme tredit hello

#testfd.img:

‥‥(省略)‥‥

(2) 23行目の"mkdisk"ターゲットにhelloを追加します。(下から3行目に追加しています。)
‥‥(省略)‥‥

mkdisk: $(APPS) $(WRITE_TOOL)
	cp test2fd.img.org test.img
	$(WRITE_TOOL) test.img pwd
	$(WRITE_TOOL) test.img cat
	$(WRITE_TOOL) test.img trshell01
	$(WRITE_TOOL) test.img ls
	$(WRITE_TOOL) test.img mkdir
	$(WRITE_TOOL) test.img trscheme
	$(WRITE_TOOL) test.img tredit
	$(WRITE_TOOL) test.img hello
	mv test.img torilos_hda.img
	cp torilos_hda.img ../bin

‥‥(省略)‥‥

(3) 49行目にあるmkdirターゲットをコピー修正してhelloターゲットを追加します。
 helloターゲットを追加した後
‥‥(省略)‥‥

mkdir: $(APP_DIR)/mkdir
	cp -p $< .
	
hello: $(APP_DIR)/hello
	cp -p $< .

trscheme: $(APP_DIR)/trscheme/trscheme
‥‥(省略)‥‥

5.ルートイメージへの書き込み

 torilos/torilos/mkdisk/にcdして"make mkdisk"とします。これで準備は完了です。
(1) 23行目の"mkdisk"ターゲットにhelloを追加します。(下から3行目に追加しています。)
~/torilos/torilos/mkdisk$ make mkdisk
cp -p ../../trapp/bin/hello .
cp test2fd.img.org test.img
../ext2fswork2/ext2fsdisk_writefile test.img pwd
diskimage=[test.img], target_fname=[pwd]
new blkno=0x02f

‥‥(省略)‥‥

6.helloの実行

 torilos/にcdして"make run"とします。
 "ls"してみて、"hello"がでてくればルートイメージへの書き込みは成功しています。
 "hello"とタイプして、こんな風になれば成功です。


(画面はDebian GNU/Linuxでのものです)

TorilOSアプリ開発についての補足
TorilOSソースコードに付属するCライブラリはnewlibを流用したその場しのぎのものです。 なので、stdio.hをインクルードしたからといって全部の関数が使えるわけではありません。興味のある人は torilos/trlibを見てみてください。(調べるのは面倒ですが)何があって何がないかがわかります。


その他の情報

開発にあたっての参考図書

 「コードの中をみてみよう」と思ってくれたうれしい人達へ向けた情報です。

ご意見、ご感想を!!

なにかご意見等があれば、こちらにコメントを残してくれるとうれしいです。

トップへ戻る