詳解 Linuxカーネル 第2版

[cover photo]
  • 2003年06月 発行
  • 892ページ
  • ISBN4-87311-133-1
  • フォーマット
  • 原書: Understanding the Linux Kernel, 2nd Edition

この商品は品切れ再入荷未定です

Linuxのソースコードは誰でも目にすることができます。本書はこの恩恵を最大限に活かすための羅針盤です。実際に大学で使われている講義ノートを基に書かれたもので、複雑で難解なLinuxカーネルの仕組みを基礎からていねいに説明しています。Linuxカーネルの基本機能を網羅し、ハードウェア依存部分についても踏み込んだ解説がされています。また、日本語版ではLinux2.6の情報を追加、Linuxの最新機能を概観することもできます。Linuxのソースコードを理解する上でのガイドブックして、オペレーティングシステムの本格的な解説書として最適の一冊です。

関連書籍

詳解 Linuxカーネル 第3版

監訳者まえがき
はじめに

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.4     ハードウェアのページング機構
        2.5     Linuxのページング機構

3章      プロセス
        3.1     プロセス、ライトウェイトプロセス、スレッド
        3.2     プロセスディスクリプタ
        3.3     プロセス切り替え
        3.4     プロセスの生成
        3.5     プロセスの破棄
        3.6     Linux 2.6では

4章      割り込みと例外
        4.1     割り込み信号の役割
        4.2     割り込みと例外
        4.3     例外および割り込み処理のネスト
        4.4     割り込みディスクリプタテーブルの初期化
        4.5     例外処理
        4.6     割り込み処理
        4.7     ソフト割り込み、タスクレット、ボトムハーフ
        4.8     割り込みおよび例外からの復帰
        4.9     Linux 2.6では

5章      カーネルの同期処理
        5.1     カーネル実行パス
        5.2     同期の必要がない場合
        5.3     同期プリミティブ
        5.4     カーネルデータアクセスの同期
        5.5     競合状態回避の例
        5.6     Linux 2.6では

6章      時間管理
        6.1     ハードウェアクロック
        6.2     時間管理の仕組み
        6.3     CPUのタイムシェアリング(時分割)
        6.4     時刻と日付の更新
        6.5     統計情報の更新
        6.6     ソフトウェアタイマ
        6.7     時間管理関連のシステムコール
        6.8     Linux 2.6では

7章      メモリ管理
        7.1     ページフレームの管理
        7.2     メモリ領域の管理
        7.3     非連続メモリ領域の管理
        7.4     Linux 2.6では

8章      プロセスアドレス空間
        8.1     プロセスのアドレス空間
        8.2     メモリディスクリプタ
        8.3     メモリリージョン
        8.4     ページフォルト例外ハンドラ
        8.5     プロセスアドレス空間の生成と削除
        8.6     ヒープ領域の管理
        8.7     Linux 2.6では

9章      システムコール
        9.1     POSIX APIとシステムコール
        9.2     システムコールハンドラとシステムコールサービスルーチン
        9.3     カーネルラッパールーチン
        9.4     Linux 2.6では

10章     シグナル
        10.1    シグナルの役割
        10.2    シグナルの生成
        10.3    シグナルの配信
        10.4    シグナル処理関連のシステムコール
        10.5    Linux 2.6では

11章     プロセススケジューリング
        11.1    スケジューリングポリシー
        11.2    スケジューリングアルゴリズム
        11.3    スケジューリング関連のシステムコール
        11.4    Linux 2.6では

12章     仮想ファイルシステム(VFS)
        12.1    仮想ファイルシステム(VFS)の役割
        12.2    VFSデータ構造
        12.3    ファイルシステム種別
        12.4    ファイルシステムのマウント
        12.5    パス名の検索
        12.6    VFSシステムコールの実装
        12.7    ファイルロック
        12.8    Linux 2.6では

13章     I/Oデバイスの管理
        13.1    I/Oアーキテクチャ
        13.2    デバイスファイル
        13.3    デバイスドライバ
        13.4    ブロック型デバイスドライバ
        13.5    キャラクタ型デバイスドライバ
        13.6    Linux 2.6では

