「ゼロからのOS自作入門」の目次
はじめに
第0章 OSって個人で作れるの?
- 0.1 OS の作り方
- 0.2 そもそもOSって何?
- コラム0.1 OSの仕様とPOSIX
- 0.3 OS自作の手順
- 0.4 OS自作の楽しみ方
- 0.5 OS 自作の全体像
第1章 PCの仕組みとハローワールド
- 1.1 ハローワールド
- 1.2 USBメモリのデバイス名の探し方
- 1.3 WSLでのやり方
- 1.4 エミュレータでのやり方
- 1.5 結局、何をやったのか?
- 1.6 とにかく手を動かそう
- 1.7 UEFI BIOSによる起動
- 1.8 OSを作る道具
- 1.9 C言語でハローワールド
- コラム1.1 PEとCOFFとELF
第2章 EDK II入門とメモリマップ
- 2.1 EDK II入門
- 2.2 EDK IIでハローワールド(osbook_day02a)
- コラム2.1 インクルード
- 2.3 メインメモリ
- 2.4 メモリマップ
- 2.5 メモリマップの取得(osbook_day02b)
- 2.6 メモリマップのファイルへの保存
- 2.7 メモリマップの確認
- 2.8 ポインタ入門(1):アドレスとポインタ
- 2.9 ポインタとアロー演算子
- コラム2.2 ポインタのポインタ
第3章 画面表示の練習とブートローダ
- 3.1 QEMU モニタ
- 3.2 レジスタ
- 3.3 初めてのカーネル(osbook_day03a)
- コラム3.1 レッドゾーン
- 3.4 ブートローダからピクセルを描く(osbook_day03b)
- 3.5 カーネルからピクセルを描く(osbook_day03c)
- 3.6 エラー処理をしよう(osbook_day03d)
- コラム3.2 ポインタのキャスト
- 3.7 ポインタ入門(2):ポインタとアセンブリ言語
第4章 ピクセル描画とmake入門
- 4.1 make 入門(osbook_day04a)
- 4.2 ピクセルを自在に描く(osbook_day04b)
- コラム4.1 ABI
- 4.3 C++の機能を使って書き直す(osbook_day04c)
- コラム4.2 コンパイルエラーはお友達
- 4.4 vtable
- 4.5 ローダを改良する(osbook_day04d)
第5章 文字表示とコンソールクラス
- 5.1 文字を書いてみる(osbook_day05a)
- コラム5.1 参照とポインタ
- 5.2 分割コンパイル(osbook_day05b)
- 5.3 フォントを増やそう(osbook_day05c)
- 5.4 文字列描画と
sprintf()
(osbook_day05d) - 5.5 コンソールクラス(osbook_day05e)
- 5.6
printk()
(osbook_day05f)
第6章 マウス入力とPCI
- 6.1 マウスカーソル(osbook_day06a)
- 6.2 USBホストドライバ
- 6.3 PCIデバイスの探索(osbook_day06b)
- 6.4 ポーリングでマウス入力(osbook_day06c)
- コラム6.1 ログ関数
- コラム6.2
static_cast<uint64_t>(0xf)
の謎
第7章 割り込みとFIFO
- 7.1 割り込み(osbook_day07a)
- 7.2 割り込みハンドラ
- 7.3 割り込みベクタ
- 7.4 割り込み記述子の設定
- 7.5 MSI割り込み
- 7.6 割り込みのまとめ
- 7.7 割り込みハンドラの高速化(osbook_day07b)
- 7.8 FIFOとFILO
- 7.9 キューの実装
- 7.10 キューを使った割り込み高速化
第8章 メモリ管理
- 8.1 メモリ管理
- 8.2 UEFIメモリマップ(osbook_day08a)
- 8.3 データ構造の移動(osbook_day08b)
- 8.4 スタック領域の移動
- 8.5 セグメンテーションの設定
- 8.6 ページングの設定
- 8.7 メモリ管理に挑戦(osbook_day08c)
第9章 重ね合わせ処理
- 9.1 重ね合わせ処理(osbook_day09a)
- 9.2 new演算子
- 9.3 重ね合わせ処理の原理
- コラム9.1 スマートポインタ
- 9.4 重ね合わせ処理の時間計測(osbook_day09b)
- 9.5 重ね合わせ処理の高速化(osbook_day09c)
- 9.6 スクロール処理の時間計測(osbook_day09d)
- 9.7 スクロール処理の高速化(osbook_day09e)
第10章 ウィンドウ
- 10.1 もっとマウス(osbook_day10a)
- 10.2 はじめてのウィンドウ(osbook_day10b)
- 10.3 高速カウンタ(osbook_day10c)
- 10.4 チラチラ解消(osbook_day10d)
- 10.5 バックバッファ(osbook_day10e)
- 10.6 ウィンドウのドラッグ移動(osbook_day10f)
- 10.7 ウィンドウだけドラッグ移動(osbook_day10g)
第11章 タイマとACPI
- 11.1 ソースコード整理(osbook_day11a)
- 11.2 タイマ割り込み(osbook_day11b)
- 11.3 細かく時間を計る(osbook_day11c)
- コラム11.1 volatileの必要性
- 11.4 複数のタイマとタイムアウト通知(osbook_day11d)
- 11.5 ACPI PMタイマとRSDP(osbook_day11e)
第12章 キー入力
- 12.1 FADTを探す(osbook_day12a)
- 12.2 ACPI PMタイマを使う(osbook_day12b)
- 12.3 USB キーボードドライバ(osbook_day12c)
- 12.4 モディファイアキー(osbook_day12d)
- 12.5 テキストボックス(osbook_day12e)
- 12.6 カーソル(osbook_day12f)
第13章 マルチタスク(1)
- 13.1 マルチタスクとコンテキスト
- 13.2 コンテキストの切り替えに挑戦(osbook_day13a)
- コラム13.1 x86-64アーキテクチャとスタックのアライメント制約
- 13.3 コンテキストスイッチの自動化(osbook_day13b)
- 13.4 マルチタスクの検証(osbook_day13c)
- 13.5 タスクを増やす(osbook_day13d)
第14章 マルチタスク(2)
- 14.1 スリープしてみる(osbook_day14a)
- 14.2 イベントが来たら起床する(osbook_day14b)
- 14.3 性能測定
- 14.4 タスクに優先度を付ける(osbook_day14c)
- 14.5 アイドルタスク(osbook_day14d)
第15章 ターミナル
- 15.1 ウィンドウ描画はメインスレッドで(osbook_day15a)
- 15.2 アクティブウィンドウ(osbook_day15b)
- コラム15.1 タイトルに
std::string
を使う理由 - 15.3 ターミナルウィンドウ(osbook_day15c)
- 15.4 描画の高速化(osbook_day15d)
第16章 コマンド
- 16.1 ターミナルでキー入力(osbook_day16a)
- 16.2 echoコマンド(osbook_day16b)
- 16.3 clearコマンド(osbook_day16c)
- 16.4 lspciコマンド(osbook_day16d)
- 16.5 コマンド履歴(osbook_day16e)
- 16.6 省電力化(osbook_day16f)
第17章 ファイルシステム
- 17.1 ファイルとファイルシステム
- 17.2 BIOSパラメータブロック
- 17.3 ディレクトリエントリ
- 17.4 ボリュームを読み出す(osbook_day17a)
- コラム17.1 ボリュームの読み込みは16MiBで足りるか
- 17.5 lsコマンド(osbook_day17b)
第18章 アプリケーション
- 18.1 ファイルアロケーションテーブル(osbook_day18a)
- 18.2 初アプリ(osbook_day18b)
- 18.3 C++で計算機(osbook_day18c)
- 18.4 標準ライブラリ(osbook_day18d)
第19章 ページング
- 19.1 実行ファイルとメモリアドレス
- 19.2 アドレス変換
- コラム19.1 事実上のアドレス
- 19.3 アプリのロードと実行(osbook_day19a)
- 19.4 仮想アドレスと4階層ページング
- 19.5 アプリケーションを後半で動かす
- 19.6 アプリケーションのロード
- 19.7 階層ページング構造の設定
- 19.8 階層ページング構造の片付け
- コラム19.2 構造化束縛
第20章 システムコール
- 20.1 アプリがOSの機能を使う方法(osbook_day20a)
- 20.2 OSを守ろう(1)(osbook_day20b)
- 20.3 TSSを設定しよう(osbook_day20c)
- 20.4 バグ発見を手伝おう(osbook_day20d)
- 20.5 システムコール(osbook_day20e)
- 20.6 システムコールの登録処理
- 20.7 システムコールの本体
第21章 アプリからウィンドウ
- 21.1 IST を設定しよう(osbook_day21a)
- 21.2 文字列表示システムコール(osbook_day21b)
- 21.3 システムコールの作成
- 21.4
write()
の作成 - 21.5 終了システムコール(osbook_day21c)
- 21.6 スタックポインタの復帰
- 21.7 コード整理(osbook_day21d)
- 21.8 ウィンドウを開く(osbook_day21e)
- 21.9 ウィンドウに文字を書く(osbook_day21f)
第22章 グラフィックとイベント(1)
- 22.1
exit()
を使う(osbook_day22a) - 22.2 点を描く(osbook_day22b)
- 22.3 タイマ値の取得(osbook_day22c)
- 22.4 ウィンドウ描画の最適化(osbook_day22d)
- 22.5 線を引く(osbook_day22e)
- 22.6 ウィンドウのクローズ(osbook_day22f)
- 22.7 キー入力を待つ(osbook_day22g)
第23章 グラフィックとイベント(2)
- 23.1 マウス入力(osbook_day23a)
- 23.2 お絵描きソフト(osbook_day23b)
- 23.3 タイマコマンド(osbook_day23c)
- 23.4 アニメーション(osbook_day23d)
- 23.5 ブロック崩しゲーム(osbook_day23e)
第24章 複数のターミナル
- 24.1 ターミナルを増やす(osbook_day24a)
- 24.2 カーソル点滅を自分で(osbook_day24b)
- 24.3 複数アプリの同時起動(osbook_day24c)
- 24.4 ウィンドウの重なりのバグ修正(osbook_day24d)
- 24.5 ターミナル無しのアプリ起動(osbook_day24e)
- 24.6 OSをフリーズさせるアプリ(osbook_day24f)
- 24.7 OSを守ろう(2)(osbook_day24g)
第25章 アプリでファイル読み込み
- 25.1 ディレクトリ対応(osbook_day25a)
- 25.2 ファイル読み込み(osbook_day25b)
- 25.3 正規表現検索(osbook_day25c)
第26章 アプリでファイル書き込み
- 26.1 標準入力(osbook_day26a)
- 26.2 ファイルディスクリプタの抽象化
- 26.3 キーボード入力を受け取る
- 26.4 EOFとEOT(osbook_day26b)
- 26.5 ファイル書き込み(1)(osbook_day26c)
- 26.6 ファイル書き込み(2)(osbook_day26d)
第27章 アプリのメモリ管理
- 27.1 デマンドページング(osbook_day27a)
- 27.2 メモリマップトファイル(osbook_day27b)
- 27.3 メモリ使用量を測ろう(osbook_day27c)
- 27.4 コピーオンライト(osbook_day27d)
第28章 日本語表示とリダイレクト
- 28.1 日本語と文字コード(osbook_day28a)
- 28.2 日本語フォント(osbook_day28b)
- 28.3 リダイレクト(osbook_day28c)
第29章 アプリ間通信
- 29.1 終了コード(osbook_day29a)
- 29.2 パイプ(osbook_day29b)
- 29.3 コマンドラインの解析とタスクの起動
- 29.4 パイプ処理の本体PipeDescriptor
- 29.5 ターミナルの起動と終了
- 29.6 タスクの終了
- 29.7 sortコマンド(osbook_day29c)
- 29.8 ターミナルのバグ修正(osbook_day29d)
- 29.9 共有メモリ
第30章 おまけアプリ
- 30.1 アプリにパスを通す(osbook_day30a)
- 30.2 moreコマンド(osbook_day30b)
- 30.3 catを入力に対応させる(osbook_day30c)
- 30.4 閉じるボタン(osbook_day30d)
- 30.5 テキストビューア(osbook_day30e)
- 30.6 画像ビューア(osbook_day30f)
第31章 これからの道
付録A 開発環境のインストール
- A.1 WSLのインストール
- A.2 WSLでQEMUを使う準備
付録B MikanOSの入手
- B.01 MikanOSのバージョン間の差分確認
- B.02 ソースコードの検索
付録C EDK IIのファイル説明
付録D C++のテンプレート
付録E iPXE
- E.01 iPXEのビルドとインストール
- E.02 HTTPサーバの起動
- E.03 ネットワーク起動の実践