bzImage
bzImageはLinuxカーネルのvmlinuxを圧縮した形式のファイル。/boot/配下にvmlinuz-xxxとして置かれているのはこのbzImage形式のカーネル。
bzImageの構造
bzImageファイルの構造を図1に示す。bzImageはまず大きく分けて3つのファイルからなる。フロッピーからのBoot時に使われるブートセクタ用ファイルbootsect.o,低レベルの初期化を行うsetup.o,カーネルの圧縮イメージを格納したvmlinux.bin(*1)。これらの3つのファイルをarch/i386/boot/tools/buildコマンドにより結合してbzImageファイルを作成している。
図1 bzImageの構造
(*1) これらのファイルはカーネルコンパイル時にarch/i386/bootで作成されるので、ファイルの中身はこちらを参照。
bootsect.o
フロッピーからのBoot時に使われるブートセクタ用ファイル。この部分はセクタサイズと同じ512Byteとなる。カーネル2.6では、フロッピーからの直接起動は未サポートとなっており、bootsect.oもエラーメッセージを出力するだけとなっている。
setup.o
setup.oは低レベルの初期化を行うコードを含む。このコードは初期化が終わると、(bzImage形式の場合は)0x100000にジャンプしてメモリにロード済みのvmlinux.binのエントリルーチン(head.S::startup_32)に処理を移す。
この部分はbuildコマンドでファイルを結合する際にセクタサイズ(512)の倍数に切り上げられる。また、setup.o領域のセクタ数はbuild時にファイル先頭から497Byte目(つまり、bootsect.oの後ろの方)に書き込まれるようになっている。
vmlinux.bin
bzImage内のカーネルイメージvmlinux.binは圧縮したカーネルイメージの他にカーネルイメージを展開するコードを含む。これは以下のように作成される。
- カーネルソースツリーのTop(linux-2.6.xx-x/)にコンパイルされた未圧縮のカーネル(vmlinux)があるので、これをobjcopyでELF形式からBinary形式(vmlinux.bin)(*1)に変換する。
- vmlinux.binをgzipで圧縮してvmlinux.bin.gzを作成する。
- vmlinux.bin.gzを空オブジェクトpiggy.oのデータセクションに格納して、ELF形式のオブジェクトファイルにする。これは、以下で初期化/展開用のオブジェクトとリンクできるようにするため。
- piggy.oとカーネルデータを展開するためのhead.o,misc.oをリンクしてcompressed/vmlinux(*2)を作成する(*3)。
- objcopyでvmlinuxをbinary化してvmlinux.binを作成する。
(*2) カーネルファイルvmlinuxと同名だが別物なので注意。
(*3) Boot LoaderはbzImage形式のカーネルは0x100000(1MB)の位置にLoadingするので、リンク時には-Ttext 0x100000を指定してコードセクションが0x100000から始まるようにしている。setup.oは初期化を終えると0x100000にジャンプし、head.S::startup_32に処理が移る。ここから初期化、展開処理が始まる。