目次

訳者まえがき(初版)
訳者まえがき(第2版)
まえがき

1章 デバイスドライバ入門
	1.1 ドライバを書くという仕事
	1.2 カーネルの分割
	1.3 デバイスやモジュールのクラス
	1.4 セキュリティについて
	1.5 バージョン番号
	1.6 ライセンス
	1.7 カーネル開発コミュニティに参加する
	1.8 本書の構成

2章 モジュールの作成と実行
	2.1 モジュール対アプリケーション
		2.1.1 ユーザ空間とカーネル空間
		2.1.2 カーネル内の並行処理
		2.1.3 カレントプロセス
	2.2 コンパイルとロード
		2.2.1 カーネルのバージョンへの依存性
		2.2.2 プラットフォームへの依存性
	2.3 カーネルシンボルテーブル
	2.4 初期化とシャットダウン
		2.4.1 init_moduleにおけるエラー処理
		2.4.2 利用度数
		2.4.3 削除
		2.4.4 明示的な初期化とクリーンアップ用の関数
	2.5 リソースの使用
		2.5.1 I/OポートとI/Oメモリ
		2.5.2 Linux 2.4の場合のリソースの割り当て
	2.6 自動設定と手動設定
	2.7 ユーザ空間を使う
	2.8 後方互換性
		2.8.1 リソース管理に関する変更
		2.8.2 マルチプロセッサシステムの場合のコンパイル
		2.8.3 Linux 2.0におけるシンボルのエクスポート
		2.8.4 モジュール設定パラメータ
	2.9 クイックリファレンス

3章 キャラクタ型ドライバ
	3.1 scullの設計方針
	3.2 メジャー番号とマイナー番号
		3.2.1 メジャー番号の動的割り当て
		3.2.2 ドライバをOSから取り除く
		3.2.3 dev_tとkdev_t
	3.3 ファイル操作
	3.4 ファイル構造体
	3.5 openとrelease
		3.5.1 openメソッド
		3.5.2 releaseメソッド
	3.6 scullのメモリ利用
	3.7 競争状態に関する簡単な説明
	3.8 readとwrite
		3.8.1 readメソッド
		3.8.2 writeメソッド
		3.8.3 readvとwritev
	3.9 新しいデバイスで遊んでみましょう
	3.10 デバイスファイルシステム
		3.10.1 devfsを実際に使う
		3.10.2 移植性の問題とdevfs
	3.11 後方互換性
		3.11.1 file_operations構造体の変更
		3.11.2 モジュールの利用度数
		3.11.3 セマフォのサポートにおける変更
		3.11.4 ユーザ空間へのアクセスにおける変更
	3.12 クイックリファレンス

4章 デバッグのテクニック
	4.1 表示させてのデバッグ
		4.1.1 printk
		4.1.2 メッセージを記録する方法
		4.1.3 メッセージのオン、オフを切り替える
	4.2 問い合わせによるデバッグ
		4.2.1 /procファイルシステムを使う
		4.2.2 ioctlメソッドを使う
	4.3 観察によるデバッグ
	4.4 システムフォルトのデバッグ
		4.4.1 Oopsメッセージ
		4.4.2 OSのハングアップ
	4.5 デバッガと関連ツール
		4.5.1 gdbを使う
		4.5.2 kdbカーネルデバッガ
		4.5.3 統合カーネルデバッガパッチ
		4.5.4 kgdbパッチ
		4.5.5 カーネルクラッシュダンプアナライザ
		4.5.6 ユーザモードLinux
		4.5.7 Linux Trace Toolkit
		4.5.8 Dynamic Probes