14章     ディスクキャッシュ
        14.1    ページキャッシュ
        14.2    バッファキャッシュ
        14.3    Linux 2.6では

15章     ファイルアクセス
        15.1    ファイルの読み取りと書き込み
        15.2    メモリマッピング
        15.3    ダイレクトI/O転送
        15.4    Linux 2.6では

16章     スワップ処理:メモリ解放の方法
        16.1    スワップ処理とは何か
        16.2    スワップ領域
        16.3    スワップキャッシュ
        16.4    スワップページの転送
        16.5    ページのスワップアウト
        16.6    ページのスワップイン
        16.7    ページフレームの回収
        16.8    Linux 2.6では

17章     Ext2、Ext3ファイルシステム
        17.1    Ext2の一般的な特徴
        17.2    Ext2ディスク上のデータ構造
        17.3    Ext2メモリ上のデータ構造
        17.4    Ext2ファイルシステムの作成
        17.5    Ext2関数
        17.6    Ext2ディスク領域の管理
        17.7    Ext3ファイルシステム
        17.8    Linux 2.6では

18章     ネットワーク
        18.1    主要なネットワークデータ構造
        18.2    ネットワーク関連のシステムコール
        18.3    ネットワークカードへのパケット送信処理
        18.4    ネットワークカードからのパケット受信処理
        18.5    Linux 2.6では

19章     プロセス間通信
        19.1    パイプ     
        19.2    FIFO(名前付きパイプ)
        19.3    System VのIPC
        19.4    Linux 2.6では

20章     プログラムの実行
        20.1    実行ファイル
        20.2    実行形式
        20.3    実行ドメイン
        20.4    Exec関数
        20.5    Linux 2.6では

付録A     システムの起動
        A.1     先史時代:BIOS
        A.2     古代:ブートローダ
        A.3     中世:setup()関数
        A.4     ルネッサンス:startup_32()関数
        A.5     近世:start_kernel()関数

付録B     モジュール
        B.1     モジュールにすべきか?
        B.2     モジュールの実装
        B.3     モジュールの組み込みと削除
        B.4     オンデマンドなモジュール組み込み

付録C     ソースコードの構造

参考文献
ソースコード索引
索引

ここで紹介する正誤表には、書籍発行後に気づいた誤植や更新された情報を掲載しています。以下のリストに記載の年月は、正誤表を作成し、増刷書籍を印刷した月です。お手持ちの書籍では、すでに修正が施されている場合がありますので、書籍最終ページの奥付でお手持ちの書籍の刷版、刷り年月日をご確認の上、ご利用ください。

1刷正誤表

詳解 Linuxカーネル 第2版 第1刷正誤表

2005年3月9日更新

位置
p44
2行目
セグメントセレクタを指しています。
セグメントセレクタに指されています。
p71
箇条書き2番目の●
0xc00000000から0xffffffffまでの
0xc0000000から0xffffffffまでの
(※0が1つ多い)
p82
下から7行目
IBM最近リリースした
IBM最近リリースした
p101
下から13行目
thread_struct型のtreadというメンバがあります
thread_struct型のthreadというメンバがあります
p190
7行目
rwlpアドレスに対して書き込み用ロック処理を行います
rwlpアドレスに対して読み込み用ロック処理を行います
p225
下から11行目
counterが0よりも小さくなると
counterが0以下になると
p229
下から3段落目の1行目
タイマの実装は比較的簡単です。タイマの実装は比較的簡単です。
タイマの実装は比較的簡単です。
(同じ文章が2回出現。2番目を削除)
p232
下から7行目
indexメンバは現在走査中のリストを指しており、256^(i-1) tickごとに1ずつ増 加します
indexメンバは現在走査中のリストを指しており、256*64^(i-2) tickごとに1ずつ 増加します
※原著者による修正
p239
2行目
上記ポリシーのインターバルタイマをで実装するために
上記ポリシーのインターバルタイマ実装するために
p291
2行目
__get_free_pages()page_alloc()はバディシステムからページを獲得します。
__get_free_pages()alloc_pages()はバディシステムからページを獲得します。
※原著者による修正
p300
7行目
read-blackツリー
red-blackツリー
p300
下から2行目
read-backツリー
red-blackツリー
p322
19-20行目
このため、一時的に無駄なページが載った
このため、ある一時点において使われていないページが載った
p395
ページ中央
スケジューラが遅延実行されたとき、schedule()関数はカレントプロセスの need_reschedメンバもクリアします。
スケジューラが遅延実行されたとき、schedule()関数prevが指すプロセスの need_reschedメンバもクリアします。
※原著者による修正
p396
脚注
nice0であれば
nice-20であれば
p401
下から16行目
idle=pooを渡すことにより
idle=pollを渡すことにより
p424
10行目

