Linuxのブートプロセスを見る
ひさしぶりに"Linuxのブートプロセスを見る"が出たので購入した。前は、32ビットベースだったが、今回は64ビットベースになっている。10年ぶりの本なのでカーネルやブートローダは、Fedora17(kernel-3.3.4)ベースに更新されている。参考までに、RHEL6(kernel-2.6.32)とRHEL7(kernel-3.10)の間に相当する。
従来の版と変わらず起動プロセスに焦点を当てており、メモリマップ、APICおよびinitプロセスが主であり、マルチプロセッサやACPI、デバイスドライバおよびファイルシステム等は、記載から外れている。ここまで基本的なことを説明したのだから、後は各自補足するようにという意図なのかもしれない。
因みに書き方は、結構気まぐれに書いている。説明が丁寧かと思えば、すっ飛ばしていたりするし、ないよりははるかにましといった感じである。
- 第1章 ハードウェア
- 第2章 ブートローダからカーネル起動
- 第3章 圧縮カーネルの解凍
- 第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を使ってカーネルデバッグ
- 付録A アセンブラ命令一覧
- 網羅しているつもりもないと思うが、本文中に出てくるのに載っていない命令があった。
- iret
- syscall (1.5.3では文末にsyscalとtypoまた、308ページの索引でも同じ)
- 網羅しているつもりもないと思うが、本文中に出てくるのに載っていない命令があった。
新装改訂版 Linuxのブートプロセスをみる (アスキー書籍)
- 参考資料
- ソースコード
- ソースコード(解凍用カーネル)
- カーネル版数
- 記事
- 起動時のメモリ割り当て
- ページの初期化処理
- ELF
- msr-tools
- A20
- アセンブラ
- grub
- 参考文献