関連サイト
本書の関連ページが用意されています。
内容紹介
[OSを手づくりするワクワクを体験!] "知識ゼロ"からはじめて、本書オリジナルOS「MikanOS」を手づくりする本です。
紹介記事:なぜOSを作るのか? ただ面白いからだけじゃない! 新刊『ゼロからのOS自作入門』が大ヒット中!
パソコンの電源を入れOS本体を呼び出すところから様々なアプリを動かせるようになるまで、OSづくりを一通り体験します。読み進めるにつれ、いままでブラックボックスだと思っていたパソコンの中身「OS」の仕組みが分かってくることでしょう。
MikanOSはUEFI BIOSにより起動してIntel 64モードで動作、ページングを用いてメモリ管理を行い、USB3.0ドライバを搭載。ウィンドウシステム、プリエンプティブマルチタスク、ファイルシステムを持つOSです。これらの専門用語の意味もOSを作りながら解説します。MikanOSは C++ で記述します。数百行程度のプログラミング経験があれば無理なく読み進められるはずです。
本書は『30日でできる!OS自作入門』の流れを汲み「小さく作ってすぐ動かす」ステップバイステップ方式をとっていますので、無理なくマスター可能です!エンジニアなら誰もが一度は夢見る「OSづくり」を本書で学ぼう。
書誌情報
- 著者: 内田公太
- 発行日: 2021-03-22 (紙書籍版発行日: 2021-03-22)
- 最終更新日: 2021-03-22
- バージョン: 1.0.0
- ページ数: 744ページ(PDF版換算)
- 対応フォーマット: PDF
- 出版社: マイナビ出版
対象読者
著者について
内田公太
小学生の頃にPICマイコンのアセンブリ言語に出会い、プログラマの道に進む。高校時代は『30日でできる! OS自作入門』(川合秀実、2006年)の校正を手伝う。東京工業大学の計算工学専攻を卒業後、サイボウズ株式会社でインフラ系のプログラミングに従事したり、東京工業大学でソフトウェア系の授業を担当したりしていた。2017年から2020年にかけて、セキュリティ・キャンプ全国大会でOS開発系のゼミを受け持った。2020年にサイボウズ・ラボ株式会社へ転籍し、OSや言語処理系の研究開発をしている。著書に『自作エミュレータで学ぶx86アーキテクチャ』(マイナビ出版、2015年)がある。
目次
はじめに
対象読者
第0章 OSって個人で作れるの?
- 0.1 OSの作り方
- 0.2 そもそもOSって何?
- 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言語でハローワールド
第2章 EDK II入門とメモリマップ
- 2.1 EDK II 入門
- 2.2 EDK IIでハローワールド(osbook_day02a)
- 2.3 メインメモリ
- 2.4 メモリマップ
- 2.5 メモリマップの取得(osbook_day02b)
- 2.6 メモリマップのファイルへの保存
- 2.7 メモリマップの確認
- 2.8 ポインタ入門(1):アドレスとポインタ
- 2.9 ポインタとアロー演算子
第3章 画面表示の練習とブートローダ
- 3.1 QEMUモニタ
- 3.2 レジスタ
- 3.3 初めてのカーネル(osbook_day03a)
- 3.4 ブートローダからピクセルを描く(osbook_day03b)
- 3.5 カーネルからピクセルを描く(osbook_day03c)
- 3.6 エラー処理をしよう(osbook_day03d)
- 3.7 ポインタ入門(2):ポインタとアセンブリ言語
第4章 ピクセル描画とmake入門
- 4.1 make入門(osbook_day04a)
- 4.2 ピクセルを自在に描く(osbook_day04b)
- 4.3 C++の機能を使って書き直す(osbook_day04c)
- 4.4 vtable
- 4.5 ローダを改良する(osbook_day04d)
第5章 文字表示とコンソールクラス
- 5.1 文字を書いてみる(osbook_day05a)
- 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)
第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.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.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.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.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.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.3 アプリのロードと実行(osbook_day19a)
- 19.4 仮想アドレスと4 階層ページング
- 19.5 アプリケーションを後半で動かす
- 19.6 アプリケーションのロード
- 19.7 階層ページング構造の設定
- 19.8 階層ページング構造の片付け
第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.01 WSLのインストール
- A.02 WSLでQEMUを使う準備
付録B MikanOSの入手
- B.01 MikanOSのバージョン間の差分確認
- B.02 ソースコードの検索
付録C EDK IIのファイル説明
付録D C++のテンプレート
付録E iPXE
- E.01 iPXEのビルドとインストール
- E.02 HTTPサーバの起動
- E.03 ネットワーク起動の実践