12日目「スタープラチナ・ザ・ワールド!! 時よ止まれッ」

 本書の12日目分を読み進めたのは昨日なのだが、ちょっと時間なくてBlogを更新することができなかった。よって、とりあえず昨日の分を書くことにする。
 それで、昨日やったのは、タイマ割り込み。久しぶりのハードウェア制御プログラムで、一定期間に定期的に割り込みを発生させてくれるすぐれものな仕組みだ。どうやら、タイマを使うためにはPITを利用する必要があるらしく、PITは制御方法はPICとさほど変わらないらしくて、とても簡単だ。というよりも、以前割り込みでPICを扱ったときにはやたらめったら難しく感じたものだが、いまあらためて、今度はPITを扱うプログラムを書いたら、これがさほど難しく感じない。これはやっぱり成長したってことなのか、それともただPITの方が扱うのが簡単だっただけなのか。まぁ何はともあれここは難なくクリアできた。http://community.osdev.info/?%28PIT%298254の「ものぐさなひとのために」という項目をみれば、扱い方が載っているので、これで万時解決だ!
 また、今回はアルゴリズム的に難しい部分もあまりないので、すんなり進むことができた。機能作った高速カウンタを1/100秒ごとに進めるように変更する。さらに、タイマ割り込みを扱うと、時間関連の大抵のことが可能となるので、たとえば、カーソルの点滅なんてことも朝飯前。一定期間に定期的に処理をさせるという割り込み。なかなかGOODな仕組みだと思う。これを利用すれば、例えば、時計なんてのも簡単に作れるはず。タイマは工夫しだいでいろいろと応用ができそう。うーん。面白そうだ。セイカブツは→本当に30日でOSが出来上がるのかを試してみるページだ。
 そして、実は今日読み進めるべき13日目もタイマ処理についてなのだ。というわけで、
 13日目に続く!

11日目「ウィンドウを表示したが、×ボタンはまだ押せないのだ!」

 なんかこの本普通に売れてるやーん → ヤフーコンピュータ本ランキングamazonでも7位とかいったらしいし、マジすごいぞ。なんか俺がもくもくと読み進めている最中に世の中はこんなにも動いていたのか、ちくしょー。いつの間にかWBCは始まってるしよ。ライブドア上場廃止になるしよ。FF12発売まであと3日になってるしよ。なんか普通に取り残されてるぞ俺。だって、だって、テレビ見る時間なんてないだろがー。みんなそんなに時間あるのか? そんなに余裕なのか? そんなに自由なのか? つらいのは俺だけなのか、このやろ〜。俺だってFF12やりてーよー。空賊になりてーよー。飛空挺で空を駆け回りてーよー。「緊急事態、緊急事態、2000メートル先に未確認コンクリート物体発見! あっ、あれは…、毎日通勤している俺の会社だ!! ロックオン…………ファイヤ!!!」………どごぉーーーん。
 というわけで、ついにやってきた、ウィンドウの表示だ。本当に30日でOSが出来上がるのかを試してみるページ(11日目)を見てくれ。ウィンドウといえばGUIGUIといえばウィンドウだ! つまり窓だ、窓なのだ。しかし、残念ながらウィンドウが表示されてはいるが、×ボタンは押せないしウィンドウ自体をドラッグで動かすこともできない。ただ、表示されているだけだ(つまらん)。しかし、なんかどんどんOSっぽくなってきたんじゃないのか? おいおい、いま何日目だっけ? えっと11日目だ。11日目にしてはやくもOSっぽくなってきたぞ。
 さて、今日やったのはシートを利用したウィンドウの生成であり、昨日やったことの応用みたいなものだ。というよりも技術的には昨日とさほど変化していない。これは実は結構ありがたかった。というのも、昨日の内容をさほど理解していなかった俺にとってみれば、今日も同じ内容でしかもそれほど難易度が高くなっていないというのは、あらためてもう一度学習する機会が得ることができたからだ。この辺りはやはり読者のために考えられて書かれていたのか、はたまた偶然こういう具合の構成になっていったのか。まぁ読む方からすればどちらでもよいのだが、なんとも良い感じに仕上がっている本ではないか。
 だた、今日のウィンドウ表示でやっている「画面のチラチラ対策」についてなのだが。俺のPCではそもそもチラチラが発生しないのだが…(笑)。だから、本書の通りに読み進めていっても、全然違いがわかんないです。だって、チラチラしないもん。これなんでですか? いや、ホントにチラチラしないんです。でも、一応、やっぱり対策やっといた方がいいのかなと思って、ちゃんとチラチラ対策まで読み進めましたが、どうにもチラチラしないので、違いが分からん。まぁこの辺りは環境によって大きく依存してしまうんだろうか。
 というわけで、今日は、昨日の復習も兼ねて結構ちゃんと読み進めることができたぞ。良い感じだ。ただ、アルゴリズムがやっぱ難しいんですよ。本書の最初の方はハードウェアの制御処理とかでいろいろと苦労したけども、いまはなんか小難しいアルゴリズムで苦労しています(いつも苦労しとるな)。やっぱOS作りって一筋縄ではいかないようだ。本当に、MonaOSとかOSASKとかその他いろいろなOSを以前から作ってる人たちには関心するばかりだ。OSを自分で作ってみて、あらためてそういう人たちのすごさみたいなものが分かるというのはある。うーむ、世の中すごいやつがたくさんいるんだなぁ(オラわくわくしてこないぞ、全然してこないぞ)。はい、すごいやつを見てわくわくするのは戦闘民族だけで十分です。普通のプログラマはOS作りに対してわくわくしてればいいのです。と、なんかいかにもうまいこと言った雰囲気になったところで。
 明日も乞うご期待!

