技術日誌

DB,Java,セキュリティ,機械学習など。興味のあることを雑多に学ぶ

30日OS自作本を読み終えた

まぁほとんど著者のコードをなぞっているだけで、 施した改造も少なく、「OSを自作した」なんて口が裂けても言えませんが、 シンプルなコードが動いていく動作を本書や類書の解説とともに追いかけることで 自身の技術力、知見がかなり高まったように思えます。

30日でできる! OS自作入門

30日でできる! OS自作入門

よかった点

オペレーティングシステムに関連する低レイヤー技術に対する知見が高まる

完全に理解しているわけではありませんが、ざっと思いつくだけで以下のものがあります。

  • セグメンテーションとその権限
  • VRAM,VESA
  • キーボードコントローラ
  • BIOS
  • アセンブリ言語
  • 割り込み
    • PIT
    • PIC
  • CPUの例外
  • マルチタスク(タスクスイッチ)
  • タイマー
  • CPUの動作モード(リアルモード/プロテクトモード)
  • IPL,ブートローダ
  • メモリ管理の実装
  • GDT,LDT
  • アプリケーションとOSの違い

こんな記事も書いたのでGDTは割と理解できるんじゃないかな~という気がします。

バイナリに対する苦手意識がなくなる。

  • お恥ずかしながら2進数が超苦手。
    • 16進数の計算にこちらのサイトに頼り切っていましたが・・・
    • 結構紙の上でサクッと計算しようという気になった
  • バイナリダンプが割とできる、わかるようになる。
    • が、バイナリと触れあう技術・知見がまだまだ弱い

割と世の中のものは自作できるのでは?という気分になってくる

ブルースリーの映画見た後に強くなったと錯覚する現象と同等な気がしますがw

割とこういったものも小さな一歩を積み重ねていけば作れるのでは?という気持ちになってきました。 技術書展でも幾つかこういったものの自作指南本が出ていますね。

不満点

  • 30日でやるのはキツイと思う

    • 有能な方が計画的に進めて、脱線しなければ1か月でできるかもしれない。
    • たぶん想定読者である初心者にあたるような我々には難しいのでは・・・と思いました。
  • 紙面の都合上難しそうだが、もう少し説明してほしいなという箇所が結構ある。

    • 「はじめて読む486」は理解の補助にすごく良い本でした。

今やっている、これからやり始める初心者に対するアドバイス

とりあえず弱めの人間が終わった時点でのアドバイスを描いて見ます。

著者が用意したツールの代替を利用しないことを推奨

コンパイルやリンクには一部著者の自作ツールを利用します。(z_toolsのnaskや.hrb関係) シンプルなOSをフルスクラッチで・・・という割には一部ブラックボックスなものが絡んでいることに若干の不満があるかもしれません。

Linuxなどで一般的なツールであるnasmやelfを使いたくなるかもしれませんが、 もちろんそれらは著者のツールとは挙動が違うので、調査してツールのオプションを工夫したり、 あるいはOSそのものに変更を入れる必要があるかもしれません。

ある程度知識がある人なら時間をかけてトラブルシュートできると思うが、 全く知識がない場合はただ地図を持たずに道に迷うようなもので ネットを検索しまくれば、

  • この行を消すと動くようになる
  • この値をXXに変えるとコンパイルできる

などの断片的な情報を参考にいろいろいじくりまくった結果、 たまたま動くようになるかもしれませんが、労力の割に得られるものが少ないと思います。

などの凄い方もおられますが、すでに何冊か難しそうな本を読破されていたり、その道のプロの方だったりするので、 難しすぎることに挑戦して挫折するより、初学者は素直に著者のツールを使い、この本の枠組みで進めるのが良いと思います。 実力に自負があったり、力試しがしたい人はこの限りではありません。頑張ってください。

解説ページがコメントで張られているヘッダファイルを利用する

この本は700ページ以上もあるのに牽引があまり充実していません。 また、初日の方に解説されている関数の内容を忘れることもあると思います。

つまり、どこに何が書かれているか、というのが結構わからなくなります。

そこで付録には最終日のヘッダファイルの関数や定数の宣言箇所に、 そこを解説しているページをコメントで補足しているものがあります。

印刷しておくと便利。改造の流れも忘れたとき把握できる。30日立った後に気づいて泣いた http://d.hatena.ne.jp/sandai/20120728/p2

この本の感想を読んでると、このヘッダファイルにもっと早く気付けばよかった というものも少なくはありませんが、これの存在は早いうちから知っておいて損はないでしょう

今後

  • C言語の理解(ここがガタガタなので)
    • 基礎(おもにポインタまわり)
    • 応用(開発ツール、開発手法、テスト等)
  • hariboteOSにないOSとして重要な機構(電源管理、ページング、外部記憶装置、ネットワークドライバ等)
  • 特定のCPUやそのエミュレータの学習
  • OSSになっているOS(Linux等)の調査や理解を深める
  • CTF
    • その道のプロの方に勧められたので

    • ブログなど見ましたが、この方もOS自作本から始められていますね。(凄いタイトルだ..)

vane11ope.hatenablog.com

しばらくLinuxUnix(xv6)、モダンなCPUの勉強をしたいと思います。(Linuxの仕組みが9割程度読了しています。) hariboteOSに機能を足すなら、電源管理と外部記憶装置とページングを実装したい。

*1:まだC言語があやふやな段階だが