25日目「BEEPサウンドともうひとつのコンソール」

 やっぱり音は重要だよ。音楽は世界共通なんだよ。音楽に国境はないんだよ。というわけで、はりぼてOSもついに音を鳴らすことができるようになった。BEEP音ですよ、BEEP音。そして、音を鳴らすためには→http://community.osdev.info/?%28PIT%298254を参照するのだ!
 というわけで、このアドレスのページを見てみると、なんかわけわからんことがいろいろと書いてあって、こんなん分かるかー、このやろ〜。という感じなのだが、よーく見ていくと、「ものぐさなひとのために」という、ナイスなテキストがあるじゃないか。そういうことは早く言ってくれよな〜。そうさ、俺はものぐささ、ものぐさ太郎さ。今日もひとりでものぐさ太郎さ。
 というわけで、BEEP音の制御とか、音程の操作とかその辺りを読破だ。そしてどうやら、EDXに20を入れて、EAXに周波数を入れると音が流れるらしい。うっほーい。ついに音が出るんだ。音楽だよ音楽。よっっしゃー、コンパイル! そして実行〜。って、QEMUじゃ音でねーよーーー(ちゃんと本書に書いてあります。実機で試さないとダメらしいです)。
 というわけで、次は色に関することなんだけども、申し訳ないけど、俺、色数とか興味ないんす。ごめん。だから、飛ばしました(ぉぃ)。いやいや、ちゃんとあとから読みます。きっと。だってなぁ、色とか難しそうなんやもん。なんか滑らかに色の変化をみせる方法とか、そんなん無理やもん。分からんもん。俺には理解できないこと山の如しやもん。
 というわけで、続いて、青コーナー、コンソールゥー。赤コーナー、コンソールゥー(って同じじゃーん)。コンソール大好きっす。大好きっ子っす。さっそく、コンソールをもうひとつ作っちゃいます。と思ったのも、つかの間。ちょと今日の内容むずくね? だって、これまであったコンソールの2つにするだけやん。簡単やん。余裕やん。と思ってたけど、実は結構難易度高かったです。それに、なんか著者もインベーダーまでラストスパート走ったるで〜という感じで、俺もインベーダーまでラストスパート走ってて、「おおー、奇遇だねー、目的地同じじゃーん」ってそれ違いますから〜!! これOS作る本ですから〜!! 残念〜〜〜〜!! ものぐさ太郎ぎり〜!!
 というのも、これまで書いてきたプログラムを改めて、書き直さなければならないので、微妙に忘れている箇所とかあって、ちょっとここ難しかったっす。というわけで、ラスト1週間。そろそろ、OSとしてある程度、カタチにする段階にきているのかもしれない。要するにまとめということなのか。
 OSとしての完成度は、ついに限界突破だ〜〜〜〜〜。
 乞うご期待!!

24日目「ウィンドウを、出したり、消したり、動かしたりしたぞ!!」

 カップラーメン、食ってるか〜〜〜〜〜(オォーーーー!!!)ちゃんと3分、待ってるか〜〜〜〜〜〜(オォーーーー!!!)でも実はアレ、3分キッカリよりもむしろ2分30秒くらいで食べ始めたほうが、適度に美味しくいただけるって、知ってるか〜〜〜〜〜(オォーーーー!!!)。
 というわけで、今回はわざわざOSまで自作して何をしたかといえば、ラーメンタイマを作ったのだ〜。ラーメンタイマってのは、要するに3分間をはかってくれるというすぐれものツールで、な、なんと、ラーメンを作るのにうってつけのツールだ。これはすごいぞ!! このツールさえあれば、もうラーメンで悩む必要はまったくない、お好みに合わせた絶妙のめん固さを選ぶことが可能だ! 有名店にも負けないめんの固さを実現できる! これでカタめんにもやわめんにも対応だ、このやろ〜。
 というわけで、さっそくはりぼてOSにタイマAPIをふんだんに追加するのだ。基本的にタイマに関しては13日目辺りでもう嫌というほどやっているため、今回はそれをちょこちょこと変更するだけでOKだ。もう、この時期になると、以前作ったものをさらに改良してOSとしての機能を強化するところにチカラが入ってくるのだ。あの苦労の日々もまんざら無駄ではなかったのだ。すべてはうまいラーメンを作るためだったのだ(ラーメン王の称号は、俺のもんだーい、やっほーい)。
 さらに、今日はウィンドウ操作をパワーアップだ! マウスでウィンドウを動かしたり、消したりできるのだ。アプリケーションのウィンドウだってモウマンタイだ。こ、これは…、もはや、OSだよ…(いや、OS作ってるけども)。
 あの良く分からんシートという概念を、うがー、うがー、全然分からーーん、なんじゃこりゃ〜、といいながら、なんとか覚えた日々も、タイマだのマルチタスクだのの、ワケワカラン用語を一生懸命覚えた日々も、いまでは良い思い出だ。
 そして、なんか一番最後の日(31日目)には、なつかしのインベーダーゲームのアプリが動いているではあーりませんか。これは、もう、はりぼてOSでインベーダーを遊ぶしかない!! 名古屋撃ちをするしかない。俺のテクを見せるしかないだぎゃー(名古屋?)。
 インベーダーまで突き進め! 俺!! 乞うご期待!!