12.4 ファイルシステムのマウントを参照
12.3.2 ファイルシステム種別の登録を参照
p542
8行目
14.1.1 バッファヘッドのデータ構造
14.2.1 バッファヘッドのデータ構造
p547
9行目

inode_remove_queue()関数は、バッファヘッドをそのバッファヘッドが登録されているリストから外します。
remove_inode_queue()関数は、バッファヘッドをそのバッファヘッドが登録されているリストから外します。
※原著者による修正
p648
5段落目

クリティカル資源
クリティカル資源
p650
9行目

Linux 2.6ではは
Linux 2.6で
p664
9行目

一方、動的モードでは、バッファキャッシュはファイルをオープンしていてもメ モリが不足してくるとshrink_caches()関数によって勝手に解放されます (shrink_caches()関数によってキャッシュから削除されるデータはディスクへ と書き込まれます)。ただし、iノードの場合はオープン中のものは解放されま せん
一方、動的モードでは、バッファキャッシュはファイルをオープンしていてもメ モリが不足してくるとshrink_caches()関数によって勝手に解放されます。
※原著者による修正、括弧以降を削除
p693
脚注

他にもTLIはSystem V
他にもSystem V
p699
17行目

単に読み出すことができます。
単に読み出すことができます。
p705
下から3行目
ただし、ユーザモードプログラムがIPADDR_ANY(0.0.0.0)という特殊なIPアドレスを渡した場合には、カーネルは送信者のIPアドレスの割り当てを行います。
ただし、ユーザモードプログラムがINADDR_ANY(0.0.0.0)という特殊なIPアドレスを渡した場合には、カーネルは送信者のIPアドレスの割り当てを行います†(訳者注:Linux実装では、この時点では送信者のIPアドレスを決定しません。パケットに付与する送信元IPアドレスは送信処理時に動的に決定します)
p736
図19-1
semid_ds構造体
sem_array構造体
p822
4-5項目め、10-11項目目

include/linux/list.h..........89l
include/linux/list.h..........89
p822
6-8項目め

include/linux/list.h..........90l
include/linux/list.h..........90
p822
下から6項目め

include/asm-i386/softirq.h..........203l
include/asm-i386/softirq.h..........203

ここで紹介する正誤表には、書籍発行後に気づいた誤植や更新された情報を掲載しています。以下のリストに記載の年月は、正誤表を作成し、増刷書籍を印刷した月です。お手持ちの書籍では、すでに修正が施されている場合がありますので、書籍最終ページの奥付でお手持ちの書籍の刷版、刷り年月日をご確認の上、ご利用ください。

2刷正誤表

詳解 Linuxカーネル 第2版 第2刷正誤表

2005年3月9日更新

