Linuxのブートプロセスを見る

ひさしぶりに"Linuxのブートプロセスを見る"が出たので購入した。前は、32ビットベースだったが、今回は64ビットベースになっている。10年ぶりの本なのでカーネルブートローダは、Fedora17(kernel-3.3.4)ベースに更新されている。参考までに、RHEL6(kernel-2.6.32)とRHEL7(kernel-3.10)の間に相当する。
従来の版と変わらず起動プロセスに焦点を当てており、メモリマップ、APICおよびinitプロセスが主であり、マルチプロセッサやACPI、デバイスドライバおよびファイルシステム等は、記載から外れている。ここまで基本的なことを説明したのだから、後は各自補足するようにという意図なのかもしれない。
因みに書き方は、結構気まぐれに書いている。説明が丁寧かと思えば、すっ飛ばしていたりするし、ないよりははるかにましといった感じである。

  • 第1章 ハードウェア
    • msr-toolsというツールがあることを知る。Fedoraの場合 /usr/sbin/rdmsr -x 0x10等とやるとMSRの情報を取得できる。このツールは、IntelOSSとして提供されている。
    • A20というアドレスラインの歴史を今頃知る。昔は、メモリが貴重な資源であり、その節約に苦労しており、その遺産が今も悩みの種となり続ける。今は、省電力なのだろうけど。
    • 基本フラットモデルと書くのは良いが、英語名も書いてほしい。(Basic Flat Model)書いてないとマニュアルで探すのが面倒である。
  • 第2章 ブートローダからカーネル起動
    • リアルモードから、プロテクトモードにCPUを設定し、Linuxの解凍用カーネルをメモリにマップするブートローダ
    • 以下のように分かれている。なおソースコードの位置は、grub 2.0.0でも行数がほぼ同じであった。
      • MBR
      • grub-core
        • core.imgファイルに該当する
        • grub-core/boot/i386/pc/diskboot.S等
        • ハードディスクからのロード
        • ハードウェアのチェックとプロテクトモードへの移行
        • イメージのロードの説明は、本文と図を関連付けるとありがたかった。
      • grub-kernel
  • 第3章 圧縮カーネルの解凍
    • 最終カーネルの解凍とCPUのプロテクトモードから64ビットモードへの移行を行うカーネル
    • 64ビットモードのページテーブルって、第4章のメモリアドレッシングの前にここで定義されたものがある。このため、全部で3種類のページテーブルがある。
    • 解凍モジュールもいろいろあり、gzip以外にもlzo等がある。本の上では、gzファイルだったのでgzipと記載したと思う。
  • 第4章 startup_64ルーチン
    • 64-bitのアドレスマップ(128ページ図4-1)を出してくれるのはよいが、それとの関係を書かずに129ページ図4-2をアドレスで説明したのはちょっとわかりにくいと思った。アドレスと一緒に、カーネルテキスト、物理メモリストレートマップ、ユーザプロセスの3つを説明したほうがわかりやすいと思う。129ページの図4-3も同様である。
    • 3.3.4リリース以降もメモリマップ自体意外と変更があるようで、ここ2年でも4度コミットがあることを知った。(3.17までの変更)意外と追跡することが必要なのかもしれない。
  • 第5章 start_kernel()とsetup_arch()
    • 第4章のアドレスマップがどこで変更されるかポイントしていなかったが、zap_identity_mapping()で変えられることがわかった。出来れば、第4章でポイントしてほしかった(探すのが大変。一度5.4節をずっと眺めていたがわからなかった)。
    • 起動時のメモリ割り当てに使われるmemblockについて調べた。memblockは、Logical memory block(lmb)というPowerPC起源のようである。
  • 第6章 割り込みの初期設定
  • 第7章 rest_init()とkernel_init()
  • 第8章 kernel_thread()
    • copy_process()は、initプロセスの関連が丁寧に説明してあるので、理解が進んだ。task_structのsiblingでプロセスをつないでいる等々図で説明されており役に立った。
    • プロセスの名前空間等まで記載してあり、コンテナとかの理解の足しになる。
  • 第9章 ユーザプロセスの起動とルートファイルシステムのマウント
  • 第10章 QEMUを使ってカーネルデバッグ
    • QemuでのgrubLinuxデバッグ概要を説明してあり役に立つ。
    • 10.4節は項目立てして説明してほしい。gdbのノウハウとそれ以外は分けないと見ずらい。
    • ソースコードの検索サイトが載っているのは良いのだが、検索できるURLを追記してほしい。
    • ソースコードがマクロ展開されている箇所を見るノウハウが文末に書いてあった。この手のノウハウは、なかなか伝授しにくいのが難点であるが、エレガントでなくても手法を公開したのは良いと思う。
  • 付録A アセンブラ命令一覧
    • 網羅しているつもりもないと思うが、本文中に出てくるのに載っていない命令があった。
      • iret
      • syscall (1.5.3では文末にsyscalとtypoまた、308ページの索引でも同じ)

新装改訂版 Linuxのブートプロセスをみる (アスキー書籍)