作って理解するOSを読んだ感想とメモ


この記事は自作OS Advent Calendar 2020 18日目の記事です。

セキュリティキャンプで 作って理解するOS という本を読みながらx86向けのOSを実装したので、(4ヶ月以上前に読み始めて少しずつ進めていたので初めの方に何を考えて読んでいたのかはうろ覚えですが)感想・メモを残しておこうと思います。

この本の構成

この本の目次はここ

前半

解説パートになっています。2進数の解説から始まり、ハード・ソフトの基礎知識、メモリ管理、CPUの機能と使い方、各種周辺機器の制御方法などがまとめられていて、特定の機能についてわからなくなったときに探しやすい構成になっています。実装パートはフルアセンブリなのでnasmの使い方の解説もあります。

実装中、「あれ、〇〇ってなんだっけ?」となったときに何度も見返しました。

後半

実装パートです。はりぼてOSのように華やかな見た目ではないですが、マルチタスクでアプリケーションを動かすなど、OSらしいことはできます。

実装パート各所のメモ

リアルモードでの基本動作

この辺はBIOS呼び出しの使い方を見ながらやるだけ、という感じでした。普段アセンブリ言語を読むだけでほとんど書いたことがなかったのですが、ここでなんとなくのイメージが掴めました。

ここやっていることは単なる文字出力なのでOS作ってる~!という実感はあまり無かったです。

プロテクトモードへ移行~現在時刻の表示

画面出力の処理を書く部分などハードウェアに近い部分の処理を抽象化していく感じが楽しかったです。OSを作ってる感が出てきて面白くなってきました。

割り込み・マルチタスク・特権状態

すごくOSっぽい機能です。〇〇ディスクリプタという単語がたくさん出てきてとても混乱しました。個人的には要復習ポイントです。

小数演算

普段は整数ばかり気にしていて浮動小数点のことを考えた事がありませんでした。

FPUのレジスタはレジスタスタックと呼ばれていて、その名の通りスタック状になっています。レジスタは80ビットで、先頭から順にST(0),ST(1)と表されるのですが、最後にプッシュした値がST(0)(図参照)となります。新しい値を追加するたび、どこにどの値が入っているのかを気にしなければならないので大変でした。

ページング・コードの共有

ページングを実装したら残っていたバグによるページフォルトが次から次へと出てくるのでデバッグに滅茶苦茶時間がかかりました。原因は色々ありましたが、ページングとは関係ないところの超根本的な、メモリコピーのsrcとdestを間違えている、というミスもありました… どうしてここまで気づかなかったんでしょう???

memcpy.s
memcpy:     ; void memcpy(src, dest, size);
    push ebp
    mov ebp, esp

    push ecx
    push esi
    push edi

    cld     ; clear direction flag

    ; 誤
    ; mov edi, [ebp +  8]  ; src
    ; mov esi, [ebp + 12]  ; dest

    ; 正
    mov esi, [ebp +  8]    ; src
    mov edi, [ebp + 12]    ; dest

    mov ecx, [ebp + 16]    ; size

    rep movsb

    pop edi
    pop esi
    pop ecx

    mov esp, ebp
    pop ebp

    ret

ファイルシステム・ファイル読み出し

ファイルシステムは実装してとりあえず動いてはいるのですがisoイメージとしてWindowsにマウントすることができません。今後の課題です。

ファイル読み出しは、"SPECIAL.TXT" しか読み出せないのは悲しいので、関数化して任意の名前のファイルをメモリ上の任意の位置に読み出せるように機能追加しました。実行ファイルを読み込んで実行できるようにしたいですね。

電断処理

ACPIを使って電源を切ります。普段使っているOSだと何気なく押しているシャットダウンボタンですが、実機で電源が切れたときは感動しました。

この本では色々な過程をすっ飛ばしてとにかく電源を切るだけなのでもう少し細かく理解したいところです。

完成したもの

これから挑戦してみたいこと

  • 実行ファイルの読み込み→実行
  • ファイルの書き込み
  • APIの実装
  • マウス操作
  • とにかく音を鳴らす
  • 他の言語で書き直す

全体を通しての感想

関数でのスタック操作等、C言語では自動でやってくれる部分でバグが発生するなど本筋とは関係ない部分で詰まったところが多かったです。しかし、今CPUがどんな命令を実行しているのか、メモリ上にどのようにデータが配置されているかを考えながらプログラムを書くという普段ならできない経験ができました。WindowsなどのOS上で動くプログラムを作るのに比べて、ハードウェアを直接制御している感じがマイコンを制御しているような感覚でした。

大部分の時間を消費したデバッグについては、デバッガの使い方があまり把握できていないので、もう少し勉強すれば開発効率を上げられそうです。

本を読み進める上で誤字が多いことが気になりました。特に後半は正誤表必須です。

セキュリティキャンプの感想

デバッグを進めると初歩的なバグであることが多く、「こんなことで講師の方を呼び止めてもいいのだろうか…」となってしまい、詰まったときに質問をすることができませんでした。これで何日も溶かしたので、気軽に聞ける環境が大事だなと感じました。

当初目標にしていた、ユーザーランドでテトリスなどのゲームを動かすところまでは実装できませんでしたが、周りの刺激を受けつつ界隈の様子を知ることもできてすごく楽しく、いい経験になりました。実装できなかった部分はこれからも開発を続けていきます。講師・チューター・受講者の方々、ありがとうございました。