ISBN 9784839975869
ゼロからのOS自作入門
概要
UEFI時代のOSをC++でゼロから実装し仕組みを内側から理解する
想定読者
C++の基本文法を習得済みで、OSカーネルの動作原理を実装を通じて体得したいエンジニア・学生
こんな人には向いていない
- 理論・概念でOSを理解したい人(実装よりも設計原理の整理が目的なら別書が適している)
- x86-64/UEFI以外のアーキテクチャ(ARMやRISC-V等)でOSを書きたい人
- ポインタやビット演算に初めて触れる段階の読者(数百行のC/C++経験が前提となっている)
この本で身につくこと
- UEFI BIOSによるブートローダの実装とOSカーネルへの制御移譲の流れを説明できる
- x86-64のページング機構を使った仮想アドレス空間とメモリ管理を実装できる
- タイマ割り込みを利用したプリエンプティブマルチタスクのコンテキストスイッチを書ける
- PCI/USB3.0ドライバの初期化シーケンスとデバイスとのやり取りをコードで実装できる
- FAT相当のファイルシステム読み書き処理をOSに組み込める
- システムコールインターフェースを設計し、ユーザーランドアプリとカーネルを明確に分離できる
ハイライト(外部からの言及)
パソコンの電源を入れOS本体を呼び出すところから様々なアプリを動かせるようになるまで、OSづくりを一通り体験します。読み進めるにつれ、いままでブラックボックスだと思っていたパソコンの中身「OS」の仕組みが分かってくることでしょう。 — 出典
本書の学習体験の本質を最も端的に示している箇所。「ブラックボックスが開く」という価値を購入前に確認できる
MikanOSはUEFI BIOSにより起動してIntel 64モードで動作、ページングを用いてメモリ管理を行い、USB3.0ドライバを搭載。ウィンドウシステム、プリエンプティブマルチタスク、ファイルシステムを持つOSです。 — 出典
到達地点が具体的に列挙されており、読後に何が動くかを購入前に判断できる
UEFIだし、丁寧に説明されてるしで自作OSを勉強したいって人は決定版のような気がする。作者さんは、下記の動画も見れるようにしてくれてるしもう買うしかねえって感じ。 — 出典
複数の自作OS学習リソースを横断的に紹介する記事の筆者が本書を「決定版」と位置付けた箇所。他書との比較視点と著者提供の補助動画という付加価値を同時に伝えており、既存2件(学習体験・機能一覧)とは異なる「市場における立ち位置」の角度を補完する
読了後にできること
Before(読む前): OSをブラックボックスとして扱い、カーネル・システムコール・メモリ管理の連携が実装レベルでイメージできない
After(読み終えた後): UEFI起動からアプリケーション実行までの一連のフローをコードで追えるようになり、OS関連のドキュメントや仕様書の記述が具体的な実装と結びついて読めるようになる
章立て
OSって個人で作れるの?
概念整理と動機付け。実装開始前のウォームアップとして軽く通読する程度でよい
第1章 PCの仕組みとハローワールド
UEFI BIOSがOSを起動する流れをコードで体験する最初の一歩。ここで開発環境が正常に動作することを確認しておくと、以降の実装に集中できる
第2章 EDK II入門とメモリマップ
ブートローダがメモリマップをカーネルに渡す仕組みを習得する章。第8章のメモリ管理の前提となるため、理解が曖昧なまま進むと後半で詰まりやすい
第7章 割り込みとFIFO
ドライバ・入力処理全体の土台。ここを丁寧に通過すると第12章以降のデバッグコストが下がる
第8章 メモリ管理
ページフレームアロケータの実装。第19章のページングや第20章のシステムコールの土台であり、ここを丁寧に実装しないと後半のデバッグが困難になる
第13章 マルチタスク(1)
前半の山場。コンテキストスイッチは何度か読み返す価値がある
第14章 マルチタスク(2)
前章で実装したコンテキストスイッチをより堅牢にする章。第13章で疑問が残った箇所はここと合わせて読み返すと理解が補完されやすい
第19章 ページング
後半の最重要章。仮想アドレス空間の設計がここで確立する
第20章 システムコール
カーネル/ユーザーランド分離の実装完成。OSの骨格が揃う節目
第31章 これからの道
ネットワーク・POSIX準拠など本書完了後の発展方向が整理されている
関連記事 / 参考情報
- プログラミング初心者の学生が2年間で読んだ本の中でオススメを紹介する — 2年間の独学書リストにOS自作入門が選出されており、入門者視点での位置付けが確認できる
- 自作OSを始める時に役立つ資料 — 本書を含む自作OS学習リソースを体系的にまとめた資料集。読み始め前の全体像把握に有用
- 新人エンジニアのためのブックリスト — 新人エンジニア向け推薦書リストに本書が選出。キャリア初期に読む技術書として評価されている
- 30日目のはりぼてOSが動作するx86エミュレータを実装してみた。(感想) — 前作「30日でできる!OS自作入門」の系譜を辿り、OS自作ジャンルの継続的な魅力と本書への橋渡しが伝わる記事
- MikanOS に NIC ドライバを実装する - 準備編 — 本書完了後にネットワーク機能を追加する発展実装記事。MikanOSを基盤とした拡張の典型例
- 自作OSでシャットダウン実装してみた — MikanOSにACPIシャットダウンを追加した実装記録。本書の発展として取り組める具体的テーマの一例
- ゼロからのOS自作入門をMacで勉強する方法 (Docker使用) — Mac環境でDockerを使って開発環境を構築する手順。Mac利用者は着手前に確認を推奨
- 自作OSにファイルシステムを実装する(後編) — 本書第17章のファイルシステム実装を発展させた独自拡張記事。深堀り時の参照先として有用
- x64マルチプロセッサ環境で他のプロセッサを起動させる方法 — 本書では扱われないSMP(マルチプロセッサ)起動のx64実装解説。さらに踏み込みたい場合の参照先
学習のヒント
- 環境構築は最初の関門。Linux環境が最もスムーズで、Macユーザーは公式のDockerセットアップを先に完成させてから第1章に入ると、実装への集中力が維持できる
- 第7章(割り込みとFIFO)と第8章(メモリ管理)は後半の全章の土台になる。動作確認を丁寧にやり直しながら通過すると、第13章以降のデバッグコストが大幅に減る
- 第13〜14章(マルチタスク)と第19〜20章(ページング・システムコール)は後半の山場。詰まったときはQiitaのMikanOS発展記事(NICドライバ・シャットダウン実装等)で同じ機構が別角度から解説されており、理解の補助になる
- 付録「C++のテンプレート」は中盤以降に頻出するコードパターンの解説。C++テンプレートに不慣れな場合は第5章前後に先読みしておくと後半の読み飛ばしが減る
前提知識
- C/C++の基本文法(クラス・ポインタ・参照・ビット演算)の読み書き経験(数百行規模が目安)
- コマンドライン操作とMakefile/ビルドツールの基礎
- CPUとメモリの関係・割り込みといったコンピュータアーキテクチャの初歩(概念レベルで可)
次に読む本
Operating Systems: Three Easy Pieces (OSTEP)
本書でプロセス・メモリ・ファイルシステムの実装を終えた後、OSTEPで各機構の設計根拠(スケジューリング戦略・ページ置換ポリシー等)を理論側から補完すると、実装の「なぜ」が言語化できる。Web上で無料公開されており入手コストゼロ
TCP/IPプロトコルスタック自作入門
本書のMikanOSはネットワーク機能を持たないため、TCP/IPスタック自作は自然な次テーマ。同じ「ゼロから実装して理解する」アプローチを維持しながら、OSとネットワーク層の接続部(ソケットAPIの下層まで)を実装で追うことができる
Writing an OS in Rust (phil-opp.com)
本書と同じx86-64対象でRustを使い再実装する演習として広く参照される。UEFI起動・ページング・割り込み処理の知識が直接流用でき、言語の違い(所有権・メモリ安全性)を意識しながら本書の学習内容の定着を確認できる。無料Web公開
出版社による内容紹介
[OSを手づくりするワクワクを体験!] "知識ゼロ"からはじめて、本書オリジナルOS「MikanOS」を手づくりする本です。 パソコンの電源を入れOS本体を呼び出すところから様々なアプリを動かせるようになるまで、OSづくりを一通り体験します。読み進めるにつれ、いままでブラックボックスだと思っていたパソコンの中身「OS」の仕組みが分かってくることでしょう。 MikanOSはUEFI BIOSにより起動してIntel 64モードで動作、ページングを用いてメモリ管理を行い、USB3.0ドライバを搭載。ウィンドウシステム、プリエンプティブマルチタスク、ファイルシステムを持つOSです。これらの専門用語の意味もOSを作りながら解説します。MikanOSは C++ で記述します。数百行程度のプログラミング経験があれば無理なく読み進められるはずです。 本書は『30日でできる!OS自作入門』の流れを汲み「小さく作ってすぐ動かす」ステップバイステップ方式をとっていますので、無理なくマスター可能です!エンジニアなら誰もが一度は夢見る「OSづくり」を本書で学ぼう。 第0章 OSって個人で作れるの? 第1章 PCの仕組みとハローワールド 第2章 EDK II入門とメモリマップ 第3章 画面表示の練習とブートローダ 第4章 ピクセル描画とmake入門 第5章 文字表示とコンソールクラス 第6章 マウス入力とPCI 第7章 割り込みとFIFO 第8章 メモリ管理 第9章 重ね合わせ処理 第10章 ウィンドウ 第11章 タイマとACPI 第12章 キー入力 第13章 マルチタスク(1) 第14章 マルチタスク(2) 第15章 ターミナル 第16章 コマンド 第17章 ファイルシステム 第18章 アプリケーション 第19章 ページング 第20章 システムコール 第21章 アプリからウィンドウ 第22章 グラフィックとイベント(1) 第23章 グラフィックとイベント(2) 第24章 複数のターミナル 第25章 アプリでファイル読み込み 第26章 アプリでファイル書き込み 第27章 アプリのメモリ管理 第28章 日本語表示とリダイレクト 第29章 アプリ間通信 第30章 おまけアプリ 第31章 これからの道 付録:開発環境のインストール / MikanOSの入手 / EDK IIのファイル説明 / C++のテンプレート / iPXE / ASCIIコード表
この本がどの学習段階で役立つかは、 関連する ロードマップ から確認できます。