今では世界屈指の人気OSとして知られる「Linux」ですが、元々は学生時代のリーナス・トーバルズ氏による個人プロジェクトとして開発が始まりました。
開発者の中にはリーナス氏のように、アプリケーションを動かすための基盤となるOS開発に興味を持っている方は多いと思いますが、とっかかりとして最適な無料のオンラインブック「1,000行で作るオペレーティングシステム」が公開されています。
『自作OSで学ぶマイクロカーネルの設計と実装』 の著者、怒田晟也氏によるもので、最初の一歩の部分を重点的に解説しているとのこと。3日ほどですむボリュームだとされています。
シンプルなモノリシックカーネル設計で、実装の解説だけでなくカーネルプログラミング特有の難しい部分、特に「カーネルをどうデバッグすれば良いか」をおさえた、初学者向きの内容になっています。
「1000行でOSを作ってみよう」で作成するOSは、コンテキストスイッチ、ページング、ユーザーモード、コマンドラインシェル、ディスクデバイスドライバ、ファイルの読み書きをC言語で実装しているのにもかかわらず、コードは1000行未満に押さえられています。
開発環境の構築、RISC-Vの説明、OSの起動、OSの全体像…といった順に説明はすすんでいき、自作OSをどうデバッグすればよいのかなど、挫折しやすい部分の解説も行われています。
最終的には次のようなファイル構成になるとのことです。
├── disk/ - ファイルシステムの中身 ├── common.c - カーネル・ユーザー共通ライブラリ: printf関数やmemset関数など ├── common.h - カーネル・ユーザー共通ライブラリ: 各種構造体・定数などの定義 ├── kernel.c - カーネル: プロセス管理、システムコール、デバイスドライバ、ファイルシステム ├── kernel.h - カーネル: 各種構造体・定数などの定義 ├── kernel.ld - カーネル: リンカスクリプト (メモリレイアウトの定義) ├── shell.c - コマンドラインシェル ├── user.c - ユーザー用ライブラリ: システムコールの呼び出し関数など ├── user.h - ユーザー用ライブラリ: 各種構造体・定数などの定義 ├── user.ld - ユーザー: リンカスクリプト (メモリレイアウトの定義) └── run.sh - ビルドスクリプト
開発環境はqemuで構築することができるため、macOSやLinuxなど幅広い環境で試すことができます。なお英語版も存在し「OS in 1,000 Lines」はHacker Newsでも議論の対象となっていて、「Cool」「Very nice」と高い評価を得ているようです。