自作OSで学ぶマイクロカーネルの設計と実装 (単行本)
本書では、マイクロカーネルOSの概念からその実例まで、著者が本書のために開発した自作OS(HinaOS)と実用OS(MINIX3、GNU Hurd、seL4)を例に、機能ごとに分け解説しています。
マイクロカーネルの解説、その上で動くソフトウェア部分(ユーザーランド)の解説、そして発展的内容の3部に分かれており、各章は、概念の解説パートと、その概念をどのように実装するかの実装パートで構成されています。
マイクロカーネルの解説、その上で動くソフトウェア部分(ユーザーランド)の解説、そして発展的内容の3部に分かれており、各章は、概念の解説パートと、その概念をどのように実装するかの実装パートで構成されています。
Part 1 基礎知識
Chapter 1 本書について
1.1 本書に向いている人
1.2 本書で学べないこと
1.3 本書の構成
1.4 データ量の表記
Chapter 2 マイクロカーネル入門
2.1 カーネルとは
2.2 マイクロカーネルとは
2.3 マイクロカーネルの機能
2.4 マイクロカーネルの長所と短所
2.5 本書で取り上げるマイクロカーネル
2.5.1 Mach
2.5.2 seL4
2.5.3 MINIX3
2.6 ソースコードを読むにあたって
2.6.1 カーネルの基本動作
2.6.2 コードリーディングテクニック
2.6.3 本書で紹介するソースコードの出典
Chapter 3 教育用マイクロカーネルOS「HinaOS」入門
3.1 なぜHinaOSなのか
3.2 HinaOSの特徴
3.3 ソースコードの入手
3.4 コードリーディングのための予備知識
3.4.1 全体像
3.4.2 ディレクトリ・ファイル構成
3.4.3 型・マクロ
3.4.4 エラー値の扱い
3.5 データ構造
3.5.1 双方向連結リスト
3.5.2 リングバッファ
Chapter 4 RISC-V 入門
4.1 CPUの基本動作
4.2 特権命令
4.3 インラインアセンブリ
Part 2 カーネル
Chapter 5 プロセスとスレッド
5.1 プロセスの中身
5.2 スレッド
5.3 マルチタスク
5.4 カーネルレベルスレッドとユーザーレベルスレッド
5.4.1 ユーザーレベルスレッドの切り替え契機
5.4.2 カーネルスレッド
5.5 スレッドの中身
5.6 実装例:HinaOSのプロセス・スレッド
5.7 スレッドの状態
5.8 コンテキストスイッチ
5.8.1 実装例:HinaOSのコンテキストスイッチ実装
5.9 スケジューリング
5.9.1 スケジューラアルゴリズム
5.9.2 実装例:HinaOS のスケジューラ
5.10 アイドル状態
5.10.1 実装例:HinaOSのアイドル状態処理
5.11 実例:MINIX3のプロセス・スレッド
5.11.1 エンドポイント番号
5.11.2 プロセスの生成
5.11.3 スケジューリング
5.12 実例:seL4のプロセス・スレッド
5.12.1 スレッドコントロールブロック(TCB)
5.12.2 スレッドの生成
5.12.3 スケジューリング
5.13 実例:Machのプロセス・スレッド
5.13.1 Machのタスク構造体
5.13.2 Machのスレッド構造体
5.13.3 プロセス・スレッドの生成
5.13.4 スケジューリング
5.14 まとめ
Chapter 6 メモリ管理
6.1 仮想メモリとは
6.2 仮想メモリのメリット
6.3 物理アドレス空間の構造
6.4 仮想アドレス空間の構造
6.4.1 実行ファイル
6.4.2 スタック
6.4.3 ヒープ
6.4.4 カーネル空間
6.5 ページング
6.5.1 ページテーブルの構造
6.5.2 Translation Lookaside Buffer
6.5.3 ページテーブルエントリ
6.5.4 大きいページ
6.5.5 HinaOSのページテーブル処理
6.6 ページフォルト
6.7 実装例:HinaOSのページフォルト処理
6.8 物理メモリ割り当て
6.8.1 実装例:HinaOSの物理メモリ割り当て
6.9 実例:MINIX3のメモリ管理
6.9.1 物理メモリ割り当て
6.9.2 ページテーブルの構造
6.9.3 ページテーブルの設定
6.9.4 ページフォルト処理
6.10 実例:seL4のメモリ管理
6.10.1 物理メモリ割り当て
6.10.2 ページテーブルの構造
6.10.3 ページテーブルの設定
6.10.4 ページフォルト処理
6.11 実例:Machのメモリ管理
6.11.1 物理メモリ割り当て
6.11.2 ページテーブルの構造
6.11.3 ページテーブルの設定
6.11.4 ページフォルト処理
6.12 まとめ
Chapter 7 割り込み・例外
7.1 割り込みと例外
7.1.1 割り込み
7.1.2 例外
7.2 実例:RISC-Vの割り込み処理
7.3 タイマー処理
7.3.1 実装例:HinaOSのタイマー処理
7.4 カーネルパニック
7.5 実例:MINIX3の割り込み処理
7.5.1 割り込み処理
7.5.2 例外処理
7.6 実例:seL4の割り込み処理
7.6.1 割り込み処理
7.6.2 例外処理
7.7 実例:Machの割り込み処理
7.7.1 割り込み処理
7.7.2 例外処理
7.8 まとめ
Chapter 8 メッセージパッシング
8.1 メッセージパッシング
8.1.1 メッセージの内容
8.1.2 間接型IPC vs. 直接型IPC
8.1.3 クローズド受信とオープン受信
8.2 非同期 vs. 同期的
8.2.1 タイムアウト
8.2.2 実装例:HinaOSのメッセージパッシング
8.3 通知IPC
8.3.1 実装例:HinaOSの通知IPC
8.4 大きなデータの転送
8.4.1 IPCは「コンテキストスイッチ」だ
8.5 デッドロック
8.5.1 同期的メッセージパッシングで起きるデッドロック
8.6 優先度の逆転問題
8.7 高速化技術
8.7.1 IPCファストパス
8.7.2 ハードウェア支援による高速化
8.8 実例:MINIX3のIPC
8.8.1 メッセージパッシングAPI
8.8.2 メッセージの構造
8.8.3 通知IPC
8.8.4 可変長データのコピー
8.8.5 Memory Grants
8.9 実例:seL4のIPC
8.9.1 メッセージパッシングAPI
8.9.2 メッセージの構造
8.9.3 IPCバッファの操作
8.9.4 通知IPC
8.10 実例:MachのIPC
8.10.1 システムコール
8.10.2 メッセージの構造
8.10.3 メッセージキューの実装
8.10.4 通知IPC
8.10.5 ポートセット
8.11 まとめ
Chapter 9 システムコール
9.1 システムコールの種類
9.2 実装例:HinaOSのシステムコール処理の流れ
9.3 ユーザー空間からのメモリコピー
9.3.1 実装例:HinaOSのユーザー空間からのメモリコピー処理
9.4 実例:MINIX3のシステムコール
9.4.1 システムコール
9.4.2 カーネルコール
9.5 実例:seL4のシステムコール
9.5.1 システムコール
9.5.2 カーネルコール
9.6 実例:Macのシステムコール
9.6.1 システムコール
9.6.2 カーネルコール
9.6.3 カーネルコールの仕組み
9.7 まとめ
Part 3 ユーザーランド
Chapter 10 ユーザーランド
10.1 サーバ
10.2 機構と方針の分離
10.3 シングルサーバOSとマルチサーバOS
10.4 サーバの種類
10.4.1 プロセス管理サーバ
10.4.2 名前解決サーバ
10.4.3 OSパーソナリティサーバ
10.4.4 メモリ管理サーバ
10.4.5 スケジューラサーバ
10.4.6 デバイスドライバサーバ
10.4.7 ファイルシステムサーバ
10.4.8 VFSサーバ
10.4.9 TCP/IPサーバ
10.4.10 GUIサーバ
10.5 実装例:HinaOSのサーバ構成
10.6 実例:MINIX3のサーバ構成
10.7 実例:seL4のサーバ構成
10.7.1 RefOS
10.7.2 seL4ベースのOS
10.8 実例:Hurdのサーバ構成
10.8.1 トランスレータ
Chapter 11 API(Application Programming Interface)
11.1 API
11.1.1 実装例:HinaOSのプロセス間通信API
11.2 メインループ
11.2.1 実例:MINIX3のメインループ
11.3 IPCスタブ
11.3.1 実装例:HinaOSのIPCスタブ
11.3.2 実例:seL4のIPCスタブ
11.3.3 実例:MachのIPCスタブ
11.4 ステートフルなリクエスト
11.4.1 実例:HinaOSやMINIX3 のハンドル
11.4.2 実例:Machのハンドル
11.4.3 実例:seLのハンドル
11.5 非同期メッセージパッシング
11.5.1 実装例:HinaOSの非同期メッセージパッシング
11.5.2 実例:MINIX3の非同期メッセージパッシング
11.6 動的メモリ割り当て(malloc)
11.6.1 mallocの基本的な仕組み
11.6.2 実装例:HinaOSのmalloc
Chapter 12 デバイスドライバ
12.1 デバイスの例
12.1.1 タイマー
12.1.2 入力デバイス
12.1.3 ストレージデバイス
12.1.4 ネットワークデバイス
12.2 デバイスドライバの仕組み
12.2.1 メモリマップトIOとポートマップトIO
12.2.2 DMA
12.2.3 デバイスドライバの一生
12.2.4 デバイスドライバに必要な機能
12.3 virtioデバイス
12.3.1 virtioの仕組み
12.3.2 ストレージデバイス(virtio-blk)
12.3.3 ネットワークデバイス(virtio-net)
12.3.4 その他のvirtioデバイス
12.4 実装例:HinaOSのvirtio-netドライバ
12.5 実例:MINIX3のデバイスドライバ
12.6 実例:seL4のデバイスドライバ
12.7 実例:Hurdのデバイスドライバ
Chapter 13 ファイルシステム
13.1 ファイルシステムの要素
13.1.1 ファイル
13.1.2 ディレクトリ
13.2 ファイルシステムの構造
13.2.1 ファイルシステムヘッダ
13.2.2 空きブロック情報
13.2.3 ディレクトリエントリ
13.2.4 データブロック
13.3 ファイルシステムの機能
13.3.1 ジャーナリング
13.3.2 スナップショット
13.4 疑似ファイルシステム
13.5 Filesystem in Userspace(FUSE)
13.6 実装例:HinaFSの設計
13.7 実装例:HinaFSの実装
13.8 実例:FATファイルシステム
13.8.1 FATテーブル
13.8.2 FAT32のディレクトリエントリ
13.9 ファイルシステムサーバ
13.9.1 実装例:HinaOSでのファイル操作の流れ
13.9.2 実例:MINIX3でのファイル操作の流れ
13.9.3 実例:Hurdでのファイル操作の流れ
Chapter 14 ネットワーク(TCP/IP)
14.1 TCP/IP階層モデル
14.1.1 ネットワークインターフェイス層
14.1.2 インターネット層
14.1.3 トランスポート層
14.1.4 アプリケーション層
14.2 IPv4
14.3 TCP
14.3.1 コネクションの確立
14.3.2 データの送信
14.3.3 コネクションの終了
14.4 UDP
14.5 アドレスの解決
14.5.1 送信元MACアドレスの解決
14.5.2 宛先MACアドレスの解決(IPv4の場合)
14.5.3 送信元IPアドレスの解決(IPv4の場合)
14.5.4 宛先IPアドレスの解決
14.6 mbuf
14.7 実装例:HinaOSのパケット送受信処理
14.8 実例:MINIX3のTCP/IPサーバ
14.9 実例:HurdのTCP/IPサーバ
14.9.1 pfinetトランスレータのタイムアウト処理
Part 4 発展的話題
Chapter 15 マルチプロセッサ対応
15.1 マルチプロセッサの形態
15.2 カーネルのマルチプロセッサ対応
15.3 スピンロック
15.3.1 割り込みの無効化
15.3.2 Big Kernel Lock
15.3.3 実装例:HinaOSのスピンロック実装
15.4 プロセッサ間割り込み
15.4.1 実装例:HinaOSのプロセッサ間割り込み処理
Chapter 16 仮想化とエミュレーション
16.1 ハイパーバイザ
16.1.1 Intel V T-x
16.1.2 ハイパーバイザとしてのマイクロカーネル
16.2 OS互換レイヤ
16.2.1 システムコールのフック
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.4.1 HinaVMの設計
18.4.2 HinaVMの起動
18.4.3 HinaVMバイトコードの構造
18.4.4 HinaVMプログラムの例
18.4.5 少し複雑なHinaVMプログラムの例
18.4.6 メインループ
18.5 ソフトウェアによる隔離は安全か?
Chapter 19 ブート処理
19.1 ブートローダ
19.2 HinaOSのブート処理
19.2.1 起動イメージ構造
19.2.2 ブートの流れ
19.3 MINIX3のブート処理
19.4 seL4のブート処理
19.4.1 ルートサーバの起動
19.4.2 ルートサーバのための動的なメモリ割り当て
19.5 Hurdのブート処理
Appendix 付録
Appendix 1 HinaOS開発環境の構築
A1.1 必要なソフトウェアのインストール
A1.1.1 Ubuntu
A1.1.2 macOS
A1.1.3 Windows
A1.2 ソースコードの入手
A1.3 Pythonパッケージのインストール
A1.4 HinaOSのビルド
A1.5 HinaOSの実行
Appendix 2 HinaOSのデバッグ
A2.1 逆アセンブル
A2.2 マップファイル
A2.3 プログラムカウンタの値からソースファイルを特定
A2.4 スタックトレース
A2.5 QEMUモニタ
A2.6 Undefined Behavior Sanitizer(UBSan)
A2.7 各関数のスタック使用量の確認
A2.8 自動テスト
A2.9 flakyテストのあぶり出し
A2.10 パケットキャプチャ
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.5.1 Mach
2.5.2 seL4
2.5.3 MINIX3
2.6 ソースコードを読むにあたって
2.6.1 カーネルの基本動作
2.6.2 コードリーディングテクニック
2.6.3 本書で紹介するソースコードの出典
Chapter 3 教育用マイクロカーネルOS「HinaOS」入門
3.1 なぜHinaOSなのか
3.2 HinaOSの特徴
3.3 ソースコードの入手
3.4 コードリーディングのための予備知識
3.4.1 全体像
3.4.2 ディレクトリ・ファイル構成
3.4.3 型・マクロ
3.4.4 エラー値の扱い
3.5 データ構造
3.5.1 双方向連結リスト
3.5.2 リングバッファ
Chapter 4 RISC-V 入門
4.1 CPUの基本動作
4.2 特権命令
4.3 インラインアセンブリ
Part 2 カーネル
Chapter 5 プロセスとスレッド
5.1 プロセスの中身
5.2 スレッド
5.3 マルチタスク
5.4 カーネルレベルスレッドとユーザーレベルスレッド
5.4.1 ユーザーレベルスレッドの切り替え契機
5.4.2 カーネルスレッド
5.5 スレッドの中身
5.6 実装例:HinaOSのプロセス・スレッド
5.7 スレッドの状態
5.8 コンテキストスイッチ
5.8.1 実装例:HinaOSのコンテキストスイッチ実装
5.9 スケジューリング
5.9.1 スケジューラアルゴリズム
5.9.2 実装例:HinaOS のスケジューラ
5.10 アイドル状態
5.10.1 実装例:HinaOSのアイドル状態処理
5.11 実例:MINIX3のプロセス・スレッド
5.11.1 エンドポイント番号
5.11.2 プロセスの生成
5.11.3 スケジューリング
5.12 実例:seL4のプロセス・スレッド
5.12.1 スレッドコントロールブロック(TCB)
5.12.2 スレッドの生成
5.12.3 スケジューリング
5.13 実例:Machのプロセス・スレッド
5.13.1 Machのタスク構造体
5.13.2 Machのスレッド構造体
5.13.3 プロセス・スレッドの生成
5.13.4 スケジューリング
5.14 まとめ
Chapter 6 メモリ管理
6.1 仮想メモリとは
6.2 仮想メモリのメリット
6.3 物理アドレス空間の構造
6.4 仮想アドレス空間の構造
6.4.1 実行ファイル
6.4.2 スタック
6.4.3 ヒープ
6.4.4 カーネル空間
6.5 ページング
6.5.1 ページテーブルの構造
6.5.2 Translation Lookaside Buffer
6.5.3 ページテーブルエントリ
6.5.4 大きいページ
6.5.5 HinaOSのページテーブル処理
6.6 ページフォルト
6.7 実装例:HinaOSのページフォルト処理
6.8 物理メモリ割り当て
6.8.1 実装例:HinaOSの物理メモリ割り当て
6.9 実例:MINIX3のメモリ管理
6.9.1 物理メモリ割り当て
6.9.2 ページテーブルの構造
6.9.3 ページテーブルの設定
6.9.4 ページフォルト処理
6.10 実例:seL4のメモリ管理
6.10.1 物理メモリ割り当て
6.10.2 ページテーブルの構造
6.10.3 ページテーブルの設定
6.10.4 ページフォルト処理
6.11 実例:Machのメモリ管理
6.11.1 物理メモリ割り当て
6.11.2 ページテーブルの構造
6.11.3 ページテーブルの設定
6.11.4 ページフォルト処理
6.12 まとめ
Chapter 7 割り込み・例外
7.1 割り込みと例外
7.1.1 割り込み
7.1.2 例外
7.2 実例:RISC-Vの割り込み処理
7.3 タイマー処理
7.3.1 実装例:HinaOSのタイマー処理
7.4 カーネルパニック
7.5 実例:MINIX3の割り込み処理
7.5.1 割り込み処理
7.5.2 例外処理
7.6 実例:seL4の割り込み処理
7.6.1 割り込み処理
7.6.2 例外処理
7.7 実例:Machの割り込み処理
7.7.1 割り込み処理
7.7.2 例外処理
7.8 まとめ
Chapter 8 メッセージパッシング
8.1 メッセージパッシング
8.1.1 メッセージの内容
8.1.2 間接型IPC vs. 直接型IPC
8.1.3 クローズド受信とオープン受信
8.2 非同期 vs. 同期的
8.2.1 タイムアウト
8.2.2 実装例:HinaOSのメッセージパッシング
8.3 通知IPC
8.3.1 実装例:HinaOSの通知IPC
8.4 大きなデータの転送
8.4.1 IPCは「コンテキストスイッチ」だ
8.5 デッドロック
8.5.1 同期的メッセージパッシングで起きるデッドロック
8.6 優先度の逆転問題
8.7 高速化技術
8.7.1 IPCファストパス
8.7.2 ハードウェア支援による高速化
8.8 実例:MINIX3のIPC
8.8.1 メッセージパッシングAPI
8.8.2 メッセージの構造
8.8.3 通知IPC
8.8.4 可変長データのコピー
8.8.5 Memory Grants
8.9 実例:seL4のIPC
8.9.1 メッセージパッシングAPI
8.9.2 メッセージの構造
8.9.3 IPCバッファの操作
8.9.4 通知IPC
8.10 実例:MachのIPC
8.10.1 システムコール
8.10.2 メッセージの構造
8.10.3 メッセージキューの実装
8.10.4 通知IPC
8.10.5 ポートセット
8.11 まとめ
Chapter 9 システムコール
9.1 システムコールの種類
9.2 実装例:HinaOSのシステムコール処理の流れ
9.3 ユーザー空間からのメモリコピー
9.3.1 実装例:HinaOSのユーザー空間からのメモリコピー処理
9.4 実例:MINIX3のシステムコール
9.4.1 システムコール
9.4.2 カーネルコール
9.5 実例:seL4のシステムコール
9.5.1 システムコール
9.5.2 カーネルコール
9.6 実例:Macのシステムコール
9.6.1 システムコール
9.6.2 カーネルコール
9.6.3 カーネルコールの仕組み
9.7 まとめ
Part 3 ユーザーランド
Chapter 10 ユーザーランド
10.1 サーバ
10.2 機構と方針の分離
10.3 シングルサーバOSとマルチサーバOS
10.4 サーバの種類
10.4.1 プロセス管理サーバ
10.4.2 名前解決サーバ
10.4.3 OSパーソナリティサーバ
10.4.4 メモリ管理サーバ
10.4.5 スケジューラサーバ
10.4.6 デバイスドライバサーバ
10.4.7 ファイルシステムサーバ
10.4.8 VFSサーバ
10.4.9 TCP/IPサーバ
10.4.10 GUIサーバ
10.5 実装例:HinaOSのサーバ構成
10.6 実例:MINIX3のサーバ構成
10.7 実例:seL4のサーバ構成
10.7.1 RefOS
10.7.2 seL4ベースのOS
10.8 実例:Hurdのサーバ構成
10.8.1 トランスレータ
Chapter 11 API(Application Programming Interface)
11.1 API
11.1.1 実装例:HinaOSのプロセス間通信API
11.2 メインループ
11.2.1 実例:MINIX3のメインループ
11.3 IPCスタブ
11.3.1 実装例:HinaOSのIPCスタブ
11.3.2 実例:seL4のIPCスタブ
11.3.3 実例:MachのIPCスタブ
11.4 ステートフルなリクエスト
11.4.1 実例:HinaOSやMINIX3 のハンドル
11.4.2 実例:Machのハンドル
11.4.3 実例:seLのハンドル
11.5 非同期メッセージパッシング
11.5.1 実装例:HinaOSの非同期メッセージパッシング
11.5.2 実例:MINIX3の非同期メッセージパッシング
11.6 動的メモリ割り当て(malloc)
11.6.1 mallocの基本的な仕組み
11.6.2 実装例:HinaOSのmalloc
Chapter 12 デバイスドライバ
12.1 デバイスの例
12.1.1 タイマー
12.1.2 入力デバイス
12.1.3 ストレージデバイス
12.1.4 ネットワークデバイス
12.2 デバイスドライバの仕組み
12.2.1 メモリマップトIOとポートマップトIO
12.2.2 DMA
12.2.3 デバイスドライバの一生
12.2.4 デバイスドライバに必要な機能
12.3 virtioデバイス
12.3.1 virtioの仕組み
12.3.2 ストレージデバイス(virtio-blk)
12.3.3 ネットワークデバイス(virtio-net)
12.3.4 その他のvirtioデバイス
12.4 実装例:HinaOSのvirtio-netドライバ
12.5 実例:MINIX3のデバイスドライバ
12.6 実例:seL4のデバイスドライバ
12.7 実例:Hurdのデバイスドライバ
Chapter 13 ファイルシステム
13.1 ファイルシステムの要素
13.1.1 ファイル
13.1.2 ディレクトリ
13.2 ファイルシステムの構造
13.2.1 ファイルシステムヘッダ
13.2.2 空きブロック情報
13.2.3 ディレクトリエントリ
13.2.4 データブロック
13.3 ファイルシステムの機能
13.3.1 ジャーナリング
13.3.2 スナップショット
13.4 疑似ファイルシステム
13.5 Filesystem in Userspace(FUSE)
13.6 実装例:HinaFSの設計
13.7 実装例:HinaFSの実装
13.8 実例:FATファイルシステム
13.8.1 FATテーブル
13.8.2 FAT32のディレクトリエントリ
13.9 ファイルシステムサーバ
13.9.1 実装例:HinaOSでのファイル操作の流れ
13.9.2 実例:MINIX3でのファイル操作の流れ
13.9.3 実例:Hurdでのファイル操作の流れ
Chapter 14 ネットワーク(TCP/IP)
14.1 TCP/IP階層モデル
14.1.1 ネットワークインターフェイス層
14.1.2 インターネット層
14.1.3 トランスポート層
14.1.4 アプリケーション層
14.2 IPv4
14.3 TCP
14.3.1 コネクションの確立
14.3.2 データの送信
14.3.3 コネクションの終了
14.4 UDP
14.5 アドレスの解決
14.5.1 送信元MACアドレスの解決
14.5.2 宛先MACアドレスの解決(IPv4の場合)
14.5.3 送信元IPアドレスの解決(IPv4の場合)
14.5.4 宛先IPアドレスの解決
14.6 mbuf
14.7 実装例:HinaOSのパケット送受信処理
14.8 実例:MINIX3のTCP/IPサーバ
14.9 実例:HurdのTCP/IPサーバ
14.9.1 pfinetトランスレータのタイムアウト処理
Part 4 発展的話題
Chapter 15 マルチプロセッサ対応
15.1 マルチプロセッサの形態
15.2 カーネルのマルチプロセッサ対応
15.3 スピンロック
15.3.1 割り込みの無効化
15.3.2 Big Kernel Lock
15.3.3 実装例:HinaOSのスピンロック実装
15.4 プロセッサ間割り込み
15.4.1 実装例:HinaOSのプロセッサ間割り込み処理
Chapter 16 仮想化とエミュレーション
16.1 ハイパーバイザ
16.1.1 Intel V T-x
16.1.2 ハイパーバイザとしてのマイクロカーネル
16.2 OS互換レイヤ
16.2.1 システムコールのフック
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.4.1 HinaVMの設計
18.4.2 HinaVMの起動
18.4.3 HinaVMバイトコードの構造
18.4.4 HinaVMプログラムの例
18.4.5 少し複雑なHinaVMプログラムの例
18.4.6 メインループ
18.5 ソフトウェアによる隔離は安全か?
Chapter 19 ブート処理
19.1 ブートローダ
19.2 HinaOSのブート処理
19.2.1 起動イメージ構造
19.2.2 ブートの流れ
19.3 MINIX3のブート処理
19.4 seL4のブート処理
19.4.1 ルートサーバの起動
19.4.2 ルートサーバのための動的なメモリ割り当て
19.5 Hurdのブート処理
Appendix 付録
Appendix 1 HinaOS開発環境の構築
A1.1 必要なソフトウェアのインストール
A1.1.1 Ubuntu
A1.1.2 macOS
A1.1.3 Windows
A1.2 ソースコードの入手
A1.3 Pythonパッケージのインストール
A1.4 HinaOSのビルド
A1.5 HinaOSの実行
Appendix 2 HinaOSのデバッグ
A2.1 逆アセンブル
A2.2 マップファイル
A2.3 プログラムカウンタの値からソースファイルを特定
A2.4 スタックトレース
A2.5 QEMUモニタ
A2.6 Undefined Behavior Sanitizer(UBSan)
A2.7 各関数のスタック使用量の確認
A2.8 自動テスト
A2.9 flakyテストのあぶり出し
A2.10 パケットキャプチャ
Appendix 3 参考文献