Linux Kernel(2.6)の実装に関するメモ書き

bzImage


Rev.3を表示中。最新版はこちら

bzImageはLinuxカーネルのvmlinuxを圧縮した形式のファイル。/boot/配下にvmlinuz-xxxとして置かれているのはこのbzImage形式のカーネル。

bzImageの構造

bzImageファイルの構造を図1に示す。bzImageはまず大きく分けて3つのファイルからなる。フロッピーからのBoot時に使われるブートセクタ用ファイルbootsect.o(*1),低レベルの初期化を行うsetup.o,カーネルの圧縮イメージを格納したvmlinux.bin(*2)。これらの3つのファイルをarch/i386/boot/tools/buildコマンドにより結合してbzImageファイルを作成している。

bootsect.oはセクタサイズに合わせて512Byteとなっている。setup.oはbuildコマンドでファイルを結合する際にセクタサイズ(512の倍数)に切り上げられる。


図1 bzImageの構造

(*1) 2.6ではフロッピーからの直接起動は未サポートとなっており、bootsect.oもエラーメッセージを出力しているだけとなっている。
(*2) これらのファイルはカーネルコンパイル時にarch/i386/bootで作成されるので、ファイルの中身はこちらを参照。


vmlinux.bin

bzImage内のカーネルイメージvmlinux.binは以下のように作成される。

  1. カーネルソースツリーのTop(linux-2.6.xx-x/)にコンパイルされか未圧縮のカーネル(vmlinux)があるので、これをobjcopyでELF形式からBinary形式(vmlinux.bin)(*1)に変換する。
  2. vmlinux.binをgzipで圧縮してvmlinux.bin.gzを作成する。
  3. vmlinux.bin.gzをpiggy.oのデータセクションに格納して、ELF形式のオブジェクトファイルにする。これは、初期化/展開用のオブジェクトとリンクできるようにするため。
  4. piggy.oとカーネルデータを展開するためのhead.o,misc.oをリンクしてcompressed/vmlinux(*2)を作成する。
  5. objcopyでvmlinuxをbinary化してvmlinux.binを作成する。


(*1) このvmlinux.binはarch/i386/boot/compressed/vmlinux.binでbzImageに結合されるrch/i386/boot/vmlinux.binではないので注意。
(*2) カーネルファイルvmlinuxと同名だが別物なので注意。


最終更新 2007/05/08 13:14:04 - kztomita
(2007/05/08 12:43:30 作成)
添付ファイル
bzimage.png - kztomita


リンク
最近更新したページ
検索