OS自作してみた

  • #OS
  • #自作
  • #CS
  • #C++

ようやく「ゼロからのOS自作入門」をある程度読了しました。この本はC++でOSを作ろう!という内容の本で、現在使われているOSの基本的な機能を自分で実装する形になっていました。ここ2年ほどプログラミングをするようになって、疑問を深掘りする度に最後に「OSってなんやねん!!」ってなっていたので、その解像度を上げることができる非常にいい本でした。そもそも現代のPCは便利な機能がてんこ盛りになりすぎて初学者からすると「これを全部理解するのはたまったもんじゃない!」というのが正直なところ。その中から最低限必要な情報が何かを丁寧に教えてくれる良書でした。

『ゼロからのOS自作入門』の書影
ゼロからのOS自作入門

僕は非情報系の理系院生で、事前に「コンピューターシステムの理論と実装」に取り組んでからこの本を読みました。低レイヤーで何が行われているかから、実際の開発までの橋渡しの基礎の基礎は抑えられた印象。

『コンピューターシステムの理論と実装』の書影
コンピューターシステムの理論と実装

ここからは「やろっかなぁ」と思ってる人向けにあくまで僕の感想を置いておこうと思います。

「全体の感想」

正直にいうと僕はこの本を20章まででおしまいにしました。というのも最後の10章はそれまでに作り上げた基本的な機能を使ってOSをリッチにしていくセクションで、僕が知りたかった「OSって何やってんねん」から一歩進んだ内容になっていたからです。多分ここら辺でやめてもOSの雰囲気は大体掴めると思います。

技術本あるあるだとは思うのですが、話を広げると1000ページ書いても終わらなくなってしまうのでCPUとアセンブリ言語、ハードウェア(ディスプレイ、キーボードetc…)とその規格などは自分で調べるとより理解が深まるような感じはしました。

また、git上で各作業を行った後のバージョンがおいてあって、それを逐次"checkout"しながら読み進める形が本では想定されていました。ゴリゴリにC++を書けなくてもなんとなく雰囲気は掴みやすいかと思います。

最後に、所々本が古くEDK2(OS開発環境)内のPythonと配布プログラムの間で不整合がありました。他にも数箇所ハマりどころが。AIちゃんと一緒に解決するのがいいかと、、

「1, 2章:PCの仕組み + OSの開発環境整理」

案の定、読み始めがヘビーでした。しかし無駄なことは一切書いてなく、著者の方も筆がたつ方だったので、楽しく読み進められました。こういうふうにOSの開発環境は用意されてるんだなと、

「3, 4, 5章:ディスプレイまわり」

ここはピクセル描画がメインでした。フレームバッファを触りながらメモリを自分で割り当てる感覚は普段のガベージコレクションがある言語のプログラミングにはないので楽しかった印象です。「メモリ触ってる!」って感じになりました。C++っていいですね。

「6章 : マウスカーソル」

ここで周辺ハードウェア機器とどうやってOSがやり取りするかを勉強します。PCI, PCIeの仕組み、IOアドレス空間等、ハードとOSの境界を触る感覚があって面白かったです。

「7章:割り込みとFIFO」

「複数の仕事をどうやって管理するか」の最初の一歩を作ります。キーボードやマウスなど、「普段は動いていないけど、動かすことがあるもの」の処理を効率的に行うことを実装します。OSらしくて面白かった印象です。

「8章:メモリ管理」

ここでメモリ空間の割り当てを行っていきます。OSが利用する領域とプログラムが使う領域の区分などを実装していきます。レジスタ周りもここからガッツリ触り始め、ハードウェアとOSの境界を触ってる感覚が楽しいです。だいぶあとにページングのセクションがあるのでそこで回収される内容もあるので深入りしすぎなくてもいい気がします。

「9, 10, 11章:ウィンドウ周り + タイマー」

ここでウィンドウの実現をしていきます。基本的にはこの章までの知識で理解できますが、ここでコンピューターの時間計測についても触れられるので、せっかくなので僕は色々と調べました。

「12章:キー入力」

ここでキーボード入力をするためのプログラムを書きます。ここでHID規格について触れられます。人間が操作するインターフェースを作るための規格なのですが、意外と仕組みはシンプルで、いつかインターフェースを作ってみたいなとふと思いました。

「13, 14章:マルチタスク」

ここでついに自分の気になっていた処理の割り振りの話になります。今回作るOSはシングルコアなので割とシンプルに実装は進みます。現代のマルチコアのPCのプロセスの概念などへの解像度が高まるいいセクションでした。

「15, 16章:ターミナル, コマンド」

新たな領域の知識が手に入るイメージではなく、既存の作ったものを組み合わせて実装していく感じです。

「17章:ファイルシステム」

ここでファイルシステムが出てきます。SSD, USBなどのストレージ系ハードウェアとOSがどのようにやり取りをしているのかを理解できて面白いです。シンプルなファイルシステムであるFATを実装していきます。

「18章:アプリケーション」

ここでは逆ポーランド記法での計算がターミナル上でできるアプリケーションを作っていきます。特に新しい知識はありませんが、リッチなGUIが当たり前の世界に生まれてきた身からすると、「コマンドもアプリケーションだよなぁ」と再認識させられました。

「19章:ページング」

どのようにアプリケーション側がメモリ空間を使いやすくするかの実装セクションです。8章の内容をより進め、複数のアプリがメモリの衝突なく動作するための実装を行います。実際にプログラムを書くときもメモリの内部実装が気になっていたので、いい勉強になりました。

「20章:システムコール」

実行権限の割り当てを実装します。ここで一通り自分が普段プログラム書く中で気になってた「OS周り」の概観がつかめた感じがしました。その後ろをみると「OSをリッチにしていく」作業が主で、基本的な知識はここまでで十分手に入ると思います。

読み終わったのが2週間前で、色々と思い出しながら書き出しましたが、あくまで骨組みの知識が身についただけではあるので今後もプログラムする中で気になったら色々と調べていこうと思います。一番得られて良かった感覚は「OSもプログラムなんだ」という実感です。これはなかなか便利なデバイスに囲まれていては直感的に理解しにくいところだと思うのですが、そこをつないでくれる非常に良い本でした。

← ホームに戻る