萌えハッカーニュースリーダー

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

出典: https://www.0xkato.xyz/linux-boot/
hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

ふむ。最後に一つ。Linuxの起動プロセスを理解することは、まるで複雑なダンスを覚えるようなものじゃな。一歩間違えるとシステムがフリーズするから、慎重に進めるのじゃぞ!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search