2025/10/25 23:04 The Linux Boot Process: From Power Button to Kernel

ロボ子、今日のニュースはLinuxの起動プロセスじゃ。電源投入からカーネルが動き出すまでの一連の流れを解説するぞ。

なるほど、ブートシーケンスですね。具体的にはどのような流れになるのでしょうか?

まずはCPUがリアルモードで動き出すんじゃ。リセットベクタ`0xFFFFFFF0`からBIOSかUEFIに制御が移るぞ。

BIOSとUEFIの違いは何ですか?

BIOSはPOST(Power-On Self-Test)を実行後、ブート可能なデバイスを探して、最初の512バイトをメモリにコピーするんじゃ。UEFIはファイルシステムを直接理解して、もっと大きなブートプログラムをロードできるぞ。

なるほど。そして、ブートローダーがカーネルをメモリにロードするのですね。

そうじゃ。GRUBみたいなブートローダーが、カーネルをメモリにロードする。カーネルファイルは、リアルモードで動く小さなセットアッププログラムと、圧縮されたカーネル本体を含んでるぞ。

セットアッププログラムは何をするんですか?

セットアッププログラムは、セグメントレジスタを調整したり、スタックを作ったり、BSSセクションをゼロでクリアしたりするんじゃ。ファームウェアからRAMの情報を取得したりもするぞ。

リアルモードからプロテクトモード、そしてロングモードへ移行するとのことですが、なぜ段階を踏む必要があるのですか?

リアルモードから直接ロングモードには行けないからじゃ。プロテクトモードを経由する必要があるんじゃな。プロテクトモードでは、GDT(Global Descriptor Table)とIDT(Interrupt Descriptor Table)を導入するぞ。

GDTとIDTはそれぞれ何をするものですか?

GDTはセグメントの情報を記述するテーブルで、IDTは割り込みハンドラのディレクトリじゃ。その後、割り込みを無効化して、A20ラインを開放し、GDTとIDTをロードして、CR0レジスタのPEビットをセットしてプロテクトモードへ移行するんじゃ。

そして、ロングモードへ。

ロングモードには、ページングの有効化とEFERレジスタのLMEビットの設定が必要じゃ。ページングは仮想アドレスと物理アドレスの変換を行う仕組みで、最初は仮想アドレスと物理アドレスが同じになるアイデンティティマップを使うぞ。

ページングについてもう少し詳しく教えてください。

ページングは、仮想アドレスを物理アドレスに変換する仕組みじゃ。PAEを有効にして、ページテーブルを作成し、EFERレジスタのLMEビットをセットして64ビットコードへ移行するんじゃ。

その後は、カーネルの展開と再配置が行われるのですね。

そうじゃ。64ビットスタブがカーネルを展開して再配置する。必要に応じて自身を安全な場所に移動し、最小限のIDTをロードして、`extract_kernel`関数がカーネルを展開するんじゃ。

`start_kernel`関数からカーネルの初期化が始まるのですね。

その通り!そして、kASLR (Kernel Address Space Layout Randomization)でカーネルのロードアドレスをランダム化してセキュリティを向上させるんじゃ。

kASLRはセキュリティにとって重要なのですね。

そうじゃな。さて、ロボ子。今日の講義はどうだったかのじゃ?

とても勉強になりました!Linuxの起動プロセスがよく理解できました。

ふむ。最後に一つ。Linuxの起動プロセスを理解することは、まるで複雑なダンスを覚えるようなものじゃな。一歩間違えるとシステムがフリーズするから、慎重に進めるのじゃぞ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。