23日目「グラフィックAPIの追加だ!!」

 衝撃の23日目が始まった! 今日はグラフィックAPIをふんだんに、あふれんばかりに追加した。しかし、今日のみどころはそこではない! 今日は、実は著者の知られざる過去があきらかになるのだ。もし、このBlogを今読んでる方で、本書を持っている方がおられたら、ぜひとも477ページを開いてもらいたい。するとちょうどページの真ん中に「make run」をしたサンプル画像がある。夜空を描いた画像だ。ウィンドウに点を表示するAPIを追加したので、それを利用したサンプルプログラムなのだが、問題はその画像から下へ2行目を読んで欲しい。よ〜く読んで欲しい。
(以下引用)

(夜空を描いた画像を指して)ええとですね、これは
筆者の友人が住んでいるペポ星から見た夜空なんですよ。

 ……………ペポ星? って、それどこの星だよーーーーー。そんな宇宙の果てに友人がおられるとは…。恐るべし川合氏(笑)。
 と、まぁ、もちろんこのテキストは完全な冗談なので、本当にいるわけじゃ決してないし(当たり前か)、著者も冗談として書いているんだが、でもだ。でもでもだよ。ハウエバーだよ。この本って、技術書なわけだよ。技術書なんだよ。OS作っちゃう本なんだよ。OSっていったら、もうなんかすごそうじゃん。エライ学者さんが書いてそうじゃん。そんな本に冗談とはいえ「ペポ星」という単語を出してくる著者の川合氏。絶対、おかしい(笑)。でも本書はエライ学者さんが書いてる本よりも断然分かりやすいし、本当に初心者に向けて書いてある。本当に理解してもらおうという熱意が伝わってくる感じ。そんな本を書かれた著者の川合氏、エライ学者さんよりもよっぽど尊敬できると思うのだ(これはお世辞じゃないよ。ボクは悪いスライムじゃないよ)。
 とまぁ、そんなこんなで今日やったのは、メモリ確保APIウィンドウに点を打つAPIウィンドウをリフレッシュするAPI線を引くAPIウィンドウを閉じるAPIキー入力のAPIを一気に作ったのだ。そして、最後はそれらを利用して、walkというアプリを作成した。このwalkというアプリは、数十年前のRPGの移動部分だけを簡略化した感じに仕上げたものだ。つまり、十字キーを押すと、「*」が移動するだけなのだ。しかし、これは立派なアプリなのだ。はりぼてOSのAPIを駆使して作った立派なアプリなのだ。なんか…、なんかさぁ…、素で涙出てきた…(ごしごし)。
 今日は最初から最後までAPIの追加で終始した。もうホント、OSっぽくなってしまって…、このやろ〜。でも、この辺りになってくると、本書自体が、新しく学ぶというより、これまでやってきたことを駆使して新しい機能を追加するという感じになってくるので、なんかBlogに書くことがなくなるぞ、このやろ〜(汗)。
 明日24日目は「ウィンドウ操作」で、ウィンドウの切り替えなどなどをやるらしい。ついに、あと残り1週間をきった。乞うご期待。

22日目「C言語でアプリを作れるぞ! ウィンドウを表示できるぞ!!」

 まずは、スタック例外の割り込みの話だ。
 はぁ? 例外って一個じゃないの? という感じなのだが、実は例外ってのは結構いろいろとあるらしいのだ。本書P451の欄外コメントを読むと、

CPUのマニュアルによると、0x00番から0x1f番までは、
例外用の番号ということになっている。それにあわせて、
IRQの割り込み番号設定では0x20番号以降にしたわけだ。

