Posts Tagged ‘OS自作入門’

Mac で OS をつくる(31日目)最終日

水曜日, 7月 19th, 2006

31日目、あとがき他。
とりあえず読了。

[この書籍のいいところ]
– とりあえず「とっかかり」にはなる
– 実際にクラックしてみせてその対策としてコードを変更するところ(筆者な妙なノリはちょっと趣味ではないけれど)
– 反面教師的に「俺だったらこうはしないぞ」というモチベーションを与えてくれる。これが MINIX の教本だったら「お説御もっとも」とお腹いっぱいになって終わりになってしまうところだろう

[この書籍の悪いところ]
– 本来 APPENDIX で掲載すべき情報をウェブサイトの紹介ですませてしまっている
– 一次資料へのリンクがない
– 読者ターゲットが微妙。あとがきにもあるように意図的なものであることはわかるのだが、初心者向けに書かれた C言語のソースコードは中級者以上にはストレスがたまり過ぎ

[この書籍では教えてくれないこと]
– 仮想記憶
– アクセス競合
– HDD, CD-ROMアクセス
– ドライバ
– main 関数を使った普通の実行プログラム
– EFI
– x86(IA32)以外の CPU
– ほか、いろいろ

[いまさらだけど]
– PC互換機の仕様って古くさい
– x86(IA32) の建て増しを繰り返した構造は汚い

Mac で OS をつくる(30日目)

水曜日, 7月 19th, 2006

30日目、終了。高度(?)なアプリ、IPL の改良、CD-ROM 起動。

アプリはコマンドライン計算機、テキストビューア、MMLプレイヤ、画像ビューア。BMP や JPEG のコードはよそからの流用だしとりあえず軽く流し読み。

IPL の改良はセクタの読込み単位を変えて高速化。この本の著者は読込みセクタの数を気にしているけど、通常は FDD の中身を全部メモリにロードするなんてアプローチは取らないから、こんなところで1セクタ気にしてもなんだかなぁという感じ。ちなみにうちのクロスコンパイル環境だとサイズがちょっと大きくなって CD-ROM のコードでは不具合がでるので1セクタ余分に読込むようにコードを修正。

CD-ROM 起動は CD-ROM を直接ハンドリングするのではなく El Torito フォーマットで FDD をエミュレート。毎度のことながら Windows のツールしか紹介されていない。Mac OS X の場合、hdiutil コマンドの -eltorito-boot オプションでなんとかなりそうな気がするのだけれど、どういうわけか -no-emul-boot をつけないと IPL が読込めない。-no-emul-boot だと当然 FDD をエミュレートしてくれないので IPL が FDD のイメージにアクセスできない、、、ってだめじゃん。しょうがないので DarwinPort で cdrecord をインストールして、それに含まれる mkisofs を使用した。

Mac で OS をつくる(29日目)

火曜日, 7月 18th, 2006

29日目、終了。圧縮ファイルの解凍、C言語の標準関数、アプリいろいろ。

圧縮アルゴリズムの説明はないけど独自形式の圧縮ファイル(アプリとかフォントとか)を読込んでアプリの実行できるようにする。この本の著者のこだわりは別にして、現在のような高速 CPU から低速デバイス(FDD, CD-ROM それにインターネット)にアクセスする場合には圧縮技術を使うのは非常に有効な手段である。

C言語の標準関数については「こうやって標準関数を追加していきましょう」というさわりだけなので特にコメントなし。ひとつ言うとすれば一覧リストぐらいつけてほしい。

アプリは非矩形ウィンドウと bball という線図形、それとインベーダーもどき。

あと、圧縮ファイルかどうかのヘッダ(途中に 0x00 が入っているバイナリ)のチェックに strncmp を使用するのはまずいっしょ。っていうか、バグ! memcmp を使用すべき。

Mac で OS をつくる(28日目)

日曜日, 7月 16th, 2006

28日目、終了。今回は __alloca、ファイルAPI、日本語表示。