5章 キャラクタ型ドライバの高度な機能
	5.1 ioctl
		5.1.1 ioctlコマンドの選び方
		5.1.2 戻り値
		5.1.3 あらかじめ定義されたコマンド
		5.1.4 ioctl引数の使い方
		5.1.5 互換性と制限される操作
		5.1.6 ioctlコマンドの実装
		5.1.7 ioctlを使わないデバイス制御
	5.2 I/Oのブロック
		5.2.1 スリープと目覚め
		5.2.2 待ち列についての詳しい考察
		5.2.3 リエントラントなコードを書く
		5.2.4 ブロックと非ブロック処理
		5.2.5 プログラム例:scullpipe
	5.3 pollとselect
		5.3.1 readやwriteとの相互作用
		5.3.2 背後にあるデータ構造
	5.4 非同期通知
		5.4.1 ドライバから見ると
	5.5 デバイスを位置付ける
		5.5.1 llseekの実装
	5.6 デバイスファイルでのアクセス制御
		5.6.1 1回だけオープンできるデバイス
		5.6.2 競争状態に関する余談
		5.6.3 同時にアクセスできるユーザを1人に制限する
		5.6.4 EBUSYに代わるブロックopen
		5.6.5 オープン時にデバイスをクローンする
	5.7 後方互換性
		5.7.1 Linux 2.2と2.0における待ち列
		5.7.2 非同期通知
		5.7.3 fsyncメソッド
		5.7.4 Linux 2.0におけるユーザ空間へのアクセス
		5.7.5 Linux 2.0における「能力」
		5.7.6 Linux 2.0のselectメソッド
		5.7.7 Linux 2.0におけるseek
		5.7.8 Linux 2.0とSMP
	5.8 クイックリファレンス

6章 時の流れ
	6.1 カーネル内の時間間隔
		6.1.1 プロセッサ固有のレジスタ
	6.2 現在時刻を知る方法
	6.3 実行を遅らせる
		6.3.1 長い遅延
		6.3.2 短い遅延
	6.4 タスク待ち列
		6.4.1 タスク待ち列の性質
		6.4.2 タスク待ち列が実行される様子
		6.4.3 あらかじめ定義されたタスク待ち列
		6.4.4 自前のタスク待ち列を実行する
		6.4.5 タスクレット
	6.5 カーネルタイマ
	6.6 後方互換性
	6.7 クイックリファレンス

7章 メモリの押さえ方
	7.1 kmallocの真実
		7.1.1 フラグ引数
		7.1.2 サイズ引数
	7.2 類似キャッシュ
		7.2.1 SLABキャッシュを使ったscull:scullc
	7.3 get_free_pageと仲間たち
		7.3.1 ページをまるごと使う:scullp
	7.4 vmallocとその仲間たち
		7.4.1 仮想アドレスを使うscull:scullv
	7.5 起動時の割り当て
		7.5.1 起動時に専用バッファを取得する
		7.5.2 bigphysareaパッチ
		7.5.3 上位RAMアドレスの予約
	7.6 後方互換性
	7.7 クイックリファレンス

8章 ハードウェア管理
	8.1 I/OポートとI/Oメモリ
		8.1.1 I/Oレジスタとコンベンショナルメモリ
	8.2 I/Oポートの使い方
		8.2.1 ストリング操作
		8.2.2 I/O処理の休止
		8.2.3 プラットフォーム依存性
	8.3 デジタルI/Oポートの使い方
		8.3.1 パラレルポートの概要
		8.3.2 サンプルドライバ
	8.4 I/Oメモリの使い方
		8.4.1 直接マッピングされるメモリ
		8.4.2 I/Oメモリでもshortを使ってみる
		8.4.3 ソフトウェアマッピングされるI/Oメモリ
		8.4.4 1MB未満のISAメモリ
		8.4.5 isa_readbと仲間たち
		8.4.6 ISAメモリを探索する
	8.5 後方互換性
	8.6 クイックリファレンス

