自作OSで学ぶマイクロカーネルの設計と実装 (単行本)

自作OSで学ぶマイクロカーネルの設計と実装
フォーマット:
単行本 電子書籍

OSはもっと自由だし、その舞台裏はずっと楽しい!

著者 怒田 晟也
ジャンル IT系書籍 > プログラミング言語
書店発売日 2023/05/18
ISBN 9784798068718
判型・ページ数 B5変・432ページ
定価 3960円
(本体3600円+税10%)

この本に関するお問い合わせ・感想

本書では、マイクロカーネルOSの概念からその実例まで、著者が本書のために開発した自作OS(HinaOS)と実用OS(MINIX3、GNU Hurd、seL4)を例に、機能ごとに分け解説しています。
マイクロカーネルの解説、その上で動くソフトウェア部分(ユーザーランド)の解説、そして発展的内容の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 参考文献
  • 2023.06.02

    『自作OSで学ぶマイクロカーネルの設計と実装』の修正情報などのサポート情報については下記をご確認願います。
    https://www.shuwasystem.co.jp/support/7980html/6871.html

  • 2023.05.10

    新刊『自作OSで学ぶマイクロカーネルの設計と実装』のプレスリリースを配信しました。

    シンプルでエレガントにOSの機能を実現するマイクロカーネルの手法について、自作OSと実用OSで、それぞれの設計と実装を理解し、そこに込められているアイデアとテクニックを探求しよう!
    https://prtimes.jp/main/html/rd/p/000000107.000049716.html

ご注文

定価3960円
(本体3600円+税10%)

別フォーマットで購入

シェアする

このエントリーをはてなブックマークに追加

関連書籍

同じジャンルの商品

お知らせ

一覧