この本ではスタックが 4K 以上の場合は __alloca が呼ばれるということなのだが、私が使っているクロスコンパイル環境では違うようでエラーが発生しない。まぁ、とりあえずシンプルな __alloca の作成。

ファイルAPI は open, seek, read, write, close をアプリから呼び出せるようにするだけ。

日本語表示はファイルから日本語フォント(独自形式)を読込んで ShiftJIS や EUC のテキストを表示できるようにする。独自形式というのは個人的に好かないのだけどこの本の中でやろうと思うとしょうがないかな。

Mac で OS をつくる(27日目)

日曜日, 7月 9th, 2006

27日目、終了。今回のメインは「アプリを守ろう」ということで LDT の導入、それと API のライブラリ化、あと前回のつづきと make 環境の整理。

いままでアプリを GDT(Global segment Descripor Table) で実行していたところを LDT(Local segment Descripor Table) で実行するように変更。この辺、重要。

ライブラリ化では binutils のクロス環境だとうまく動作しなかったので(*1)、書籍付属の CD-ROM に入っていた golib00.c を単体でさくっとコンパイル(Intel Mac でも PPC Mac でも大丈夫)。

make 環境の整理により Makefile が複数になってしまった。Mac の環境に合わせて Makefile を手作業で書き換えているのでちょっとつらい。ま、あと3日分だから何とかなるか。

*1) エラーは出ないのだけど、実際に Haribote OS でアプリを動かすとうまく動かない。何が原因???

Mac で OS をつくる(26日目)

土曜日, 7月 8th, 2006

26日目、終了。ウィンドウ移動の高速化、コンソールをいくつでもオープン・クローズ、start コマンドとコンソールを表示しない ncstコマンド。

start コマンドって何よ、Windows をお手本(?)にしてもうれしくない。コンソールの設計にもいろいろと問題あるし、とりあえずこんなもんということでスルー。

Mac で OS をつくる(25日目)

水曜日, 7月 5th, 2006

25日目、終了。コンソールを増やす。あと BEEP サウンド。

コンソールを増やすといっても2つだけ。タスクが fork できないのが痛い。

Mac で OS をつくる(24日目)

水曜日, 7月 5th, 2006

24日目、終了。ウィンドウの切換え、移動ができるようになる。おまけとしてアプリ側からタイマーの使用。

ウィンドウに関してはちゃんとしたウィンドウシステムを設計しているわけではないので「とりあえずそれっぽく動くようになってよかったね。以上」という感じ。

アプリ側のタイマーの使用では、アプリが終了したときにタイマーを解放しているのだが、、、、それだと他のアプリのタイマーも解放しちゃってまずいだろ(^^; まぁ、もしかしたらいつものごとく後で直すのかもしれないけど。(現在はアプリが1つしか動かないのでこれでいいということみたい)

ところで、ウィンドウやタイマーなどシステムコールが OS 側で確保しているリソースの管理は一考の余地あり。タスクが終了(正常もしくは異常)したときに安全かつ迅速に解放できるように管理すべし。

Mac で OS をつくる(23日目)

火曜日, 7月 4th, 2006

23日目、終了。アプリ側で使える malloc、描画(点と線)とリフレッシュ、キー入力。

アプリ側で使える malloc はシステム側で使っているルーチンの流用だが粒度は細かくなっている。malloc があるのだったら alloca も欲しいところだがまだない。

点と線の描画はまんま。もっとも線の描画というと Bresenham のアルゴリズムぐらい紹介してほしいところ(OS には直接関係ないけど)。

ところで、MacBook が修理から返ってきたので iBook G4 で動かしていたのを MacBook にしたら harib19g 以降がうまく動かないことを発見。MacBook と iBook G4 でクロスコンパイラのバージョンが違うので、もしかしたら最適化の関係かなと -O2 を -O1 に変更したらビンゴだった。

Mac で OS をつくる(22日目)

月曜日, 7月 3rd, 2006

22日目、終了。アプリ側(C言語)で文字列表示やウィンドウ表示を行う。

オブジェクトファイルのデータセグメントを利用できるようにするのが肝。ここでようやく .hrb ファイルの詳しい説明が出てくる。