最終更新:2013-01-25 (金) 19:06:09 (4102d)  

参考図書/詳解 Linuxカーネル 第3版
Top / 参考図書 / 詳解 Linuxカーネル 第3版

http://www.oreilly.co.jp/books/9784873113135/

目次

監訳者まえがき

はじめに

1章 - 概要

2章 - メモリアドレッシング?

  • 2.1 - メモリアドレス
  • 2.2 - ハードウェアのセグメント機構
    • 2.2.1 - セグメントセレクタ?セグメントレジスタ
    • 2.2.2 - セグメントディスクリプタ
    • 2.2.3 - セグメントディスクリプタへの高速アクセス
    • 2.2.4 - セグメンテーション回路
  • 2.3 - Linuxのセグメント機構
    • 2.3.1 - LinuxのGDT
    • 2.3.2 - LinuxのLDT
  • 2.4 - ハードウェアのページング機構
    • 2.4.1 - 通常のページング
    • 2.4.2 - 拡張ページング
    • 2.4.3 - ハードウェア保護機構
    • 2.4.4 - 通常ページングの例
    • 2.4.5 - 物理アドレス拡張ページング機構
    • 2.4.6 - 64ビットアーキテクチャにおけるページング
    • 2.4.7 - ハードウェアキャッシュ
    • 2.4.8 - アドレス変換バッファ(TLB)
  • 2.5 - Linuxのページング機構
    • 2.5.1 - リニアアドレスフィールド
    • 2.5.2 - ページテーブルの処理
    • 2.5.3 - 物理メモリレイアウト
    • 2.5.4 - プロセスのページテーブル
    • 2.5.5 - カーネルのページテーブル
    • 2.5.6 - 固定マップ用リニアアドレス
    • 2.5.7 - ハードウェアキャッシュとTLBの制御

3章 - プロセス

  • 3.1 - プロセス、軽量プロセス、スレッド
  • 3.2 - プロセスディスクリプタ
    • 3.2.1 - プロセスの状態
    • 3.2.2 - プロセスの識別
    • 3.2.3 - プロセスの親子関係
    • 3.2.4 - プロセスの管理方法
    • 3.2.5 - プロセスの資源利用制限
  • 3.3 - プロセス切り替え
    • 3.3.1 - ハードウェアコンテキスト
    • 3.3.2 - タスク状態セグメント
    • 3.3.3 - プロセス切り替えの実行
    • 3.3.4 - FPUレジスタ、MMXレジスタ、XMMレジスタの退避回復
  • 3.4 - プロセスの生成
    • 3.4.1 - clone()、fork()、vfork()システムコール
    • 3.4.2 - カーネルスレッド
  • 3.5 - プロセスの破棄
    • 3.5.1 - プロセスの終了
    • 3.5.2 - プロセスの削除

4章 - 割り込みと例外

  • 4.1 - 割り込み信号の役割
  • 4.2 - 割り込みと例外
    • 4.2.1 - IRQと割り込み
    • 4.2.2 - 例外
    • 4.2.3 - 割り込みディスクリプタテーブル
    • 4.2.4 - ハードウェアの割り込みと例外の処理
  • 4.3 - 例外および割り込み処理のネスト
  • 4.4 - 割り込みディスクリプタテーブルの初期化
    • 4.4.1 - 割り込み、トラップ、システムゲート
    • 4.4.2 - IDTの予備初期化
  • 4.5 - 例外処理
    • 4.5.1 - 例外ハンドラ用のレジスタ退避処理
    • 4.5.2 - 例外ハンドラの開始と終了
  • 4.6 - 割り込み処理
    • 4.6.1 - I/O割り込み処理
    • 4.6.2 - プロセッサ間割り込み処理
  • 4.7 - ソフト割り込みとタスクレット
    • 4.7.1 - ソフト割り込み
    • 4.7.2 - タスクレット
  • 4.8 - ワークキュー
  • 4.9 - 割り込みおよび例外からの復帰