と書かれてある。つまり、例外用の番号は全部で32個も存在すんのかよ? という驚愕の事実。これはかなり驚きだ。それで、スタック例外の番号は0x0cなのだ。だから、割り込み設定で、0x0cを設定してやれば、これでスタック例外時の処理を行うことができる。
 そして今日の本題であるC言語でアプリを作成に入るのだが、今日はウィンドウを表示するAPIを作った。そして、それをC言語アプリから利用するのだ。さて、数日前からアプリを実行するようになったはりぼてOSだが、アプリケーションを実行させるには予想以上に大変であることが最近分かった。例えば一言でアプリを実行させるといっても、アプリが実行するコードを入れておく場所と、アプリが利用するデータを入れておく場所などをメモリ上で適切に分ける必要があるし、悪用目的でアプリを実行しようとする輩もいるだろうからだ。本当に細かい部分、普通にPCを使っている人には見えない部分にすごい気を使うのだ。
 俺はWindowsLinuxといった、あんなすごいOSを作る気なんてさらさらない(というか、そもそも作る技術がない)が、でも、この本を読んでいて思うのは、「ははー、OSの内部ってこうなってるんやなぁー」ということだ。このご時世、ただの一般市民な俺がOSを作るなんて、ぞくに言う「車輪の再開発」なわけで、ぶっちゃけ無意味なんだが(仕事じゃないし、1円の価値にもなんないし(笑))、でも、OS内部の仕組みを知ることがこれほど楽しいことだとは思わなかった。車輪の再開発だって? 大いに結構! 例えどんなにオンボロで、どんなに遅い自動車だったとしても、それが、自分ひとりで作った自動車だったなら、俺は乗ってみたい!!
 明日もいろいろなAPIを追加していくようだ。乞うご期待!

21日目「それでも…、僕には…、守りたいOSがあるんだ!!」

はりぼるーぜ「どのみち私の勝ちだ。もはや止める術はない。メモリは書き換えられ、上書きされたコードは新たなるクラックののろしとなる。人があまた持つセキュリティホールのひとつだ。その程度のOS、作ってきたのは誰だ!! 君とて、その1人だろう」
はりぼてきら「それでも…、僕には…、守りたいOSがあるんだ!!」
 そうなんだ。俺はOSを守りたいんだ。って、ここでひとつ質問! 「そもそも、OSを守るって何? 意味が分からん。」と思ったそこのあなた! 実は俺もそう思いました。OSを守るってなんなんだよー。
 ここでWindowsとかLinuxとかを思い出してみる(思い出して〜ごらん、あんなこと、こんなこと、あったでしょ〜)。すると、プログラマなら分かると思うが、よくへんなプログラムを実行すると、メモリアクセス違反というのが発生してプログラムが強制終了されていた。WindowsXPなら、変なウィンドウがでて、この情報をマイクロソフトのデータベースに送信しますか? とか言われるアレだ。
 それで、問題は「メモリアクセス違反っていったい何?」ってことなのだ。あれはぶっちゃけて言えば「アプリケーションが、OSしか使っちゃいけないはずのメモリを使おうとしましたよ」ということなのだ。いや、もしかしたら、微妙に違うかもしれんけど、そんな些細なことなんてどうでもいいんだ。要は、だいたいの感じをつかむことが大切なんだ。んで、つまりは、アプリケーションが勝手にいろいろな場所のメモリを書きかえることができたら、それはもう一撃でOSを粉砕することができるわけで、そんなことはOS的には、おいおいちょっと待てよ、というわけで、ここで、じゃあOSを守っちゃう仕組みを作っちゃおうという話になるわけですよ。
 だが、そのOSを守る仕組み(メモリ保護)は、またもやCPU様のお力を借りなければなし得ないことなわけなのだ。それで、どうやらCPUに、「ここから、ここまでのメモリはOSしか使えないからよろしく〜」といっておけば、そのメモリ領域にアプリケーションがアクセスした瞬間に、ちょい待ちよ〜だんな〜、そっから先はとうせんぽ、というわけで例外の割り込みを発生させてくれるというわけだ。そして、その例外割り込みは、具体的には「INT 0x0d」なんだ。つま〜り、マウスやキーボード割り込みを扱ったときと同じようにすれば、例外時の処理をさせることもなんなく可能なわけだ。うーん、簡単やん。
 だから、やたらめったら難しい言葉を使うと分かりにくいが、要するにCPUに「ここから、ここまでのメモリはOSしか使えないからよろしく〜」といっておけば、アプリケーションがそこにアクセスしたときに、おい待てよ〜、となって、なんかアプリケーションが悪いことしてまっせ、とOSに通知してきて、OSがアプリに波動拳〜、アプリはあえなく撃沈! という筋書きだ。
 というわけで、今日はOSの保護についてだった。なんかここ最近は、WindowsLinuxといったOSを使っているときにも、ちらっと「見える」部分の作成に取り掛かっているような気がする。いやー、なんか確実に進んでる感があるな(うほー)。
 明日は、C言語でアプリ作成だ! 乞うご期待!

