Linuxデバイスドライバ 第2版

[cover photo]
TOPICS
発行年月日
PRINT LENGTH
632
ISBN
4-87311-081-5
原書
Linux Device Drivers, 2nd Edition
FORMAT
Print
6,050円
この商品は品切れ再入荷未定です

本書は、Linuxのデバイスドライバについて、その仕組み、インストール方法、プログラミング方法、サンプルなど包括的な内容を体系的に解説する大ベストセラー書の待望の改訂版です。Linuxカーネル2.4に対応しています。Linux環境で周辺機器をサポートしなければならないシステム管理者やLinux対応ハードウェアの開発者必携の一冊です。

関連ファイル

目次

訳者まえがき(初版)
訳者まえがき(第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の設計と内部仕様に関する文献
索引