自作OSで学ぶマイクロカーネルの設計と実装
書籍情報
発売日 : 2023年05月18日
著者/編集 : 怒田晟也
出版社 : 秀和システム
発行形態 : 単行本
書籍説明
内容紹介
OSはもっと自由だし、その舞台裏はずっと楽しい!自作OS(HinaOS)と実用OS(MINIX3、GNU Hurd、seL4)のソースコードを紐解き、ユニークなアイデアと先進的なテクニックを探究しよう!
目次
第1部 基礎知識
Chapter 1 本書について
1.1 本書に向いている人
1.2 本書で学べないこと
1.3 本書の構成
1.4 データ量の表記
Chapter 2 マイクロカーネル入門
2.1 カーネルとは
2.2 マイクロカーネルとは
2.3 マイクロカーネルの機能
2.4 マイクロカーネルの長所と短所
2.5 本書で取り上げるマイクロカーネル
2.6 ソースコードを読むにあたって
Chapter 3 教育用マイクロカーネルOS「HinaOS」入門
3.1 なぜHinaOSなのか
3.2 HinaOSの特徴
3.3 ソースコードの入手
3.4 コードリーディングのための予備知識
3.5 データ構造
Chapter 4 RISC-V入門
4.1 CPUの基本動作
4.2 特権命令
4.3 インラインアセンブリ
Chapter 5 プロセスとスレッド
5.1 プロセスの中身
5.2 スレッド
5.3 マルチタスク
5.4 カーネルレベルスレッドとユーザーレベルスレッド
5.5 スレッドの中身
5.6 実装例:HinaOSのプロセス・スレッド
5.7 スレッドの状態
5.8 コンテキストスイッチ
5.9 スケジューリング
5.10 アイドル状態
5.11 実例:MINIX3のプロセス・スレッド
5.12 実例:seL4のプロセス・スレッド
5.13 実例:Machのプロセス・スレッド
5.14 まとめ
Chapter 6 メモリ管理
6.1 仮想メモリとは
6.2 仮想メモリのメリット
6.3 物理アドレス空間の構造
6.4 仮想アドレス空間の構造
6.5 ページング
6.6 ページフォルト
6.7 実装例:HinaOSのページフォルト処理の実装
6.8 物理メモリ割り当て
6.9 実例:MINIX3のメモリ管理
6.10 実例:seL4のメモリ管理
6.11 実例:Machのメモリ管理
6.12 まとめ
Chapter 7 割り込み・例外
7.1 割り込みと例外
7.2 実例:RISC-Vの割り込み処理
7.3 タイマー処理
7.4 カーネルパニック
7.5 実例:MINIX3の割り込み処理
7.6 実例:seL4の割り込み処理
7.7 実例:Machの割り込み処理
7.8 まとめ
Chapter 8 メッセージパッシング
8.1 メッセージパッシング
8.2 非同期 vs. 同期的
8.3 通知IPC
8.4 大きなデータの転送
8.5 デッドロック
8.6 優先度の逆転問題
8.7 高速化技術
8.8 実例:MINIX3のIPC
8.9 実例:seL4のIPC
8.10 実例:MachのIPC
8.11 まとめ
Chapter 9 システムコール
9.1 システムコールの種類
9.2 実装例:HinaOSのシステムコール処理の流れ
9.3 ユーザー空間からのメモリコピー
9.4 実例:MINIX3のシステムコール
9.5 実例:seL4のシステムコール
9.6 実例:Machのシステムコール
9.7 まとめ
第3部 ユーザーランド
Chapter 10 ユーザーランド
10.1 サーバ
10.2 機構と方針の分離
10.3 シングルサーバOSとマルチサーバOS
10.4 サーバの種類
10.5 実装例:HinaOSのサーバ構成
10.6 実例:MINIX3のサーバ構成
10.7 実例:seL4のサーバ構成
10.8 実例:Hurdのサーバ構成
Chapter 11 API(Application Programming Interface)
11.1 API
11.2 メインループ
11.3 IPCスタブ
11.4 ステートフルなリクエスト
11.5 非同期メッセージパッシング
11.6 動的メモリ割り当て(malloc)
Chapter 12 デバイスドライバ
12.1 デバイスの例
12.2 デバイスドライバの仕組み
12.3 virtioデバイス
12.4 実装例:HinaOSのvirtio-netドライバ
12.5 実例:MINIX3のデバイスドライバ
12.6 実例:seL4のデバイスドライバ
12.7 実例:Hurdのデバイスドライバ
Chapter 13 ファイルシステム
13.1 ファイルシステムの要素
13.2 ファイルシステムの構造
13.3 ファイルシステムの機能
13.4 ログ構造ファイルシステム
13.5 疑似ファイルシステム
13.6 Filesystem in Userspace(FUSE)
13.7 実装例:HinaFSの設計
13.8 実装例:HinaFSの実装
13.9 実例:FATファイルシステム
13.10 ファイルシステムサーバ
Chapter 14 ネットワーク(TCP/IP)
14.1 TCP/IP階層モデル
14.2 IPv4
14.3 TCP
14.4 UDP
14.5 アドレスの解決
14.6 mbuf
14.7 実装例:HinaOSのパケット送受信処理
14.8 実例:MINIX3のTCP/IPサーバ
14.9 実例:HurdのTCP/IPサーバ
第4部 発展的話題
Chapter 15 マルチプロセッサ対応
15.1 マルチプロセッサの形態
15.2 カーネルのマルチプロセッサ対応
15.3 スピンロック
15.4 プロセッサ間割り込み
Chapter 16 仮想化とエミュレーション
16.1 ハイパーバイザ
16.2 OS互換レイヤ
16.3 コンテナ
Chapter 17 信頼性とセキュリティ
17.1 「マイクロカーネルはモノリシックカーネルより安全」という主張
17.2 高い信頼性のために必要なこと
17.3 サーバの自動再起動
17.4 ライブアップデート
17.5 「ステートの漏出(state spill)」問題
17.6 HinaOSの脆弱性からみるOSのセキュリティ
Chapter 18 ソフトウェアによるプロセス隔離
18.1 プロセス隔離の必要性
18.2 ハードウェアによるプロセス隔離
18.3 ソフトウェアによるプロセス隔離
18.4 実装例:HinaVM
18.5 ソフトウェアによる隔離は安全か?
Chapter 19 ブート処理
19.1 ブートローダ
19.2 HinaOSのブート処理
19.3 MINIX3のブート処理
19.4 seL4のブート処理
19.5 Hurdのブート処理
Appendix 付録
Appendix 1 HinaOS開発環境の構築
Appendix 2 HinaOSのデバッグ
Appendix 3 参考文献
Chapter 1 本書について
1.1 本書に向いている人
1.2 本書で学べないこと
1.3 本書の構成
1.4 データ量の表記
Chapter 2 マイクロカーネル入門
2.1 カーネルとは
2.2 マイクロカーネルとは
2.3 マイクロカーネルの機能
2.4 マイクロカーネルの長所と短所
2.5 本書で取り上げるマイクロカーネル
2.6 ソースコードを読むにあたって
Chapter 3 教育用マイクロカーネルOS「HinaOS」入門
3.1 なぜHinaOSなのか
3.2 HinaOSの特徴
3.3 ソースコードの入手
3.4 コードリーディングのための予備知識
3.5 データ構造
Chapter 4 RISC-V入門
4.1 CPUの基本動作
4.2 特権命令
4.3 インラインアセンブリ
Chapter 5 プロセスとスレッド
5.1 プロセスの中身
5.2 スレッド
5.3 マルチタスク
5.4 カーネルレベルスレッドとユーザーレベルスレッド
5.5 スレッドの中身
5.6 実装例:HinaOSのプロセス・スレッド
5.7 スレッドの状態
5.8 コンテキストスイッチ
5.9 スケジューリング
5.10 アイドル状態
5.11 実例:MINIX3のプロセス・スレッド
5.12 実例:seL4のプロセス・スレッド
5.13 実例:Machのプロセス・スレッド
5.14 まとめ
Chapter 6 メモリ管理
6.1 仮想メモリとは
6.2 仮想メモリのメリット
6.3 物理アドレス空間の構造
6.4 仮想アドレス空間の構造
6.5 ページング
6.6 ページフォルト
6.7 実装例:HinaOSのページフォルト処理の実装
6.8 物理メモリ割り当て
6.9 実例:MINIX3のメモリ管理
6.10 実例:seL4のメモリ管理
6.11 実例:Machのメモリ管理
6.12 まとめ
Chapter 7 割り込み・例外
7.1 割り込みと例外
7.2 実例:RISC-Vの割り込み処理
7.3 タイマー処理
7.4 カーネルパニック
7.5 実例:MINIX3の割り込み処理
7.6 実例:seL4の割り込み処理
7.7 実例:Machの割り込み処理
7.8 まとめ
Chapter 8 メッセージパッシング
8.1 メッセージパッシング
8.2 非同期 vs. 同期的
8.3 通知IPC
8.4 大きなデータの転送
8.5 デッドロック
8.6 優先度の逆転問題
8.7 高速化技術
8.8 実例:MINIX3のIPC
8.9 実例:seL4のIPC
8.10 実例:MachのIPC
8.11 まとめ
Chapter 9 システムコール
9.1 システムコールの種類
9.2 実装例:HinaOSのシステムコール処理の流れ
9.3 ユーザー空間からのメモリコピー
9.4 実例:MINIX3のシステムコール
9.5 実例:seL4のシステムコール
9.6 実例:Machのシステムコール
9.7 まとめ
第3部 ユーザーランド
Chapter 10 ユーザーランド
10.1 サーバ
10.2 機構と方針の分離
10.3 シングルサーバOSとマルチサーバOS
10.4 サーバの種類
10.5 実装例:HinaOSのサーバ構成
10.6 実例:MINIX3のサーバ構成
10.7 実例:seL4のサーバ構成
10.8 実例:Hurdのサーバ構成
Chapter 11 API(Application Programming Interface)
11.1 API
11.2 メインループ
11.3 IPCスタブ
11.4 ステートフルなリクエスト
11.5 非同期メッセージパッシング
11.6 動的メモリ割り当て(malloc)
Chapter 12 デバイスドライバ
12.1 デバイスの例
12.2 デバイスドライバの仕組み
12.3 virtioデバイス
12.4 実装例:HinaOSのvirtio-netドライバ
12.5 実例:MINIX3のデバイスドライバ
12.6 実例:seL4のデバイスドライバ
12.7 実例:Hurdのデバイスドライバ
Chapter 13 ファイルシステム
13.1 ファイルシステムの要素
13.2 ファイルシステムの構造
13.3 ファイルシステムの機能
13.4 ログ構造ファイルシステム
13.5 疑似ファイルシステム
13.6 Filesystem in Userspace(FUSE)
13.7 実装例:HinaFSの設計
13.8 実装例:HinaFSの実装
13.9 実例:FATファイルシステム
13.10 ファイルシステムサーバ
Chapter 14 ネットワーク(TCP/IP)
14.1 TCP/IP階層モデル
14.2 IPv4
14.3 TCP
14.4 UDP
14.5 アドレスの解決
14.6 mbuf
14.7 実装例:HinaOSのパケット送受信処理
14.8 実例:MINIX3のTCP/IPサーバ
14.9 実例:HurdのTCP/IPサーバ
第4部 発展的話題
Chapter 15 マルチプロセッサ対応
15.1 マルチプロセッサの形態
15.2 カーネルのマルチプロセッサ対応
15.3 スピンロック
15.4 プロセッサ間割り込み
Chapter 16 仮想化とエミュレーション
16.1 ハイパーバイザ
16.2 OS互換レイヤ
16.3 コンテナ
Chapter 17 信頼性とセキュリティ
17.1 「マイクロカーネルはモノリシックカーネルより安全」という主張
17.2 高い信頼性のために必要なこと
17.3 サーバの自動再起動
17.4 ライブアップデート
17.5 「ステートの漏出(state spill)」問題
17.6 HinaOSの脆弱性からみるOSのセキュリティ
Chapter 18 ソフトウェアによるプロセス隔離
18.1 プロセス隔離の必要性
18.2 ハードウェアによるプロセス隔離
18.3 ソフトウェアによるプロセス隔離
18.4 実装例:HinaVM
18.5 ソフトウェアによる隔離は安全か?
Chapter 19 ブート処理
19.1 ブートローダ
19.2 HinaOSのブート処理
19.3 MINIX3のブート処理
19.4 seL4のブート処理
19.5 Hurdのブート処理
Appendix 付録
Appendix 1 HinaOS開発環境の構築
Appendix 2 HinaOSのデバッグ
Appendix 3 参考文献
著者情報
怒田, 晟也
怒田晟也
筑波大学 情報学群 情報科学類 卒業、筑波大学大学院 リスク工学専攻 修士課程 修了。現在は、CDNにおけるエッジコンピューティング技術の開発に従事。OSカーネルやハイパーバイザといった低レイヤのソフトウェアが好き。趣味でLinux ABI互換カーネルをRustで書いてみたり、自身のWebサイトを自作OSで提供してみたりして遊んでいる。