20日目「文字表示のAPIを作ったぞ!」

 ついに20日目に突入だ。残りもあと10日。さて、実はこの辺りまで読み進めてきて、ふと思うことがある。それは、「俺も1からOS作ってみたい」ってことだ。もちろん、はりぼてOSを作ってる最中なんだけど、これはあくまでも本書の付録というか題材というか、本書の内容を理解するためのもので、自分が作りたいものではないわけだ。だから、著者の川合氏が書いたソースコードを読みつつ、うーんなるほど、と唸りつつ、そのコードを少し変更しては、「なるほど、なるほど。」と理解してればOKな代物なのだ。
 が、それじゃあ、なんか物足りない。いや、物足りなくなってしまった。本書を読み始めた最初の頃はOSのだいたいの仕組みを理解するだけで満足だと思った。そもそも、自作のOSを作る時間なんて俺にはねーよ! と思ってた。だが、ここまで来て、ここまで読んで、多少なりともOSについて知ってしまったら、もはや、そうはいられない。最近では、本書を読んでるだけで「俺だったらこういう仕組みにするけどなぁ…」とか思ってしまって、読書に集中できなくなる。申し訳ないけど、マジで作りたくなってきた。


安西先生…、OSが…、作りたいです…」


 というわけで、俺は作る! もう誰がなんと言おうと、作ったる! で、ちょうど明日は土曜日、明後日は日曜日じゃないか。ふっ、ふっ、ふははははははははは…、休日が全て見えるぞ…、氷の世界!(跡部様〜)。というわけで、本書を読み終える31日目までには普通に無理かもしれないが、とりあえず作ってみることにする。それに、本書についているサンプルコード(はりぼてOS)を少し変更しただけで、30日でOSを作ったといっても、なんか説得力ない気がするし。やっぱり31日目にはどんなに低機能でも自分が作ったものがあった方が良いはずだ! というわけで、気持ちあらたに頑張ります!
 ちなみに今日はAPIを作りました(おまけ扱いかよ!!)。いやいや、今日の内容も、これが結構面白くて、新しい発見があった。例えば、DOSプログラミングのシステムコールを呼ぶときのint命令とかもこういった仕組みで実現されてたんだなぁと。つまりIDTに0x30〜0xffのどれかを使って、API呼び出し用の関数を登録するわけだ。そして、アプリケーション側は「int 30h」という風にすることでAPIを呼び出すことができ、これをいわゆる「OSのシステムコール」なんていっちゃったりするのだ。さらに、21日目はメモリ保護(?)の話っぽいんだが、ここから先は、どうやらAPIの追加と、アプリケーションの実行が主な内容となっていきそうだ。ああ、はりぼてにどんどん肉がついていく…(うまー)。
 明日も乞うご期待!

