最終更新:2013-01-25 (金) 19:06:09 (4256d)
参考図書/詳解 Linuxカーネル 第3版
http://www.oreilly.co.jp/books/9784873113135/
目次
監訳者まえがき
はじめに
1章 - 概要
- 1.1 - LinuxとほかのUNIX系カーネル
- 1.2 - ハードウェア依存
- 1.3 - Linuxのバージョン
- 1.4 - オペレーティングシステムの基本概念
- 1.5 - UNIXファイルシステムの概要
- 1.6 - UNIXカーネル?の概要
2章 - メモリアドレッシング?
- 2.1 - メモリアドレス
- 2.2 - ハードウェアのセグメント機構
- 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.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.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章 - ext2、ext3ファイルシステム
- 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.4 - ext2ファイルシステムの作成
- 18.5 - 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.3 - モジュールの組み込みと削除
- B.4 - 必要になってからのモジュール組み込み
- B.4.1 - modprobeプログラム
- B.4.2 - request_module()関数
参考文献
- UNIXカーネルについての書籍
- Linuxカーネルについての書籍
- PCアーキテクチャに関する本とIntelマイクロプロセッサのテクニカルマニュアル
- その他のオンラインの情報源
- Linux開発に関する研究論文