Linux 高度なプログラミング {開発} チュートリアル<br /> パート 1 Linux カーネル パート 2 Linux カーネル モジュール プログラミング ガイド パート 3 Linux プログラマーズ ガイド パート 4 Linux カーネルの概念 システム構造 パート 5 Linux カーネル固有のシステム構造
目次 レイモンドの紹介 序文
Linux ドキュメントエンジニアリンググループ「お知らせ」
翻訳者序文 第 1 部 Linux カーネル序文
第 1 章 ハードウェアの基本とソフトウェアの基本 6
1.1 ハードウェアの基本 6
1.1.1 CPU7
1.1.2 メモリ 8
1.1.3 バス 8
1.1.4 コントローラと周辺機器 8
1.1.5 アドレス空間9
1.1.6 クロック9
1.2 ソフトウェアの基本 9
1.2.1 コンピュータ言語 9
1.2.2 オペレーティング システムとは 11
1.2.3 カーネルのデータ構造 13
第 2 章 メモリ管理 15
2.1 仮想メモリ抽象モデル 15
2.1.1 リクエストページング 17
2.1.2 交換17
2.1.3 共有仮想メモリ 18
2.1.4 物理アドレッシングモードと仮想アドレッシングモード 18
2.1.5 アクセス制御 18
2.2 キャッシュ 19
2.3 Linux ページテーブル 20
2.4 ページの割り当てとリサイクル 21
2.4.1 ページの割り当て 22
2.4.2 ページのリサイクル 22
2.5 メモリマッピング 22
2.6 リクエストページング 23
2.7 Linux ページキャッシュ 24
2.8 ページの交換と削除 25
2.8.1 バッファおよびページ キャッシュ サイズの削減 25
2.8.2 System V 共有メモリ ページのスワップアウト 26
2.8.3 ページの交換と廃止 27
2.9 スワップキャッシュ 27
2.10 ページ変更 28
第3章 プロセス29
3.1 Linux プロセス 29
3.2 識別子 31
3.3 スケジュール設定 32
3.4 ドキュメント 34
3.5 仮想メモリ 35
3.6 プロセスの作成 36
3.7 時間とタイマー 37
3.8 プログラムの実行 38
3.8.1 エルフ 39
3.8.2 スクリプトファイル 40
第4章 プロセス間通信の仕組み 41
4.1 信号伝達メカニズム 41
4.2 パイプ 42
4.3 ソケット 44
4.3.1 System V のプロセス間通信メカニズム 44
4.3.2 メッセージキュー 44
4.3.3 セマフォ 45
4.3.4 共有ストレージ 47
第 5 章 PCI 49
5.1 PCI アドレス空間 49
5.2 PCI 構成ヘッダー 50
5.3 PCI I/O とストレージのアドレス空間 51
5.4 PCI-ISA ブリッジ 51
5.5 PCI-PCI ブリッジ 51
5.5.1 PCI-PCI ブリッジ: PCI I/O およびストレージ アドレス
スペース 51 への窓
5.5.2 PCI-PCI ブリッジ: PCI コンフィギュレーション サイクルと PCI
バス番号 52
5.6 Linux PCI の初期化 53
5.6.1 Linux カーネルの PCI データ構造 53
5.6.2 PCI デバイスドライバー 53
5.6.3 PCI BIOS 機能 56
5.6.4 PCI 補正プロセス 57
第 6 章 割り込み処理とデバイスドライバ 60
6.1 割り込みと割り込み処理 60
6.1.1 プログラマブル割り込みコントローラ 61
6.1.2 割り込み処理データ構造体の初期化 61
6.1.3 割り込み処理 62
6.2 デバイスドライバー 63
6.2.1 テストと中断 64
6.2.2 ダイレクト メモリ アクセス (DMA) 65
6.2.3 メモリ 66
6.2.4 デバイスドライバーとカーネル間のインターフェース 66
6.2.5 ハードディスク 69
6.2.6 ネットワーク機器 74
第 7 章 ファイル システム 77
7.1 第二の拡張ファイルシステム EXT2 78
7.1.1 EXT2 システムの i ノード 79
7.1.2 EXT2 システム 80 のスーパーブロック
7.1.3 EXT2 システムのグループ記述子 80
7.1.4 EXT2 システムのディレクトリ 81
7.1.5 EXT2 ファイル システムでのファイルの検索 81
7.1.6 EXT2 ファイルシステム内のファイルの変更
サイズ 82
7.2 仮想ファイルシステム 83
7.2.1 VFS ファイルシステムのスーパーブロック 84
7.2.2 VFS ファイルシステムの i ノード 84
7.2.3 ファイルシステムの登録 85
7.2.4 ファイルシステムの構築 85
7.2.5 仮想ファイルシステム内のファイルの検索 87
7.2.6 ファイルシステムのアンマウント 87
7.2.7 VFS ファイルシステムの Inode キャッシュ 87
7.2.8 ディレクトリキャッシュ 88
7.3 バッファキャッシング 88
7.3.1 bdflush カーネルデーモン 90
7.3.2 更新プロセス 90
7.4 /proc ファイルシステム 91
7.5 特殊デバイスファイル 91
第8章 ネットワーク 92
8.1 TCP/IPネットワークの概要 92
8.2 Linux 95 の TCP/IP ネットワーク階層
8.3 BSDソケットインターフェース 96
8.4 INET のソケット層 97
8.4.1 BSD ソケットの作成 98
8.4.2 INET BSD ソケット 99 のバインディング アドレス
8.4.3 INET BSD ソケット接続の確立 99
8.4.4 INET BSD ソケット リスニング 100
8.4.5 接続要求の受け入れ 100
8.5 IP層100
8.5.1 ソケットバッファ100
8.5.2 IP メッセージの受信 101
8.5.3 IP パケットの送信 102
8.5.4 データシャーディング102
8.6 アドレス解決プロトコル 103
8.7 IPルーティング104
第 9 章 カーネルのメカニズムとモジュール 107
9.1 カーネルメカニズム 107
9.1.1 下半分のコントロール 107
9.1.2 タスクキュー108
9.1.3 タイマー 109
9.1.4 待ち行列110
9.1.5 スピンロック 110
9.1.6 セマフォ 110
9.2 モジュール 111
9.2.1 モジュールのロード 112
9.2.2 モジュールのアンインストール 113
第 10 章 プロセッサ 115
10.1X86 115
10.2 アーム 115
10.3 アルファ AXP プロセッサ 115
第 11 章 Linux カーネルのソースコード 117
11.1 Linux カーネルソースコードの入手方法 117
11.2 カーネルソースコードの整理 117
11.3 どこから始めるべきか 118
第 12 章 Linux データ構造 120
付録 A 便利な Web サイトおよび FTP サイト 138
付録 B 用語集 139
第 2 部 Linux カーネル モジュール プログラミング ガイド 謝辞 序章 第 1 章 Hello, World 145
1.1 カーネルモジュールの Makefile 146
1.2 マルチファイルカーネルモジュール 147
第 2 章 キャラクタデバイスファイル 149
第 3 章 /proc ファイル システム 158
第 4 章 入力に /proc を使用する 162
第 5 章 入力用のデバイス ファイルの使用 170
第 6 章 起動パラメータ 182
第 7 章 システムコール 185
第 8 章 ブロッキングの処理 190
第 9 章 printk の置き換え 199
第 10 章 タスクのスケジュール設定 202
第 11 章 割り込みハンドラ 207
第 12 章 対称型マルチプロセッシング 211
第 13 章 よくある間違い 212
付録 A 2.0 と 2.2 の相違点 213
付録 B その他のリソース 214
付録 C 評価を与える 215
第 3 部 Linux プログラマーズ ガイド 第 1 章 Linux オペレーティング システム 219
第 2 章 Linux カーネル 220
第 3 章 Linux libc パッケージ 221
第 4 章 システムコール 222
第 5 章「スイスアーミーナイフ」: ioctl 223
第 6 章 Linux プロセス間通信 224
6.1 はじめに 224
6.2 半二重 Unix パイプ 224
6.2.1 基本概念 224
6.2.2 C言語でパイプラインを作成する 225
6.2.3 簡単な方法 229
6.2.4 パイプ上のアトミック操作 233
6.2.5 半二重パイプに関するいくつかの注意事項
第233号
6.3 名前付きパイプ 234
6.3.1 基本概念 234
6.3.2 FIFO 234 の作成
6.3.3 FIFO 動作 235
6.3.4 FIFO 236 でのブロック動作
6.3.5 SIGPIPE 信号 237
6.4 システム V IPC 237
6.4.1 基本概念 237
6.4.2 メッセージキュー239
6.4.3 セマフォ 251
6.4.4 semtool: 対話型セマフォ操作
プログラム260
6.4.5 共有メモリ 267
第 7 章 サウンドプログラミング 274
7.1 内蔵スピーカーのプログラミング 274
7.2 サウンドカードのプログラミング 274
第8章 キャラクターユニットグラフィックス 276
8.1 libc 277 の I/O 関数
8.1.1 フォーマットされた出力 277
8.1.2 フォーマットされた入力 278
8.2 termcap ライブラリ 278
8.2.1 序文 278
8.2.2 端末の説明の取得 279
8.2.3 端末の説明を表示する 279
8.2.4 termcap の機能 280
8.3 Ncurses 280 の概要
8.4 初期化 282
8.5 Windows 283
8.6 出力284
8.6.1 フォーマットされた出力 285
8.6.2 文字の挿入/行 286
8.6.3 文字/行の削除 286
8.6.4 ボックスとライン 287
8.6.5 背景文字 287
8.7 入力 288
8.8 オプション 289
8.8.1 出力オプション 289
8.8.2 入力オプション 290
8.8.3 端末のプロパティ 291
8.8.4 オプションの使用 291
8.9 端末 292 を更新する
8.10 ビデオのプロパティと色 293
8.11 カーソルと画面の座標 294
8.12 ローリング 294
8.13 キーパッド 295
8.14 ソフトタグ 295
8.15 その他 295
8.16 低レベルアクセス 296
8.17 スクリーンダンプ 296
8.18 Termcap シミュレーション 296
8.19 Terminfo関数 296
8.20 デバッグ機能 297
8.21 Terminfo の機能 297
8.21.1 ブール演算機能 297
8.21.2 数値的機能 298
8.21.3 文字列機能 299
8.22 [N]Curses 関数の概要 306
第 9 章 I/O ポートのプログラミング 307
9.1 マウスプログラミング 307
9.2 モデムプログラミング 308
9.3 プリンタのプログラミング 308
9.4 ジョイスティックプログラミング 308
第 10 章 アプリケーションの Linux への移植 309
10.1 はじめに 309
10.2 信号処理 309
10.2.1 SVR4、BSD、および POSIX.1 のもとで
シグナル310
10.2.2 Linux 信号オプション 310
10.2.3 Linux 310 でのシグナル
10.2.4 Linux 311 でサポートされるシグナル
10.3 端末 I/O 311
10.4 プロセス情報と制御 311
10.4.1 kvmプロセス312
10.4.2 ptrace および /proc ファイル システム 312
10.4.3 Linux 312 でのプロセス制御
10.5 移植可能な条件付きコンパイル 313
10.6 補足説明 314
付録 アルファベット順システムコール 315
第 4 部 Linux カーネル概念の概要 システム構造 323
序文 324
第 1 章 システム構成 325
1.1 システム概要 325
1.2 カーネル 325 の目標
1.3 カーネル構造の概要 325
1.4 複数の開発者のサポート 327
1.5 システムデータ構造 328
1.5.1 タスクリスト 328
1.5.2 メモリマッピング 328
1.5.3 インデックスノード 328
1.5.4 データ接続 329
第 2 章 サブシステムのシステム構成 330
2.1 プロセススケジューラのシステム構造 330
2.1.1 目標 330
2.1.2 モジュール 330
2.1.3 データ式 331
2.1.4 依存関係、データ フローおよび制御フロー 331
2.2 メモリマネージャシステム構造 331
2.2.1 目標 331
2.2.2 モジュール 331
2.2.3 データ表現 331
2.2.4 データフロー、制御フローおよび依存関係 332
2.3 仮想ファイルシステムのシステム構造 333
2.3.1 目標 333
2.3.2 モジュール 333
2.3.3 データ表現 333
2.3.4 データフロー、制御フローおよび依存関係 334
2.4 ネットワークインターフェースシステム構造 334
2.4.1 目標 334
2.4.2 モジュール 334
2.4.3 データ表現 335
2.4.4 データフロー、制御フローおよび依存関係 335
2.5 プロセス間通信システムの構造 335
第 3 章 結論 336
付録 A 用語の定義 337
付録 B 参考資料 338
第 5 部 Linux カーネルの具体的なシステム構造の概要 341
第 1 章 序文 342
1.1 目標 342
1.2 Linux 342 の概要
1.3 ソフトウェアシステム構造の背景知識 342
1.4 方法とアプローチ 343
1.5 本書の対象読者 344
1.6 このパートの章構成 344
第 2 章 システム構成 345
第 3 章 サブシステム構造 346
3.1 プロセススケジューラ 346
3.1.1 目標 346
3.1.2 外部インターフェース 346
3.1.3 サブシステムの説明 346
3.1.4 データ構造 347
3.1.5 サブシステム構造 348
3.1.6 サブシステムの依存関係 348
3.2 メモリマネージャー 348
3.2.1 目標 348
3.2.2 外部インターフェース 349
3.2.3 サブシステムの説明 349
3.2.4 データ構造350
3.2.5 サブシステム構造350
3.2.6 サブシステムの依存関係 351
3.3 仮想ファイルシステム 352
3.3.1 目標 352
3.3.2 外部インターフェース 352
3.3.3 サブシステムの説明 353
3.3.4 デバイスドライバー 353
3.3.5 論理ファイルシステム 354
3.3.6 モジュール 354
3.3.7 データ構造 355
3.3.8 サブシステム構造 355
3.3.9 サブシステムの依存関係 355
3.4 プロセス間通信 355
3.4.1 目標 355
3.4.2 外部インターフェース 357
3.4.3 サブシステムの説明 357
3.4.4 データ構造 358
3.4.5 サブシステム構造 359
3.4.6 サブシステムの依存関係 359
3.5 ネットワークインターフェース360
3.5.1 目標 360
3.5.2 外部インターフェース 361
3.5.3 サブシステムの説明 361
3.5.4 データ構造 362
3.5.5 サブシステム構造 363
3.5.6 サブシステムの依存関係 363
第 4 章 結論 365
付録 A 用語の定義 366
付録 B 参考資料 368
第 6 部 付録 付録 A Linux ドキュメント プロジェクト コピー ライセンス 372
付録 B GNU 一般公衆利用許諾書 374
拡大する