Sunday, April 24, 2011

initrd.img, vmlinux, zImage, Image 的區別?

vmlinux 

(http://zh.wikipedia.org/wiki/Vmlinux)

  在linux系統中,vmlinux(vmlinuz)是一個包含linux kernel的靜態連結的執行檔,檔案型態可能是linux接受的執行檔格式之一(ELFCOFFa.out),vmlinux若要用於除錯時則必須要在開機前增加symbol table。

位置

  一般來說,核心的位置會在檔案系統的 root 目錄下,然而當 bootloader 必須使用 BIOS 的硬碟驅動程式,在一些i386的機器上必須要放在前 1024 個磁柱內。
  為了克服這個限制,Linux 發行版鼓勵使用者建立一個磁區用來存放 bootloader 與核心相關的開機檔案,例如 GRUB, LILO 與 SYSLINUX ... 。而這個磁區通常會掛載到系統的/boot 上,這是 FHS (Filesystem Hierarchy Standard) 標準內定義的。

Compression

  一般來說,當建立一個可啟動的核心時,此核心會先經過 zlib 演算法壓縮,而在核心內會包含一個相當小的解壓縮程式 stub,當 stub 解壓縮核心程式的時候會對 console 視窗印出"點"來表示解壓縮進度。
  解壓縮所花費的時間在開機時間中所佔程度來說其實是相當小的,而在早期的 bzImage 的發展中對於核心的大小會有所限制(特別是 i386 架構),在此情況下壓縮則是必須的。
  開機映像檔的名稱並不重要,通常習慣上稱為 vmlinuz 或 zImage。

bzImage

  隨著 linux Kernel 的成長,核心的內容日益增加超越了原本的限制大小。bzImage (big zImage) 格式則為了克服此缺點開始發展,利用將核心切割成不連續的記憶體區塊來克服大小限制。
  bzImage 格式仍然是以 zlib 演算法來做壓縮,雖然有一些廣泛的誤解就是因為以 bz- 為開頭,而讓人誤以為是使用 bzip2 壓縮方式(bzip2 套件所帶的工具程式通常是以 bz- 為開頭的,例如 bzless, bzcat ...)。
  bzImage 檔案是一個特殊的格式,包含了 bootsect.o + setup.o + misc.o + piggy.o 串接。piggy.o 包含了一個 gzip 格式的 vmlinux 檔案(可以參看 arch/i386/boot/下的 compressed/Makefile piggy.o)


initrd.img 和vmlinux的作用分别是什么?
(http://hi.baidu.com/ueszx/blog/item/c91929b7bc3feff230add124.html)


    编译安装完内核后在/boot下没有initrd.img....
    vmlinuz自然就是内核了,initrd.img是一个小的映象,包含一个最小的linux系统。通常的步骤是先启动内核,然后内核挂载 initrd.img,并执行里面的脚本来进一步挂载各种各样的模块,然后发现真正的root分区,挂载并执行/sbin/init... ...。
    initrd.img当然是可选的了,如果没有initrd.img,内核就试图直接挂载root分区。之所以要有initrd,那是为了启动的时候有更大的灵活性。比如,你把ext3支持编译成模块了。偏偏你的root分区又是ext3的。这下就麻烦了。 因为内核需要挂载root分区之后才能加载ext3支持。但是没有ext3支持就没法挂载root分区。initrd就是用来解决这个问题的。
    类似的用这个东西还可以做其他的事情,比如从usb盘启动linux也会面临上面类似的问题。用initrd就能搞定了。甚至,我想在有些嵌入式设备里面都不需要真正的root分区,用initrd就足够搞定一切了。

    主要是为了解决vmlinuz太大的问题,用initrd可以解决这个问题。否则的话在2.6的内核中启动会失败的。

vmlinux, zImage, Image的区别
(http://hi.baidu.com/ueszx/blog/item/c91929b7bc3feff230add124.html) 

 从下面的内核编译过程,可以看出vmlinux, arch/arm/boot/compressed/vmlinux, arch/arm/boot/Image, arch/arm/boot/zImage 之间的区别
 
  LD      vmlinux
  SYSMAP  System.map
  SYSMAP  .tmp_System.map
  OBJCOPY arch/arm/boot/Image
  Kernel: arch/arm/boot/Image is ready
  AS      arch/arm/boot/compressed/head.o
  GZIP    arch/arm/boot/compressed/piggy.gz
  AS      arch/arm/boot/compressed/piggy.o
  CC      arch/arm/boot/compressed/misc.o
  AS      arch/arm/boot/compressed/head-xscale.o
  LD      arch/arm/boot/compressed/vmlinux
  OBJCOPY arch/arm/boot/zImage

  vmlinux 是一个elf格式的文件
  Image 是经过objcopy 处理了的只包含内核代码,数据的一个文件, 已经不是elf格式的了。此时还没有经过压缩
  arch/arm/boot/compressed/vmlinux 是经过压缩的Image和加入了解压头的elf格式的文件
  arch/arm/boot/zImage 是经过objcopy处理了的可以直接下到对应的地址执行的内核镜像


 

No comments:

Post a Comment