10日目「メモリ管理よりも、むしろ重ね合わせ処理の方が難しくないですか?」

 いよいよやってきました、10日目。思い返せばもう1/3も終わったんですねー。いやー、それで、あとどのくらい残ってるんですか? えっ? あと2/3もあるんですか? そうですか…。まぁ死なない程度に頑張りたいと思います(汗)。
 それで、早速ですが、今日はマウスの重ね合わせ処理だったんですが、これ、とてつもなく難しいと感じたのは俺だけでしょうか? いや昨日のメモリ管理よりも、断然こっちの方が難易度が高かった気がします。要するにバックの画像とマウスの画像をそれぞれシートとして管理し、一番下のやつから順番に描画していくことで重ね合わせを実現しているわけだったんですが、これが細かいところがやたらとややこしいんです。なんかサンプルプログラムに出てくる関数の引数もやけに多いですし、透明色(つまり下の画像と色を合わせる色)の処理もなんかいまいち理解できないし。
 本書の解説も、この辺りになってくるとソースコードが多くなってきて、詳細な解説が結構省かれてたりするんです。まぁ著者としても「ソースコード見ればだいたいは分かるよね?」ということでしょうし、こっちとしても大抵はソースコードを見ることでなんとか頑張れるんですが、しかし、やっぱり難易度が高い
 確かに、だいたいの大まかなアルゴリズムは理解できるんです。それについては本当に詳しく解説されています。でも、そのアルゴリズムソースコードにした、そのソースコードを解読するのがなかなか難しいんですよね。構造体がいつくか出てきて、その構造体の配列やらポインタやらで、なんかもう、C言語もすげーややこしいんです。まぁ、C言語ってこんなややこしい言語だったのかよ、とあらためて思うヘタレプログラマな俺も俺なんですが…(だからポインタで挫折したって言ったじゃん。そう言ったじゃん(涙目))。本書はやはりポイントポイントで結構難しい内容があるなぁと思いました。
 それで、このままではヤバイので、一度ちゃんとしたまとめ(復習)を行った方がいいなと思いました。要するに、ちゃんと理解できてない部分だけ徹底的に補強すべきなんですよ。つまり、本書を1日1章ずつ、30日読み進めていっても、おそらくOSを作れるようにはなれない。というより、全部を理解できている状態にはなれない(少なくとも俺は)。それで、じゃあ何が必要かというと、1日1章+これまで学んだ章の復習が必要なわけですよ。中学校で先生から習いませんでしたか?「なによりも復習が大事である」と。そうなんですよ。学問において大事なことは復習なんですよ。負けないことや投げ出さないことや逃げ出さないことじゃないんですよ。信じることでもないんですよ。学問に真心はいらんのですよ。兄弟で活躍するのはマリオとルイージだけでいいんですよ*1。いやでも待てよ、待てよ。投げ出さないことは結構必要かもしれないぞ。うんうん。よし、これだけ認定!(何の?)
 というわけで、明日から少し真心を入れかえてお送りすることにします(といってもBlogの内容はほとんど変わらないと思いますが…)。
 乞うご期待!

9日目「メモリ管理だよ〜、なんかいかにもOS作ってるって雰囲気だよ〜」