9章 割り込み処理
	9.1 割り込み制御の概要
	9.2 パラレルポートの準備
	9.3 割り込みハンドラのインストール
		9.3.1 /procインタフェース
		9.3.2 IRQ番号の自動推定
		9.3.3 高速ハンドラと低速ハンドラ
	9.4 ハンドラを実装する
		9.4.1 引数を使う
		9.4.2 割り込みの有効化と無効化
	9.5 タスクレットと後半部の処理
		9.5.1 タスクレット
		9.5.2 BHメカニズム
		9.5.3 BHの後半部を作る
	9.6 割り込みの共有
		9.6.1 共有ハンドラのインストール
		9.6.2 ハンドラの実行
		9.6.3 /procインタフェース
	9.7 割り込み駆動I/O
	9.8 競争状態
		9.8.1 環状バッファを使う方法
		9.8.2 スピンロックを使う方法
		9.8.3 ロック変数を使う方法
		9.8.4 競争なしでスリープさせる
	9.9 後方互換性
		9.9.1 2.2のカーネルにおける相違点
		9.9.2 2.0のカーネルにおける相違点
	9.10 クイックリファレンス

10章 データの型と移植性
	10.1 標準Cの型
	10.2 データアイテムに明示的なサイズを割り当てる
	10.3 インタフェースに固有の型
	10.4 移植性に関するデータ型以外の問題
		10.4.1 時間間隔
		10.4.2 ページサイズ
		10.4.3 バイトオーダー
		10.4.4 データアラインメント
	10.5 リンクリスト
	10.6 クイックリファレンス

11章 kmodと高度なモジュール化
	11.1 モジュールのオンデマンドローディング
		11.1.1 カーネルにおけるモジュールの要求
		11.1.2 ユーザ空間側の問題
		11.1.3 モジュールのロードとセキュリティ
		11.1.4 モジュールのロード例
		11.1.5 ユーザモードのヘルパープログラムの実行
	11.2 モジュール間通信
	11.3 モジュール内のバージョン管理
		11.3.1 モジュールでバージョンサポートを使う
		11.3.2 バージョン付きシンボルのエクスポート
	11.4 後方互換性
	11.5 クイックリファレンス

12章 ブロック型ドライバをロードする
	12.1 ドライバの登録
	12.2 ヘッダファイルblk.h
	12.3 要求の処理:単純な例
		12.3.1 要求待ち列
		12.3.2 実際にデータ転送を行う
	12.4 要求の処理:詳細な例
		12.4.1 I/O要求待ち列
		12.4.2 クラスタ要求
		12.4.3 待ち列を複数持つブロック型ドライバ
		12.4.4 要求待ち列を使わない処理
	12.5 マウントとアンマウントの仕組み
	12.6 ioctlメソッド
	12.7 リムーバブルなデバイス
		12.7.1 メディア交換のチェック:check_media_change
		12.7.2 再評価:revalidate
		12.7.3 その他の注意
	12.8 パーティション分けできるデバイス
		12.8.1 汎用ハードディスク
		12.8.2 パーティションの検出
		12.8.3 initrdによるパーティションの検出
		12.8.4 spullのデバイスメソッド
	12.9 割り込み駆動のブロック型ドライバ
	12.10 後方互換性
	12.11 クイックリファレンス

13章 mmapとDMA
	13.1 Linuxでのメモリ管理
		13.1.1 アドレスの種別
		13.1.2 高位メモリと低位メモリ
		13.1.3 メモリマップとstruct page
		13.1.4 ページテーブル
		13.1.5 仮想メモリ領域(VMA)
	13.2 mmapデバイス操作
		13.2.1 remap_page_rangeの使用
		13.2.2 シンプルな実装例
		13.2.3 VMA操作の追加
		13.2.4 nopageを使ったメモリマッピング
		13.2.5 特定のI/O領域を再マッピングする
		13.2.6 RAMを再マッピングする
		13.2.7 仮想アドレスを再マッピングする
	13.3 kiobufインタフェース
		13.3.1 kiobuf構造体
		13.3.2 ユーザ空間バッファのマッピングとローI/O
	13.4 DMAとバスマスタリング
		13.4.1 DMA転送の概要
		13.4.2 DMAバッファの割り当て
		13.4.3 バスアドレス
		13.4.4 PCIバス上のDMA
		13.4.5 ISAデバイスのためのDMA
	13.5 後方互換性
		13.5.1 メモリ管理の変更
		13.5.2 DMAの変更
	13.6 クイックリファレンス