19日目「typeコマンドよ! ファイルの内容を表示するのだ!!」

 昨日は休んでしまってすみません。まだ風邪が直ってなく、とりあえず休養をとらせていただきました。今日はもう万全完璧モードなのでモウマンタイです。熱もありません(界王拳10倍です)。というわけで、今日はtypeコマンドを作りました。
 まず、大前提として、どうやらharibote.imgには「はりぼてOS」のすべてが集約されているという事実。これ、結構重要! というのも、この本ってあまりに準備がよすぎて、著者がコンパイラからmakeファイルまですべて自前で用意してくれている。この著者の技術力の高さに驚きで胸がいっぱいだが、それはさておき、準備がよすぎるからこそ、小さなことを理解しなくても先に進めてしまうという「もろはのつるぎ」…シロウトにはお勧めでき…じゃなくて、落とし穴があるわけだ(もう、なんか言いたいことがよく分からんようになってるぞ)。
 つまり、haribote.imgには、OSとしてのデータ(プログラム)といっしょに、HARIBOTE.SYS、IPL10.NAS、MAKE.BATという3つのファイルも追加されているのだ。これって多分、分かってる人には「当たり前じゃん。お前アホ?」って感じかもしれんが、分からん人にとっては、全然わからん事実なのだ(というか俺は分からんかった)。だから最初にdirコマンドが実装されているサンプルプログラムをコンパイルして実行したとき、あれ? このHARIBOTE.SYSというファイルはWindows上にあるこのHARIBOTE.SYSファイルを参照しているのかな? という疑問を持ってしまった。いや、分かってる人には「当たり前じゃん。お前アホ?」って感じかもしれん*1。そうだよなぁ、分かってる人には「当たり前じゃん。お前アホ?」って感じだよなぁ。って、アホアホうるせーよ。何がアホだよ。アホいうほうがアホじゃ! アホはお前の方じゃ、このやろ〜。もうグレてやる、グレまくってやる。駄菓子屋の5円チョコ万引きしたる。駄菓子屋の5円チョコ万引きして、近所の子犬にあげたる。いつもは悪い不良が、たまに少し良いことをすると、必要以上に良い人に見られるという人間心理をあますことなく利用したる。へへへっ「俺は不良だが、本当はいいやつなんだぜ」というイメージをあますことなく植え付けさせたる、って、もうなんのBlogか全然分からーん
 それで、typeコマンドを作るためには、まずはharibote.imgの中に追加されているファイルを見ることになるのだが、ファイルというのは結局0と1の羅列であるため、haribote.imgのどこからがIPL10.NASなのかが分からんのだ。だって、ただ引っ付けているだけだから当たり前だ。だから、どこからがIPL10.NASなのか、どこからがHARIBOTE.SYSなのかをちゃんと書いておいて欲しいわけだ。だから、あらかじめそれが書いてある場所を決めておき、そして、それが書いてある場所のフォーマットがFILEINFO構造体で、この構造体を使って、ファイルの情報をゲットするわけなのだ。
 haribote.imgに必要なファイルを追加し、それをFILEINFOでゲットする。こういう流れではりぼてOS内でファイルの管理を行うことができるわけだが、ここでFATというふざけたやつらが登場する。お前らは俺たちを混乱させようとしているのか、まったく。たった0.2%のためにそんな複雑な仕組みを作るな、このやろ〜。
 Windowsのディスク管理方法では、512バイトよりも大きいファイルを扱うときに、次のセクタにデータの続きが書き込まれないことがあるらしい。なんじゃそりゃーー。意味わからんわ。嫌がらせか? おい? 嫌がらせか? 未来を担う子供たちにとことん苦労を背負わせようって魂胆か? と言う感じだが、だから、FAT(file allocation table)というファイル配置表をシリンダ0、ヘッド0、セクタ2〜9に置いているらしい。つまり、それを見て、適当にファイルを繋ぎ合わせてくれということらしい。もうマジめんどい。やめてほしい。
 だから、はりぼてOSで扱うファイルをFATに対応させるためには、こういう細かい苦労が必要になってくるのだ。FATに関する詳しいことは本書を読んでくれ。それで、今日のセイカブツは→本当に30日でOSが出来上がるのかを試してみるページ(19日目)だ。
 そういえば、この本にはファイル管理という章(?)がないけど、ファイル管理ってOS作るのに結構重要な知識ではないのかな? 正直こんな適当な理解でいいのかなぁという感じなのだが、一応、今日でアプリケーション的なものは実行できるようになったし、明日はAPIを作るらしいし、なんか本当にこの本は難しい理論を完全に抜きにして、プログラミング重視で突き進んでるなと思う。あんまり本書の評価を見たこと無いけど、意外と賛否両論かもしれない。個人的には、理論ばかりのOS解説本はすでに結構あるから、こういう解説本も必要だと思うんだけど。
 というわけで、明日はAPIを作っちゃうらしい。APIだよ、API。アプリケーション、プ…プログラミング、イ…、イン…テ…? イント…? イ…、イン………、乞うご期待!!

*1:こはちょっと書き方がまずいので、注釈を追加します。この文は、Windows上にあるファイルを参照しているわけでは決してない。そんなことは当たり前。という意味です。そもそもそんなことだったらWindows上でしか動作しないという変なソフトになってしまう。