A「お前、最近どんなプログラム書いた?」
B「ん? 最近はちょっとしたOSのメモリ管理プログラムを書いたよ」
 こんな会話をしたら周りからすごいやつだと思われそう…、と、完全に不純な動機まるだしで9日目を読み進めてきましたが(ぉぃ)、まぁそれくらいメモリ管理って難しいイメージありますよね(ない? あるよな?)。ただ、結局はメモリを管理するだけなので、メモリを管理できればいいわけで(そのままだけど)。つまりは、どこぞの天才プログラマが考えるような、そんな小難しいことは俺みたいなやつには理解できないわけで、そんな分からんもんに何日もかけてる時間もないわけで、そんなもんはお前らで勝手にやっててくださいって話なのですよ。こっちは毎日働くので精一杯なのですよ。生きるので精一杯なわけですよ。ただの一般プログラマには、お金もなければ時間もないわけですよ(涙)。だから、なんかすごい複雑で高度なメモリ管理方法とかを知る必要もないわけですよ。というよりも、できればむちゃくちゃ簡単な、それこそ3分クッキング風味なメモリ管理方法で十分なわけですよ。それを教えて欲しいわけですよ。それこそが知りたいわけですよ。
 なのにだ。なんでいろいろなBBSとかで「メモリ管理について知りたいんですけど」って書き込むと、全然ワケワカラン返信が返ってくるんだよ、このやろ〜。こっちは普通の人なんだよ。一般ピープルなんだよ村人Aなんだよ。じゃあ、お前ら何か? 村人Aに天空のつるぎの使い方を教えるのか? それで敵が倒せるのか? ピサロが倒せるのか? 世界を平和にできるのか? できるわけねーだろが〜。せいぜい、こんぼうでスライム倒すのが関の山だ。だがな、俺はスライムが倒したいんだよ、スライムこそが俺の本当の敵なんだよ。真の敵はスライムだったんだよ(ピキッー、ぼくはわるいスライムじゃないよ)。
 というわけでだ、俺は本書に書かれてあるようなメモリ管理方法の解説はとてもよいと思う。小難しいことはすっ飛ばしてるからかなり分かりやすいし、なるべく初心者に向けて書かれてある。著者のこういう「とりあえず動くものを作ろう」というスタンスは何かとても共感できる。難しいことなんてあとからどうとでも学べばいいわけで、とりあえずは動かなければ楽しくない。
 それで、結局はメモリ管理というものは、○○番地から××バイトだけ空きがあるよーん、という情報の表みたいなものでOKなのだ。だから、その表をプログラムで作るだけでとりあえずは問題ないのだ。んで、それだけならば、実は結構簡単に作ることができる。要するに、メモリを開放するときに、そのメモリ領域の前後に空きのメモリ領域が存在するかどうかを調べて、存在するならそれらと合体させる。そのような仕組みを作るだけでなんとかなりそうだ。というわけで、今日のセイカブツは→本当に30日でOSが出来上がるのかを試してみるページだ。メモリ管理ってかなり難しそうなイメージを持っていたけど、実際にやってみると結構ちゃんと理解できて良かった。
 しかも確実に楽しいと感じる度合いが増えてきている。こ、これは…、いったい……。明日はマウスの重ね合わせ問題を攻略するようだ。なんか少しずつテンション上がってきたぞ。
 明日も乞うご期待!