5章 - カーネルの同期処理

  • 5.1 - カーネルは要求をどのように処理するか
    • 5.1.1 - カーネル内プリエンプション
    • 5.1.2 - 同期の必要がある場合
    • 5.1.3 - 同期の必要がない場合
  • 5.2 - 同期プリミティブ
  • 5.3 - カーネルデータアクセスの同期
    • 5.3.1 - スピンロック、セマフォおよび割り込み禁止の選択
  • 5.4 - 競合状態回避の例
    • 5.4.1 - 参照カウンタ
    • 5.4.2 - ビッグカーネルロック
    • 5.4.3 - メモリディスクリプタの読み書き用セマフォ
    • 5.4.4 - スラブキャッシュリストのセマフォ
    • 5.4.5 - iノードのセマフォ

6章 - 時間管理

  • 6.1 - クロック回路とタイマ回路
    • 6.1.1 - リアルタイムクロック(RTC
    • 6.1.2 - タイムスタンプカウンタ(TSC?
    • 6.1.3 - プログラマブルインターバルタイマ(PIT?
    • 6.1.4 - CPUローカルタイマ
    • 6.1.5 - 高精度イベントタイマ(HPET
    • 6.1.6 - ACPI電源管理タイマ(ACPI PMT?
  • 6.2 - 時間管理の仕組み
    • 6.2.1 - 時間管理のデータ構造
    • 6.2.2 - 単一プロセッサシステムにおける時間管理の仕組み
    • 6.2.3 - マルチプロセッサシステムにおける時間管理の仕組み
  • 6.3 - 時刻と日付の更新
  • 6.4 - 統計情報の更新
    • 6.4.1 - ローカルCPUの統計情報の更新
    • 6.4.2 - システム負荷の管理
    • 6.4.3 - カーネルコードのプロファイリング
    • 6.4.4 - NMIウォッチドッグの確認
  • 6.5 - ソフトウェアタイマと遅延関数
    • 6.5.1 - 動的タイマ
    • 6.5.2 - 動的タイマの適用例:nanosleep()システムコール
    • 6.5.3 - 遅延関数
  • 6.6 - 時間管理関連のシステムコール
    • 6.6.1 - time()、gettimeofday()システムコール
    • 6.6.2 - adjtimex()システムコール
    • 6.6.3 - setitimer()、alarm()システムコール
    • 6.6.4 - POSIXタイマ

7章 - プロセススケジューリング?

  • 7.1 - スケジューリング方針
    • 7.1.1 - プロセスプリエンプション
    • 7.1.2 - 最適なクォンタムの長さ
  • 7.2 - スケジューリングアルゴリズム
    • 7.2.1 - 従来型プロセスのスケジュール
    • 7.2.2 - リアルタイムプロセスのスケジュール
  • 7.3 - スケジューラが使用するデータ構造
    • 7.3.1 - runqueueデータ構造
    • 7.3.2 - プロセスディスクリプタ
  • 7.4 - スケジューラが使用する関数
    • 7.4.1 - scheduler_tick()関数
    • 7.4.2 - try_to_wake_up()関数
    • 7.4.3 - recalc_task_prio()関数
    • 7.4.4 - schedule()関数
  • 7.5 - マルチプロセッサにおける実行キューの負荷均衡化処理
    • 7.5.1 - スケジューリングドメイン
    • 7.5.2 - rebalance_tick()関数
    • 7.5.3 - load_balance()関数
    • 7.5.4 - move_tasks()関数
  • 7.6 - スケジューリング関連のシステムコール
    • 7.6.1 - nice()システムコール
    • 7.6.2 - getpriority()、setpriority()システムコール
    • 7.6.3 - sched_getaffinity()、sched_setaffinity()システムコール
    • 7.6.4 - リアルタイムプロセス関連のシステムコール

8章 - メモリ管理

  • 8.1 - ページフレームの管理
    • 8.1.1 - ページディスクリプタ
    • 8.1.2 - 不均等メモリアクセスアーキテクチャ(NUMA)
    • 8.1.3 - メモリゾーン
    • 8.1.4 - 空きページフレームの予約
    • 8.1.5 - ゾーンごとのページフレームアロケータ
    • 8.1.6 - 高位メモリのページフレームのカーネルマッピング
    • 8.1.7 - バディシステム
    • 8.1.8 - CPUごとのページフレームキャッシュ
    • 8.1.9 - ゾーンアロケータ
  • 8.2 - メモリ領域の管理
    • 8.2.1 - スラブアロケータ
    • 8.2.2 - キャッシュディスクリプタ
    • 8.2.3 - スラブディスクリプタ
    • 8.2.4 - 汎用キャッシュと特定用途のキャッシュ
    • 8.2.5 - スラブアロケータとゾーンごとのページフレームアロケータ間のインタフェース
    • 8.2.6 - キャッシュへのスラブの割り当て
    • 8.2.7 - キャッシュからのスラブの解放
    • 8.2.8 - オブジェクトディスクリプタ
    • 8.2.9 - メモリ上でのオブジェクトの境界合わせ
    • 8.2.10 - スラブの色付け
    • 8.2.11 - 空きスラブオブジェクトのローカルキャッシュ
    • 8.2.12 - スラブオブジェクトの割り当て
    • 8.2.13 - スラブオブジェクトの解放
    • 8.2.14 - 汎用オブジェクト
    • 8.2.15 - メモリプール
  • 8.3 - 非連続メモリ領域の管理
    • 8.3.1 - 非連続メモリ領域のリニアアドレス
    • 8.3.2 - 非連続メモリ領域のディスクリプタ
    • 8.3.3 - 非連続メモリ領域の割り当て
    • 8.3.4 - 非連続メモリ領域の解放

9章 - プロセスアドレス空間?

  • 9.1 - プロセスのアドレス空間
  • 9.2 - メモリディスクリプタ
    • 9.2.1 - カーネルスレッドのメモリディスクリプタ
  • 9.3 - メモリリージョン
    • 9.3.1 - メモリリージョンのデータ構造
    • 9.3.2 - メモリリージョンのアクセス権
    • 9.3.3 - メモリリージョン処理
    • 9.3.4 - リニアアドレス区間の割り当て
    • 9.3.5 - リニアアドレス区間の解放
  • 9.4 - ページフォルト例外ハンドラ
    • 9.4.1 - アドレス空間外の例外処理
    • 9.4.2 - アドレス空間内の例外処理
    • 9.4.3 - デマンドページング
    • 9.4.4 - コピーオンライト
    • 9.4.5 - 非連続メモリ領域へのアクセス
  • 9.5 - プロセスアドレス空間の生成と削除
    • 9.5.1 - プロセスアドレス空間の生成
    • 9.5.2 - プロセスアドレス空間の削除
  • 9.6 - ヒープ領域の管理

10章 - システムコール

  • 10.1 - POSIX APIとシステムコール
  • 10.2 - システムコールハンドラとシステムコールサービスルーチン
  • 10.3 - システムコールの入口と出口
    • 10.3.1 - int $0x80命令によるシステムコール発行
    • 10.3.2 - sysenter命令によるシステムコール発行
  • 10.4 - 引数の受け渡し
    • 10.4.1 - 引数の確認
    • 10.4.2 - プロセスアドレス空間へのアクセス
    • 10.4.3 - アドレスの動的な確認とfixupコード
    • 10.4.4 - 例外テーブル
    • 10.4.5 - 例外テーブルとfixupコードの生成
  • 10.5 - カーネルラッパールーチン

11章 - シグナル

  • 11.1 - シグナルの役割
    • 11.1.1 - シグナル配信時の動作
    • 11.1.2 - POSIXシグナルとマルチスレッドアプリケーション
    • 11.1.3 - シグナル関連のデータ
    • 11.1.4 - シグナル関連のデータの操作
  • 11.2 - シグナルの生成
    • 11.2.1 - specific_send_sig_info()関数
    • 11.2.2 - send_signal()関数
    • 11.2.3 - group_send_sig_info()関数
  • 11.3 - シグナルの配信
    • 11.3.1 - シグナルの標準設定動作の実行
    • 11.3.2 - シグナルの捕捉
    • 11.3.3 - システムコールの再実行
  • 11.4 - シグナル処理関連のシステムコール
    • 11.4.1 - kill()システムコール
    • 11.4.2 - tkill()、tgkill()システムコール
    • 11.4.3 - シグナル受信処理の変更
    • 11.4.4 - ブロックされている保留中シグナルの確認
    • 11.4.5 - ブロックするシグナルの変更
    • 11.4.6 - プロセスの停止
    • 11.4.7 - リアルタイムシグナル用のシステムコール

12章 - 仮想ファイルシステムVFS

  • 12.1 - 仮想ファイルシステム(VFS)の役割
    • 12.1.1 - 共通ファイルモデル
    • 12.1.2 - VFSが取り扱うシステムコール
  • 12.2 - VFSデータ構造
    • 12.2.1 - スーパブロックオブジェクト
    • 12.2.2 - iノードオブジェクト
    • 12.2.3 - ファイルオブジェクト
    • 12.2.4 - dエントリオブジェクト
    • 12.2.5 - dエントリキャッシュ
    • 12.2.6 - プロセスとファイル
  • 12.3 - ファイルシステム種別
    • 12.3.1 - 特殊ファイルシステム
    • 12.3.2 - ファイルシステム種別の登録
  • 12.4 - ファイルシステムの操作
    • 12.4.1 - 名前空間
    • 12.4.2 - ファイルシステムのマウント
    • 12.4.3 - 一般ファイルシステムのマウント
    • 12.4.4 - ルートファイルシステムのマウント
    • 12.4.5 - ファイルシステムのアンマウント
  • 12.5 - パス名の検索
    • 12.5.1 - 標準的なパス名の検索
    • 12.5.2 - 親パス名の検索
    • 12.5.3 - シンボリックリンクの検索
  • 12.6 - VFSシステムコールの実装
    • 12.6.1 - open()システムコール
    • 12.6.2 - read()、write()システムコール
    • 12.6.3 - close?()システムコール
  • 12.7 - ファイルロック
    • 12.7.1 - Linuxのファイルロック
    • 12.7.2 - ファイルロックデータ構造
    • 12.7.3 - FL_FLOCKロック
    • 12.7.4 - FL_POSIXロック

13章 - I/Oデバイスの管理

  • 13.1 - I/Oアーキテクチャ
    • 13.1.1 - I/Oポート
    • 13.1.2 - I/Oインタフェース
    • 13.1.3 - デバイスコントローラ
  • 13.2 - デバイスドライバモデル
    • 13.2.1 - sysfsファイルシステム
    • 13.2.2 - kオブジェクト
    • 13.2.3 - デバイスドライバモデルの構成要素
  • 13.3 - デバイスファイル
    • 13.3.1 - デバイスファイルのユーザモード処理
    • 13.3.2 - VFSのデバイスファイルの取り扱い
  • 13.4 - デバイスドライバ
    • 13.4.1 - デバイスドライバの登録
    • 13.4.2 - デバイスドライバの初期化
    • 13.4.3 - I/O操作の監視
    • 13.4.4 - I/O共有メモリへのアクセス
    • 13.4.5 - ダイレクトメモリアクセス(DMA)
    • 13.4.6 - カーネルの支援水準
  • 13.5 - キャラクタ型デバイスドライバ
    • 13.5.1 - デバイス番号の割り当て
    • 13.5.2 - キャラクタ型デバイスドライバへのアクセス
    • 13.5.3 - キャラクタ型デバイスのバッファリング方式

14章 - ブロック型デバイスドライバ

  • 14.1 - ブロック型デバイスの管理
    • 14.1.1 - セクタ
    • 14.1.2 - ブロック
    • 14.1.3 - セグメント
  • 14.2 - 汎用ブロック層
    • 14.2.1 - bioデータ構造
    • 14.2.2 - ディスクとディスクパーティションの管理方式
    • 14.2.3 - 要求の発行
  • 14.3 - I/Oスケジューラ
    • 14.3.1 - 要求キューディスクリプタ
    • 14.3.2 - 要求ディスクリプタ
    • 14.3.3 - ブロック型デバイスドライバの有効化
    • 14.3.4 - I/Oスケジューリングアルゴリズム
    • 14.3.5 - I/Oスケジューラに対する要求の発行
  • 14.4 - ブロック型デバイスドライバ
    • 14.4.1 - ブロック型デバイス
    • 14.4.2 - デバイスドライバの登録と初期化
    • 14.4.3 - ストラテジルーチン
    • 14.4.4 - 割り込みハンドラ
  • 14.5 - ブロック型デバイスファイルのオープン

15章 - ページキャッシュ?

  • 15.1 - ページキャッシュ
    • 15.1.1 - アドレス空間オブジェクト
    • 15.1.2 - 基数ツリー
    • 15.1.3 - ページキャッシュ操作関数
    • 15.1.4 - 基数ツリーのタグ
  • 15.2 - ページキャッシュへのブロック格納
    • 15.2.1 - ブロックバッファとバッファヘッド
    • 15.2.2 - バッファヘッドの管理
    • 15.2.3 - バッファページ
    • 15.2.4 - ブロック型デバイスバッファページの確保
    • 15.2.5 - ブロック型デバイスバッファページの解放
    • 15.2.6 - ページキャッシュ内のブロック検索
    • 15.2.7 - 汎用ブロック層へのバッファヘッドの処理依頼
  • 15.3 - 汚れたページのディスクへの書き込み
    • 15.3.1 - pdflushカーネルスレッド
    • 15.3.2 - 書き込み対象とする汚れたページの探索
    • 15.3.3 - 古い汚れたページの取り出し
  • 15.4 - sync()、fsync()、fdatasync()システムコール
    • 15.4.1 - sync()システムコール
    • 15.4.2 - fsync()、fdatasync()システムコール

16章 - ファイルアクセス

  • 16.1 - ファイルの読み取りと書き込み
    • 16.1.1 - ファイルの読み取り
    • 16.1.2 - ファイルの先読み
    • 16.1.3 - ファイルへの書き込み
    • 16.1.4 - 汚れたページのディスクへの書き込み
  • 16.2 - メモリマッピング?
    • 16.2.1 - メモリマッピングのデータ構造
    • 16.2.2 - メモリマッピングの生成
    • 16.2.3 - メモリマッピングの削除
    • 16.2.4 - メモリマッピングのデマンドページング
    • 16.2.5 - メモリマッピングされた汚れたページのディスクへの書き込み
    • 16.2.6 - 非線形なメモリマッピング
  • 16.3 - ダイレクトI/O転送
  • 16.4 - 非同期I/O
    • 16.4.1 - Linux 2.6における非同期I/O

17章 - ページフレーム?の回収

  • 17.1 - ページフレーム回収アルゴリズム
    • 17.1.1 - 対象ページの選択
    • 17.1.2 - ページフレーム回収アルゴリズムの設計
  • 17.2 - 逆マッピング
    • 17.2.1 - 無名ページの逆マッピング
    • 17.2.2 - マッピングされたページの逆マッピング
  • 17.3 - ページフレーム回収アルゴリズム(PFRA)の実装
    • 17.3.1 - 最長不使用順(LRU)リスト
    • 17.3.2 - メモリ不足時の回収処理
    • 17.3.3 - ディスクキャッシュからのページの回収
    • 17.3.4 - 定期的回収処理
    • 17.3.5 - OOMキラー
    • 17.3.6 - スワップ優先権
  • 17.4 - スワップ処理
    • 17.4.1 - スワップ領域
    • 17.4.2 - スワップ領域ディスクリプタ
    • 17.4.3 - スワップアウトページ識別子
    • 17.4.4 - スワップ領域の有効化と無効化
    • 17.4.5 - ページスロットの割り当てと解放
    • 17.4.6 - スワップキャッシュ
    • 17.4.7 - ページのスワップアウト
    • 17.4.8 - ページのスワップイン

18章 - ext2ext3ファイルシステム

  • 18.1 - ext2の一般的な特徴
  • 18.2 - ext2ディスク上のデータ構造
    • 18.2.1 - スーパブロック?
    • 18.2.2 - グループディスクリプタとビットマップ
    • 18.2.3 - iノードテーブル
    • 18.2.4 - iノードの拡張属性
    • 18.2.5 - アクセス制御リスト(ACL)
    • 18.2.6 - ファイル種類とディスクブロックの使用法
  • 18.3 - ext2メモリ上のデータ構造
    • 18.3.1 - ext2スーパブロックオブジェクト
    • 18.3.2 - ext2 iノードオブジェクト
  • 18.4 - ext2ファイルシステムの作成
  • 18.5 - ext2関数
    • 18.5.1 - ext2スーパブロック操作
    • 18.5.2 - ext2 iノード操作
    • 18.5.3 - ext2ファイル操作
  • 18.6 - ext2ディスク領域の管理
    • 18.6.1 - iノードの作成
    • 18.6.2 - iノードの削除
    • 18.6.3 - データブロックのアドレッシング
    • 18.6.4 - ファイルホール
    • 18.6.5 - データブロックの割り当て
    • 18.6.6 - データブロックの解放
  • 18.7 - ext3ファイルシステム
    • 18.7.1 - ジャーナリングファイルシステム(JFS)
    • 18.7.2 - ext3ジャーナリングファイルシステム
    • 18.7.3 - ジャーナリングブロック型デバイス(JBD)
    • 18.7.4 - ジャーナリングの動作

19章 - プロセス間通信

20章 - プログラムの実行

  • 20.1 - 実行ファイル
    • 20.1.1 - プロセスの権限とケーパビリティ
    • 20.1.2 - コマンドライン引数とシェル環境
    • 20.1.3 - ライブラリ
    • 20.1.4 - プログラムセグメントとプロセスメモリリージョン
    • 20.1.5 - 実行の追跡
  • 20.2 - 実行形式
  • 20.3 - 実行ドメイン
  • 20.4 - Exec関数

付録A - システムの起動

  • A.1 - 先史時代:BIOS
  • A.2 - 古代:ブートローダ
    • A.2.1 - ディスクからのブート
  • A.3 - 中世:setup()関数
  • A.4 - ルネッサンス:startup_32()関数
  • A.5 - 近世:start_kernel()関数

付録B - モジュール

  • B.1 - モジュールにすべきか?
    • B.1.1 - モジュールのライセンス
  • B.2 - モジュールの実装
    • B.2.1 - モジュール?の利用度数カウンタ
    • B.2.2 - シンボルの公開
    • B.2.3 - モジュール?の依存関係
  • B.3 - モジュールの組み込みと削除
  • B.4 - 必要になってからのモジュール組み込み

参考文献

  • UNIXカーネルについての書籍
  • Linuxカーネルについての書籍
  • PCアーキテクチャに関する本とIntelマイクロプロセッサのテクニカルマニュアル
  • その他のオンラインの情報源
  • Linux開発に関する研究論文

ソースコード索引

索引