位置
p44
2行目
セグメントセレクタを指しています。
セグメントセレクタに指されています。
p82
下から7行目
IBM最近リリースした
IBM最近リリースした
p101
下から13行目
thread_struct型のtreadというメンバがあります
thread_struct型のthreadというメンバがあります
p225
下から11行目
counterが0よりも小さくなると
counterが0以下になると
p232
下から7行目
indexメンバは現在走査中のリストを指しており、256^(i-1) tickごとに1ずつ増 加します
indexメンバは現在走査中のリストを指しており、256*64^(i-2) tickごとに1ずつ 増加します
※原著者による修正
p239
2行目
上記ポリシーのインターバルタイマをで実装するために
上記ポリシーのインターバルタイマ実装するために
p291
2行目
__get_free_pages()page_alloc()はバディシステムからページを獲得します。
__get_free_pages()alloc_pages()はバディシステムからページを獲得します。
※原著者による修正
p300
7行目
read-blackツリー
red-blackツリー
p300
下から2行目
read-backツリー
red-blackツリー
p322
19-20行目
このため、一時的に無駄なページが載った
このため、ある一時点において使われていないページが載った
p395
ページ中央
スケジューラが遅延実行されたとき、schedule()関数はカレントプロセスの need_reschedメンバもクリアします。
スケジューラが遅延実行されたとき、schedule()関数prevが指すプロセスの need_reschedメンバもクリアします。
※原著者による修正
p396
脚注
nice0であれば
nice-20であれば
p401
下から16行目
idle=pooを渡すことにより
idle=pollを渡すことにより
p424
10行目

12.4 ファイルシステムのマウント」を参照
12.3.2 ファイルシステム種別の登録」を参照
p542
8行目
14.1.1 バッファヘッドのデータ構造
14.2.1 バッファヘッドのデータ構造
p547
9行目

inode_remove_queue()関数は、バッファヘッドをそのバッファヘッドが登録されているリストから外します。
remove_inode_queue()関数は、バッファヘッドをそのバッファヘッドが登録されているリストから外します。
※原著者による修正
p664
9行目

一方、動的モードでは、バッファキャッシュはファイルをオープンしていてもメ モリが不足してくるとshrink_caches()関数によって勝手に解放されます (shrink_caches()関数によってキャッシュから削除されるデータはディスクへ と書き込まれます)。ただし、iノードの場合はオープン中のものは解放されま せん
一方、動的モードでは、バッファキャッシュはファイルをオープンしていてもメ モリが不足してくるとshrink_caches()関数によって勝手に解放されます。
※原著者による修正、括弧以降を削除
p693
脚注

他にもTLIはSystem V
他にもSystem V
p699
17行目

単に読み出すことができます。
単に読み出すことができます。
p705
下から3行目
ただし、ユーザモードプログラムがIPADDR_ANY(0.0.0.0)という特殊なIPアドレスを渡した場合には、カーネルは送信者のIPアドレスの割り当てを行います。
ただし、ユーザモードプログラムがINADDR_ANY(0.0.0.0)という特殊なIPアドレスを渡した場合には、カーネルは送信者のIPアドレスの割り当てを行います†(訳者注:Linux実装では、この時点では送信者のIPアドレスを決定しません。パケットに付与する送信元IPアドレスは送信処理時に動的に決定します)
p736
図19-1
semid_ds構造体
sem_array構造体

ここで紹介する正誤表には、書籍発行後に気づいた誤植や更新された情報を掲載しています。以下のリストに記載の年月は、正誤表を作成し、増刷書籍を印刷した月です。お手持ちの書籍では、すでに修正が施されている場合がありますので、書籍最終ページの奥付でお手持ちの書籍の刷版、刷り年月日をご確認の上、ご利用ください。

3刷正誤表

詳解 Linux カーネル第2版 第3刷正誤表

2005年3月9日更新

位置
p44
2行目
セグメントセレクタを指しています。
セグメントセレクタに指されています。
p225
下から11行目
counterが0よりも小さくなると
counterが0以下になると
p232
下から7行目
indexメンバは現在走査中のリストを指しており、256^(i-1) tickごとに1ずつ増 加します
indexメンバは現在走査中のリストを指しており、256*64^(i-2) tickごとに1ずつ 増加します
※原著者による修正
p239
2行目
上記ポリシーのインターバルタイマをで実装するために
上記ポリシーのインターバルタイマ実装するために
p291
2行目
__get_free_pages()page_alloc()はバディシステムからページを獲得します。
__get_free_pages()alloc_pages()はバディシステムからページを獲得します。
※原著者による修正
p300
7行目
read-blackツリー
red-blackツリー
p300
下から2行目
read-backツリー
red-blackツリー
p322
19-20行目
このため、一時的に無駄なページが載った
このため、ある一時点において使われていないページが載った
p395
ページ中央
スケジューラが遅延実行されたとき、schedule()関数はカレントプロセスの need_reschedメンバもクリアします。
スケジューラが遅延実行されたとき、schedule()関数prevが指すプロセスの need_reschedメンバもクリアします。
※原著者による修正
p396
脚注
nice0であれば
nice-20であれば
p542
8行目
14.1.1 バッファヘッドのデータ構造
14.2.1 バッファヘッドのデータ構造
p547
9行目

