Vmlinux
続いて圧縮ルーチンを含めたカーネルイメージのブート用ルーチンのビルドが開始される。
(以下、x86アーキテクチャにおいて$(BITS)はビット数に読み替えてほしい)
カーネルの圧縮、カーネルイメージの伸長などに関するソースコードはarch/x86/boot/compressedに存在する。
arch/x86/boot/compressed/head_$(BITS).oはカーネルイメージのメモリアドレス前方に位置し、BIOSから得た低レベルなハードウェアの情報を処理するためのコードである。詳細はソースコードのarch/x86/boot/compressed/head_$(BITS).Sやそのエントリポイントstartup_$(BITS)、リンカスクリプトなどを参照せよ。
arch/x86/boot/compressed/misc.oは後方に位置するカーネル本体を含むコードをzlibなどのアルゴリズムを用いて伸長するコードである。有名なUncompressing Linux...というコンソールの表示はこの処理において見られる(実際の処理はアーキテクチャ毎に様々で、BIOSや起動直後のシステムが認識可能なメモリアドレスの制限のため、段階的に複雑なメモリ配置を行いこれを実現している。詳しくは、arch/x86/boot/compressed/misc.cのdecompress_kernelなどのキーワードを参考に処理内容を見てほしい)。
続いて、head_$(BITS).oからmisc.oが呼び出されその後続のデータとなっているカーネル本体が伸長される。伸長後はより複雑な処理となる。以降の処理内容は順に述べるのみとし、必要ならばソースコードを参照して欲しい。伸長済みのカーネル本体に処理を移すと、
ハードウェアの低レベル初期化
仮想記憶の有効化などを含むメモリ管理の開始
CPU認識と特定の処理実行、SMP関連の処理実行
ここまでは(インラインアセンブラを含む)アセンブラコードが多く含まれている。以降はアーキテクチャ非依存となる。
init/main.oのstart_kernel()に処理が移り
カーネルパラメータの解析
割り込み
メモリ管理システムの残部の起動
カーネルスレッドの起動、マルチタスク処理とスケジューラ起動
デバイスドライバの初期化
initrdのマウントとファイルシステムの初期化
"真の"ルートディレクトリのマウント
init起動準備 (以降の処理はユーザー空間)
を行い、システムのブートアップが完了する。