8日目「マウスが動いたよ」

 えっと、昨日は更新できなくてすみませんでした。実を言うと、昨日は8時くらいに勤務を終え、そろそろ帰ろうとした瞬間を上司からピンポイントで仕事が入りまして、結果、帰りの電車が終電から始発に変わりました。プログラマってそんなもんですか? そうですか。そんなもんですか…(orz。
 それで、OSの方はというと、やっとマウスが動きました。といっても前回ですでにマウスのデータは取得できていたので、あとはそれを適当に加工することでマウスの動作を行うことができるので以外と簡単でした。サンプルプログラムは本当に30日でOSが出来上がるのかを試してみるページ(8日目)に置いてあります。今日はとても面白い内容でした。特にプログラムを組むことによってマウスが動いている様を見るのはとても快感です。やばい、これが本書の著者が取り付かれてしまったOS作りの魔力なのか…(笑)。
 さらに今日は32ビットプロテクトモードへの移行処理の解説もされた。これで、一応、これまでのプログラムはすべて理解していること前提で9日目以降へ進むことになった。しかし、6日目問題といい、32ビットプロテクトモード移行処理といい、結構難易度が高い課題が多い。これらはまだ完璧に理解しているとは言い難い。今後、メモリ管理、ウィンドウ、タイマ、マルチタスクというようにOSの本質の部分に進んでいくためには、やはり、この基本部分を完璧に熟知している必要があるんじゃないか、とちょっと不安だ。これは改めてちゃんと復習する必要がありそうだ。しかし、やっと1週間を超えてようやく面白くなってきそうだ。これからの内容はマジでとても楽しみにしている。
 なんとか楽しめるレベルまで技術が上がってきた俺、さて、このあとも読み進めていくことができるのか。
 乞うご期待!

7日目「マウスとキーボードの割り込みができたぞ〜」

 今日はそんなに難しくなかった。というか、昨日がやたらと難しかったので、それと比べたら全然簡単やーん、という感じだった…。とくにFIFOなんて普通にプログラマやってる人なら大抵すぐに理解できるだろうし、いたって簡単なアルゴリズムだ。しかも、それをこうも分かりやすく説明してくれているわけだから、まぁいくら凡人の俺でも分かります(といいつつ何回か読み直してたのは内緒だ)。それで、今日やったことはマウスとキーボードの割り込みデータをゲットすること。しかしまだマウスは動かない。あくまでもデータをゲットできるだけ(ポケモン、ゲットだぜ〜)。とりあえずはセイカブツ「本当に30日でOSが出来上がるのかを試してみるページ(7日目)」を見てくれ。→http://www.geocities.jp/hariboteos/#l7
 実はワケあって環境がWinXPからWin98にバージョンダウンしてしまった。だからキャプチャ画面もWin98のものになっている。まぁどの環境でも学ぶことができる本書はなかなか気の利いたことをやってのけてくれている。実はこういう地味なところに気を配っている本は案外少なかったりするのだ。特に最近のプログラミング関連の書籍は「プログラマなら最新のOSくらい持ってろ! ボケ! カス! ゴミ!」と言わんばかりだ。プログラマだからってなぁ、なんでも持ってる、なんでも知ってると思うなよ! なんでプログラマってだけで、年賀状作成ソフトの使い方を教えなきゃならんのだ!
プログラマだから使い方分かるでしょ?」
って「分かるかボケーーーー」。俺はパソコン教室の先生じゃねーんだぞ。
「えっ? プログラマなのにこんなのも分かんないの?」
って、何その妙に疑っている目。お前ホントにプログラマ? と、そう言いたいのか? そう言いたいのか? おい。しかもそんなときに横から入ってきて
「まぁまぁそう言うなよ。いくらプログラマっていってもさ、ピンキリあるんだよ。なぁ?」
ってそれフォローになってないから! ピンキリ? 確かに俺は凡人だよ。普通の人だよ。そもそも文系だよ。もうお前らなんて知るかーー。
 と、ちょっと話がそれたので、もとに戻す。そして、今日やったのは結局のところキーボードとマウスの操作方法なのだ。この辺りは多少難しいというか、要するに覚えることが多いような気がする。しかし、覚えてしまえばなんてことはなく、データ取得方法さえわかれば、あとは結構どうにでもできる。キーボードに関してはhttp://community.osdev.info/?%28AT%29keyboardのページを見ておけば多分なんとかなるはず。あとhttp://community.osdev.info/?%28PIC%298259Aも重要。
 というわけで、一般的に難しいと感じるところはやはりハードウェア制御の部分だと思った。アルゴリズムのところは案外それほど難しくない(まだ最初の方だからかもしれないが)。で、それは実は当たり前で、ハードウェアを制御するプログラミングなんていまのご時世ほとんどのプログラマはやらない。だから資料もない。それで知識もつかない。でも、一般的なアルゴリズムの部分は多少なりとも書籍も出ているし、一応プログラマなわけだからある程度そういう分野は得意なはずだ。だから簡単に思える。今後、そういうハードウェアの制御部分が少なくなっていき、純粋なOSの機能拡張という方向に本書が進むならば、確かに6日目がある意味一番難しいところだったかもしれない。そして、それを乗り越えさえすればなんか結構先が見えてきそうな気はする。著者いわく、8日目くらいからやらされてる感がなくなりじょじょに楽しくなってくるらしいので、その言葉に期待して今日は寝ることにする。
 それはそうと、毎日何かを少しずつやっていくというのは、思った以上にハードなことだなと最近つくづく思う。だって、俺ここ1週間くらい、仕事の資料とこの本しか読んでないんだけど(というか、仕事中にスキをみて読んでる)。なにこの多忙さ。ありえねーよー。学生時代に戻りたい…。
 というわけで、学生諸君! 社会人は大変だぞ!!
 明日も乞うご期待!

6日目「これほどまでに…」

 これほどまで「むりぽ」と叫びたくなったことが、いまだかつてあっただろうか。
 軽快なテキスト、語りかけるような口調、丁寧な解説、例題に沿ったサンプルプログラム、どこをどうとっても、この本は初心者に向けて書かれてあるはずだった。いや、事実、初心者のための本であったのだ。しかし、この6日目はいったいなんだというのだ。著者自身もラスボス級とおっしゃっていたので覚悟はしていたのだが、本当にラスボス級じゃないですか…
 やっぱりあれですかね、もしかして、読者にも人造人間セルと対峙した時のヤムチャの気持ちを分からせようとしたとかですかね? いや、ホントもう分かりました。ごめんなさい。これまでことごとくヤムチャを馬鹿にしてきてごめんなさい。ヤムチャだって頑張っていたんですよね。ナッパが植えたサイバイマンに普通にやられた時には「まさか〜、こんくらいじゃ死なないよ〜、冗談だろ?」と本気で思った俺が浅はかでした。本当にすみませんでした。
 それで、今回の問題はセグメンテーションというやつだ。これはいわゆるプログラムごとにメモリを分割する仕組みみたいなもので、本来メモリは4GBすべてにアドレス0x00000000〜0xFFFFFFFFが数値で割り当てられているのだが、例えばあるプログラムが0x1FFFFFFF〜0x2FFFFFFFのメモリ領域を使うからといって、じゃあメモリアドレス0x2FFFFF00に15を代入とかいう風にプログラムされているわけがない。だとしたら、このプログラムは必ずどんな環境においても0x1FFFFFFF〜0x2FFFFFFFに読み込まれなければ正常に動作しなくなるので、まったくもって実用性がない。んで、じゃあどうしよ? というわけで、考えられたのがセグメンテーション。これはすべてのメモリを任意のサイズに分割して、その分割されたひとつの領域は必ずアドレス0から始まるようにするというもの(らしい)。これで、どんなプログラムも0からアドレスが始まるわけなので、そのようにして作っておけば、万時OK。
 そして、これを設定するためにはメモリ上にGDTというのを作らないとダメらしい。そしてそのGDTのアドレスをCPUのGDTRレジスタに入れることで、セグメンテーションが発動する(多分こんな感じだ)。次に、割り込みの話に移る。割り込みの設定もこのセグメンテーションと似ている。割り込みってのは要するにマウスとかキーボードとかが何かしらの動作をしたら、それをCPUに通知して、通知を受け取ったCPUが、現在行っている処理を一時中断して、割り込み関数を実行し、実行し終わったらまた以前行っていた処理に戻るという仕組みだ。これもメモリ上にIDTというやつを作ってCPUのIDTRレジスタにそのアドレスを入れないとダメというわけだ。
 要するに、今回やっていることは「CPUのこと」なわけだ。CPU様にどうにかこうにか力を貸して欲しいというわけなのだ。そして、割り込み信号を送ってくれるPICというなんかどうにもいけ好かないやつがいて、どうやらCPU様の他にそいつのご機嫌もとらなければ割り込み処理はできないらしい。だから、ソフトウェアとかマシン語とかプログラムとかそんな目に見えないもんなんてとりあえずどうでもいいから、PCの中身を開けてCPUとPICを見て、こいつらがこの難易度の元凶か、くたばれ〜。バキッ。あ〜やっちゃった〜。というわけなのだ。
 だから、難しいといえばまぁ難しいんだけど、要するにCPUとPICの設定方法に終始しているわけだから、多分覚えてしまえばなんとかなると思うんだ。きっとそうなると思うんだ。俺は信じるんだ。いつまでも信じ続けるんだ。きっと…(そして僕は星になった…)。
 ただ、正直、俺自身まだあまり理解できてない部分もある。でも、著者の川合氏も、とりあえず先に進むことで分かってくるというスタンスですし、俺もこういうタイプの難易度のものは先に進めばあとからちゃんと分かってくると思っている。本書自体も、常にソースコードがついており、分からなくてもとりあえず先に進めるような構成になっているので、これはおそらくそういった場合を考えて書かれているんだと思う。このBlogの主旨でもあるわけだが、とりあえずは30日続けること。文句はそれからどんどん言おう(笑)。ということで、とりあえず、今日の成果だ→本当に30日でOSが出来上がるのかを試してみるページ(6日目)
 今日の分は1週間後にもう一度もどってきてちゃんと読んでみようと思う。というわけで、とりあえず明日も進んでみる! さて、6日目をあまり理解していないが、7日目以降も読み進めることができるのか。
 乞うご期待!