『12ステップで作る組込みOS自作入門』を読んで〜モバイルアプリエンジニアの生存戦略〜

『12ステップで作る組込みOS自作入門』という本を読んだので、その内容や感想について書いてみる。

動機

ウェアラブル時代に備えて

勝手な予想ではあるが、これからウェアラブル端末向けアプリケーションの需要が高まるとすれば、それはすなわち計算資源の少ない環境での開発が避けられないということではないかと思う。そうすると、アプリケーション開発者も低レイヤの知識を身につけておいて損はないのではないかと考えている。

モバイルソフトウェアの限界を感じて

なんとなくソフトウェアだけで問題が解決できそうな時代ではなくなってきた気がして不安を感じている。もし本当にハードウェア・スタートアップとかが台頭してきて、一山当てる時代とかになったら対応できないとまずそうだ。(モバイルソフトウェア開発自体に価値がないということではない。「アプリとか誰でも作れる。そのうち無くなる仕事。」みたいなニュアンスの語り口の人をtwitterとかで稀に見ることがあるが、「いや、そもそもこっちだって動くものを作るだけなら簡単なのは百も承知だ」というのがあって、そういう言説には多少イライラしている。ある程度の規模のアプリケーションを長期的に運用していくマネジメントとか、大規模なフレームワークを隅まで理解している人の重要さとかを側で見ていると、「誰でも作れる、なんていう暴論を吐くのはアプリケーション開発に対する無知のなせる業だろ」っていうのが一番言いたくなることだが、それは置いておく。)

未来予測のため

コンパイラやハードの進化がソフトウェアで実現できることを底上げするわけであるから、これらの進化を追うことはソフトウェアの未来予測に繋がるはずである。例えば、Appleが製造するチップの性能やLLVMの新機能などを見ていれば、Apple製デバイスの長期的な戦略が多少は察しがつく(今だとGPU関連の技術への投資が目立つ…)。

ブラックボックスを減らすことで、心理的負荷が下がる

私の中でプログラミングの最大のモチベーションはブラックボックスを減らすことだ。前書きにこんな記述がある。

興味があれば、本を読むのも試行錯誤をするのも面白いでしょう。面白ければ続けることができます。大切なのは継続することです。そしてそのために考えるべきは、「どの順番で読むべきか?」ではなく「自分のモチベーションを維持するにはどうしたらよいか?」なのです。だから好きなことをやる、興味のあることを優先するという考えは、とても良いと思います。

どんなレベルであれプロであるのだから、自分が生み出すものの価値を考えないといけないのは当たり前だが、その生産者である自分のモチベーションがゼロになったら何も届けられない。だから、自分のモチベーションを維持することを最優先に置くことに罪悪感を感じる必要はないのだろう。「まえがき」、「あとがき」が熱い本は大体良書である。

なぜこの本か

以下の条件で絞った。

すると、この本と『30日でできる!OS自作入門』ぐらいしか残らなかった。汎用OS向けのアプリケーションの開発者である以上、後者をやるほうが自然な気もしたが、後者を軽く立ち読みしたところ相当な章をGUIの実装に割いており、基本的な部分が知りたい自分には合わないと思ったので、結局この『12ステップで作る組込みOS自作入門』を選んだ。Linuxカーネルのソースとか読めたらいいのだが、自分を過信しても仕方がない。

特に良かったところは

無駄が少ない。最小構成。

派手な機能は一切なく、OSと呼べるものの最小のものを作る。本当に知りたいことだけを知れる。できることが少ない代わりに、見事なほどブラックボックスが排除されている。

GNUのツール群を採用

この書籍内でしか使えない知識ではなく、普遍的な知識が身につく。

Mac OSXの環境でも開発できる

http://blog.livedoor.jp/noanoa07/archives/1991674.html

とか

http://www.slideshare.net/sandai/12step-1-14296356

が役に立った。

学べること

アセンブラ

スタート・アップ部や割込み処理でのレジスタ退避などの箇所でアセンブラを書く必要があった。主にスタックポインタやプログラムカウンタの操作。特に「どういう部分はC言語ではなくアセンブラで書く必要があるのか」ということが理解できたのが良かった。

リンカ・スクリプト

はじめてリンカスクリプトを書いた。実際にメモリマップを指定して、テキスト領域、データ領域、BSS領域などを設定することで、実行時にメモリがどうなっているのか具体的にイメージできるようになった。

標準ライブラリ関数

コンソールの入出力やメモリ管理用の関数を自分で作成した。

スタート・アップ

main関数を実行する部分を実装することで、自分が作成したプログラムがどのように実行されるのかイメージできるようになった。今まではmain関数から先のことしか理解していなかったので、見通しが良くなった。

ローダ及びオブジェクト・ファイル・フォーマット

ELF形式を解析しメモリ上に展開するローダを作成した。

学べないこと

汎用OSの本ではないので、仮想メモリやプロセスについては学べない。また、多重割込みも実装しない。

どういう人が読むべきか

自分と同じような境遇の人は読むと相当な見返りがあると思われる。つまり、専門教育などによってハードウェアに関する教養を身につけたことがなく、ソフトウェアの開発しかしたことが無いような人には確実にお勧めできる。まっとうな経緯でプログラマになり、そんなことは働く前に知ることでしょ、というような人はもちろん読む必要がないと思う。

ハードウェアとソフトウェアのインターフェース

コンピュータに関する包括的な知識が記述されている本ではじめて読んだのは『文系学生のためのコンピュータ概論』という本だった。

これは、新卒で入った会社の研修の一環で読まされたのだが、なかなか良い本だった。「バベッジがあれした」とか「エニグマ暗号がどうだったとか」いう話から、OS、コンピュータの五大要素といったお約束の話が載っていて、今思うと大した内容ではないのだが、これを読んでなければジャババーチャルマシンの上で「Hello, World」やっているレイヤから一切出ようと思わなかったかもしれない。

その後、もう少し利口になったところでパタヘネを読んだのだが、こっちは少し難しくて通読するというわけにはいかなかった。リファレンス的に使う分にはかなり役に立っているが。

ところで、このパタヘネのサブタイトルは『ハードウェアとソフトウェアのインターフェース』というものだが、この『組込みOS自作入門』もハードとソフトの狭間を見せてくれるという意味で、パタヘネの導入として良い本ではないかと思う。メモリマップドI/Oでのレジスタ・マッピング、割り込みベクタのアドレス、汎用レジスタの仕様などといったハードウェアの詳細を考えてプログラムを書くことで、まさに『ハードウェアのソフトウェアのインターフェース』を体感できる。

難易度

相当に親切な本だと感じた。特に前半はスラスラと読むことができた。ただ、Amazonのレビューとかを見る感じだと、後半は結構難しいみたいなことが書いてあって、実際少し難しかった。アセンブラやリンカ・スクリプト内のシンボルを参照したり、割込みでプログラム・カウンタが強制的に書き換わったりするというようなことを普段の開発では考えることがないので、後半に行くにつれてコードを追うのが難しくなっていく。とはいえ、挫折するレベルではないし、このレベルの知識をこの易しさで説明できている本は他にないと思われる。スレッドを実装する8thステップが全体の中で大きな比重を占めるので、ここを熟読するのが良いと思われる。