14章 ネットワークドライバ
	14.1 snullの設計方針
		14.1.1 IP番号の割り当て
		14.1.2 パケットの物理的な転送
	14.2 カーネルへの接続
		14.2.1 モジュールのロード
		14.2.2 各デバイスの初期化
		14.2.3 モジュールの削除
		14.2.4 モジュール化されたドライバとされていないドライバ
	14.3 net_device構造体の詳細
		14.3.1 見える部分
		14.3.2 見えない部分
	14.4 オープンとクローズ
	14.5 パケットの送信
		14.5.1 同時送信の制御
		14.5.2 送信タイムアウト
	14.6 パケットの受信
	14.7 割り込みハンドラ
	14.8 リンクステートの変更
	14.9 ソケットバッファ
		14.9.1 重要なフィールド
		14.9.2 ソケットバッファに作用する関数
	14.10 MACアドレスの解決
		14.10.1 EthernetでARPを使う
		14.10.2 ARPをオーバーライドする
		14.10.3 Ethernet以外のヘッダ
	14.11 カスタマイズされたioctlコマンド
	14.12 統計情報
	14.13 マルチキャスト
		14.13.1 カーネルによるマルチキャストサポート
		14.13.2 典型的な実装
	14.14 後方互換性
		14.14.1 Linux 2.2における相違点
		14.14.2 Linux 2.0における別の相違点
		14.14.3 自動検出とHAVE_DEVLIST
	14.15 クイックリファレンス

15章 ペリフェラルバスの概要
	15.1 PCIインタフェース
		15.1.1 PCIアドレッシング
		15.1.2 起動時
		15.1.3 レジスタの設定と初期化
		15.1.4 設定空間にアクセスする
		15.1.5 I/O空間とメモリ空間にアクセスする
		15.1.6 PCI割り込み
		15.1.7 ホットプラグ可能なデバイスの処理
		15.1.8 ハードウェア抽象化
	15.2 プレイバックISA
		15.2.1 ハードウェアリソース
		15.2.2 ISAプログラミング
		15.2.3  「プラグアンドプレイ」の仕様
	15.3 PC/104とPC/104+
	15.4 その他のPCバス
		15.4.1 MCA
		15.4.2 EISA
		15.4.3 VLB
	15.5 SBus
	15.6 NuBus
	15.7 外部バス
		15.7.1 USB
		15.7.2 USBドライバの作成
	15.8 後方互換性
	15.9 クイックリファレンス

16章 カーネルの森を歩く
	16.1 カーネル起動の仕組み
	16.2 起動の前に
	16.3 initプロセス
	16.4 kernelディレクトリ
	16.5 fsディレクトリ
	16.6 mmディレクトリ
	16.7 netディレクトリ
	16.8 ipcとlib
	16.9 includeとarch
	16.10 ドライバ
		16.10.1 drivers/char
		16.10.2 drivers/block
		16.10.3 drivers/ide
		16.10.4 drivers/md
		16.10.5 drivers/cdrom
		16.10.6 drivers/scsi
		16.10.7 drivers/net
		16.10.8 drivers/sound
		16.10.9 drivers/video
		16.10.10 drivers/input
		16.10.11 drivers/media
		16.10.12 バス固有のディレクトリ
		16.10.13 プラットフォーム固有のディレクトリ
		16.10.14 別のサブディレクトリ

参考文献
Linuxカーネルに関する文献
Linuxの設計と内部仕様に関する文献
索引



書籍についてのお問い合わせは以下までお願いします。

株式会社オライリー・ジャパン

〒160-0003 東京都新宿区本塩町7番地6 四谷ワイズビル
e-mail:japan@oreilly.com


書籍の購入方法トップページへ戻る