inode_remove_queue()関数は、バッファヘッドをそのバッファヘッドが登録されているリストから外します。
remove_inode_queue()関数は、バッファヘッドをそのバッファヘッドが登録されているリストから外します。
※原著者による修正
p664
9行目

一方、動的モードでは、バッファキャッシュはファイルをオープンしていてもメ モリが不足してくるとshrink_caches()関数によって勝手に解放されます (shrink_caches()関数によってキャッシュから削除されるデータはディスクへ と書き込まれます)。ただし、iノードの場合はオープン中のものは解放されま せん
一方、動的モードでは、バッファキャッシュはファイルをオープンしていてもメ モリが不足してくるとshrink_caches()関数によって勝手に解放されます。
※原著者による修正、括弧以降を削除
p699
17行目

単に読み出すことができます。
単に読み出すことができます。
p705
下から3行目
ただし、ユーザモードプログラムがIPADDR_ANY(0.0.0.0)という特殊なIPアドレスを渡した場合には、カーネルは送信者のIPアドレスの割り当てを行います。
ただし、ユーザモードプログラムがINADDR_ANY(0.0.0.0)という特殊なIPアドレスを渡した場合には、カーネルは送信者のIPアドレスの割り当てを行います†(訳者注:Linux実装では、この時点では送信者のIPアドレスを決定しません。パケットに付与する送信元IPアドレスは送信処理時に動的に決定します)
p736
図19-1
semid_ds構造体
sem_array構造体

ここで紹介する正誤表には、書籍発行後に気づいた誤植や更新された情報を掲載しています。以下のリストに記載の年月は、正誤表を作成し、増刷書籍を印刷した月です。お手持ちの書籍では、すでに修正が施されている場合がありますので、書籍最終ページの奥付でお手持ちの書籍の刷版、刷り年月日をご確認の上、ご利用ください。

4刷正誤表

詳解 Linuxカーネル 第2版 第4刷正誤表

2005年3月9日更新

位置
p232
下から7行目
indexメンバは現在走査中のリストを指しており、256^(i-1) tickごとに1ずつ増 加します
indexメンバは現在走査中のリストを指しており、256*64^(i-2) tickごとに1ずつ 増加します
※原著者による修正
p291
2行目
__get_free_pages()page_alloc()はバディシステムからページを獲得します。
__get_free_pages()alloc_pages()はバディシステムからページを獲得します。
※原著者による修正
p395
ページ中央
スケジューラが遅延実行されたとき、schedule()関数はカレントプロセスの need_reschedメンバもクリアします。
スケジューラが遅延実行されたとき、schedule()関数prevが指すプロセスの need_reschedメンバもクリアします。
※原著者による修正
p547
9行目

inode_remove_queue()関数は、バッファヘッドをそのバッファヘッドが登録されているリストから外します。
remove_inode_queue()関数は、バッファヘッドをそのバッファヘッドが登録されているリストから外します。
※原著者による修正
p664
9行目

一方、動的モードでは、バッファキャッシュはファイルをオープンしていてもメ モリが不足してくるとshrink_caches()関数によって勝手に解放されます (shrink_caches()関数によってキャッシュから削除されるデータはディスクへ と書き込まれます)。ただし、iノードの場合はオープン中のものは解放されま せん
一方、動的モードでは、バッファキャッシュはファイルをオープンしていてもメ モリが不足してくるとshrink_caches()関数によって勝手に解放されます。
※原著者による修正、括弧以降を削除

Feedback

皆さんのご意見をお聞かせください。ご購入いただいた書籍やオライリー・ジャパンへのご感想やご意見、ご提案などをお聞かせください。より良い書籍づくりやサービス改良のための参考にさせていただきます。
[feedbackページへ]