うさぎともふもふしたりうさぎともっふもっふしたり。プログラミングしたり。
2012-07-28
初めてのC言語で『30日でできる!OS自作入門』の通りに初めてのOSを作ってみた
出版社 : 毎日コミュニケーションズ
発行日 : 2006/3/1
良い本です。アカデミックの匂いが良い意味で全くしない。その上での実践的な本は日本語で他に無いと思います。ガチムチアカデミックの批判にあえて真っ向勝負してるような意欲作です。
正しい知識だの用語だのそんなもんはどうでもいいから手を動かしてやってまえみたいな感じで。こういうのは頭いい人たちから批判されやすいですね。俗物な私にはぴったりでしたが。
本書はWindows用のサンプルしかないんですがMac用に整えたので、それ公開するついでに思ったことつらつらと書いときます。
開発環境
- Mac
- サンプルがWindows用なのでいろいろMac仕様にしなきゃいけない(後述)
- テキストエディタ
- EmacsだのVimだのなんでもいいので適当に用意
- バイナリエディタ
- Macだと0xEDが良い
- http://www.suavetech.com/0xed/0xed.html
とりあえずはこれらだけ用意して他にも必要なものがあるんだけど後述。
Macでの開発環境を整える
本書で開発するOSは著者の用意した開発ツールを使って開発します。名前はtolsetといって付属のCD-ROMに入っているんですがWindowsのみ対応しています。が、なんと、ウェブでMac用も配布されているんです(著者とは違う方が配布していらっしゃいます)
今回はそれを利用して開発しました。
また、OSを起動させるにあたってQEMUという仮想マシンも用意します。えーとこれはですね、VMwareとかVirtualBoxみたいなのと同じようなもんです。それらのソフトウェアが知らない人は、大雑把に言えばMacが起動している中でアプリみたいにWindowsが起動できたりするソフトと思ってください。Safari立ち上げている横でWindowsも操作できちゃったりします。
本書ではこの仮想マシンを使って開発したOSを起動させる方法と、フロッピーディスクを使い実機で起動させる方法が紹介されています。実機の方がそれっぽくはありますが、いろいろめんどくさいので仮想マシンを使いましょう。
それで、本書ではこのMacの中で他のOSを起動できるようにする仮想マシンとしてQEMUを使っています。しかし、例によってQEMUはWindows用です。ががーん。
でも大丈夫です。QEMUのMac移植版として公開されているQ.appがありますのでこれを使います。
でまあ、Mac用のtolsetとQ.appをなんやかんやと調節して開発環境を構築する必要があるんですが結構めんどくさい。さらにCD-ROMに入ってるサンプルもそのままだとMacでは動かない…...。
というわけで、そこら辺をうまくカバーできるようにしました。やったのは基本的にMakefileをこの開発環境用に書き換えたのと細かい部分を調節しただけですが。
いろいろ書くのめんどくさいので簡単に用意できるようにしてます。最終的にはターミナルからぽぽぽいとmakeするだけでQ.appからOSを起動できるようになってますんで、詳細は下記のページみてください。
とにかくここの準備はちゃんとしておかないとサンプルや作ったOSを試すときにかなりめんどくさいです。間違ってもコンパイルとかビルドを手作業でコマンド叩いてやろうなんて思わない方が良いです。
必要な知識とか技術とか
必要な知識や技術は挙げればたくさんありますが全くなくてもいいです。でもあったほうが良いです。どっちやねん。
というのも、必要な知識は学習しながら身に着けていけや三下どもが!という感じの書籍なのです。合理的ですが、知らないことばっかりだとモチベーションあがらないでしょう。だってOSに関係すること以外の部分も勉強しながらだったら絶対1日で終わらないもん。
C言語、アセンブリ、ターミナル(コマンドライン)、このあたりのことさえなんとなくわかれば大丈夫...かな。その他については本書でいろいろ説明があります。それでもよくわからなかったら調べながらやればなんとかなります。
たとえ分からないことがあってもなんとなしに分かった気になることが大切です。分かった気になればいいんです。いい加減なこと言ってますがそういう適当さがあった方が良いと思います。
あと、中学生でも分かるように書いたと書籍では述べられていますが…...たぶんわかんないと思います。巷で有名なスーパーハカーな人は知らないけど普通かそれ以下を自称する中学生ならきついでしょう。少なくとも私ならあきらめてます。
えーだめじゃんと落ち込むことなかれ。普通かそれ以下を自称する中学生が書籍で学ぶんだったらこれ以上易しいものなんて存在しません。たぶん。
つまり、作ってみたいならこれを参考にやるっきゃないということで。がんばれ青少年。まだフレッシュな感性のうちにやるのだ。無駄に年食ったおっさんやおばさんになったときだとヤル気が全然湧いてこないぞ。気力が全然湧いてこないんだ。昼からビールのみてぇとかしか思えなくなってくるんだ悲しくなってきた……。
そういうわけで今のフレッシュな感覚のうちにやっておいた方が無難でしょう。
もしやってみて途中であきらめてしまったとしてもそれは仕方がないです。誰も責めません。できたらすごいですよ。こんな内容の薄いものもできんのかとすごく頭の良い人たちは言ってくるかもしれませんが、そんな事言われてもわからんものはわからんです。
だから、できなかったらまた時間をおいてやればいい。たぶんきっと、そうやっても理解できない部分がたくさんあるかもしれない。でもそれでいい。がんばってるあなたはすばらしいんだ。ビジネスじゃないんだから結果なんてどうでもいい。
私が言うのもおかしなものだけどちゃんと全部理解できなくてもいい。感覚さえつかめればそれで良い。次があるなら問題ない。
わからないことがいけないんじゃなくてそれを5年後もわかっていないことが問題なんだ。そうやってつなげていければあるいは、たどり着く場所があると思う。
というクールな逃げ方をするのがハードボイルドな大人になるコツです。人生における逃げとは全てにおいて戦略的撤退なのだ。
初めてなら完全理解を捨ててOS入門すること
全てを完璧に覚えて理解してやろうなんて考えない方が良い。それよりも大要をつかむことに集中した方が良いと思う。
私もそうして30日以内で終わらせることはできた。結果的に毎日できたわけじゃないし、いろいろな理解を捨てたけど。わからない部分があるというのは居心地が悪い。だけど、ずっと立ち止まって考えるよりは良いと思う。
全部初めてのことだから全体的になんとなく理解できれば問題ないし、あるいは目的があるならそこの部分だけ理解できるように集中した方がいいでしょう。細かい部分気にしてたら時間が足りないしモチベーションも保てない。
ここでわからなくても次で理解できればいい。いくつかこなせばパターンも見えてくるだろうから、そうなったらあとは確認作業みたいなもので、突き詰めるとどれだけ真っ直ぐ向き合えるかという話になってくる。
というのは頭の中で考えた話でそんなすんなりいくわけじゃない。いくわけじゃないんだがそういうもんじゃないかなと予測している。
とはいえ、私は自分だけのOSを作りたいって目的があるわけじゃなくて、ハードとソフトがどんな関係で成り立っているのかってことが知りたいだけだから、曖昧でもいいからイメージできれば十分だったりする。
そんな線引きをしながら本心ではやっぱりもっと正しく理解したいんだよね。でもこの欲求に見合う頭が私には無いから、そのへんのバランスをとりながら踏み込んでいきたいなと思っている。
分からなかったら分かった気になれ
やっているうちに分からない部分がたくさん出てくるでしょう。そういうときは立ち止まって考えるより分かった気になって通り過ぎるのが良いです。
真面目な人はそんなのいけない!と怒るかもしれませんし、私も真面目じゃないけどそういうの嫌だなと思う。だのに、なんでこんなことを言うのかといういえば、分かった気になっちゃえばいいと坂村健さんもおっしゃっていたからです。TRONで有名な坂村さんです。
パソコン周りの用語とか概念て難しいから、とりあえず分かっちゃった気になればいいよみたいなことを『痛快!コンピュータ学』で言ってたのです。
だから分かった気になればいいんです。こんなすごい人がいってるんだから間違い無いです!(根拠は権威です!)
でも、分かっていないことは自覚しときましょう。えーとだから、「私は分かった気になったけれど実は分かっていない」ということを頭においておくんです。
それでどんどん突っ走って、途中で戻ったり、寄り道したり、そんな感じでやっていけばいいんじゃないでしょうか。というかそういうやり方の人の方が成長が早そうな気がします。
学習をする上でこうしたらよかったなと思ったこと
- 自分の手でコード書く。サンプルをつぎはぎして作らない
- めんどくさくて多くの部分をつぎはぎしちゃった。正直C言語扱えるって言えないレベルで反省
- ただ本書では書き直す部分がたくさんでてきてめんどくさい><
- でもこれは実際にコード書いて開発するってこんな流れなんだな、みたいなことを伝えたいからだと思う。それを察することなく無駄な文が多いだのまとまっていないだのと批判するのは的外れだと思うよ。そういう体系だった内容の書籍は他にあるんだからそっちにまかせちゃえばいいもの
- 分からない関数があれば696pにある索引の付録を利用する
- 印刷しておくと便利。改造の流れも忘れたとき把握できる。30日立った後に気づいて泣いた
- 基本的な部分は16日目ぐらいまで。そこら辺をしっかり理解できればうまく波に乗れるはず
- メモ取りながらやる
- 一応取りながらやったけど、取らない日があったりまちまちでうーん。ちゃんととっておくと後々便利な気がする。でもめんどくさいからなくてもいいよ
- 分からなくても分かった気になれ
- 最強のコツ
これをふまえてもう一度挑めばもっと理解できるかもしれない!と思いつつ、もう一度やろうという気にはなれない。燃え尽きちまった。またいつかやるよ。たぶん。たぶん。
個人的に本書のレベルは調度良いより少し辛口で難しかったです。
でもいろいろ経験できてよかった。時間経つとなんもかんも忘れちゃいそうだけど、一度通ったことがある道ができたというのはいい事だ。きっと。そうだ。いや、そう思わないと、だって得たものが何もないなんて悲しすぎるじゃない。
- 644 http://b.hatena.ne.jp/
- 362 http://b.hatena.ne.jp/hotentry/it
- 360 http://b.hatena.ne.jp/hotentry
- 303 http://www-ig-opensocial.googleusercontent.com/gadgets/ifr?exp_rpc_js=1&exp_track_js=1&url=http://www.hatena.ne.jp/tools/gadget/bookmark/bookmark_gadget.xml&container=ig&view=default&lang=ja&country=JP&sanitize=0&v=3a9581e43da64162&parent=ht
- 274 http://t.co/rRm7RNHb
- 161 http://reader.livedoor.com/reader/
- 117 http://www.sleipnirstart.com/
- 85 http://www.google.co.jp/reader/view/
- 73 http://www.google.co.jp/reader/view/?hl=ja&tab=wy
- 66 http://twipple.jp/