linux内核相关镜像uImage、zImage、bzImage、vmlinuz、vmlinux、Image.rom 、Image.ram 关系分析

时间:2022-07-31 16:28:50

zimage 和bzimage 有什么区别-bluesky2254-ChinaUnix博客
http://blog.chinaunix.net/uid-23835539-id-3353026.html

image.ram&image.rom - yjie_life的日志 - 网易博客
http://blog.163.com/yjie_life/blog/static/16319833720113300125387/

linux内核相关镜像zImage、zImage、bzImage、vmlinuz、vmlinux、Image关系分析 - yjie_life的日志 - 网易博客
http://blog.163.com/yjie_life/blog/static/16319833720113174233476/

在网络中,不少服务器采用的是Linux系统。为了进一步提高服务器的性能,可能需要根据特定的硬件及需求重新编译Linux内核。编译Linux 内核,需要根据规定的步骤进行,编译内核过程中涉及到几个重要的文件。比如对于RedHat Linux,在/boot目录下有一些与Linux内核有关的文件,进入/boot执行。 
  编译过RedHat Linux内核的人对其中的System.map、vmlinuz、initrd-2.4.7-10.img印象可能比较深刻,因为编译内核过程中涉及到这些文件的建立等操作。那么这几个文件是怎么产生的?又有什么作用呢?本文对此做些介绍。

  一、vmlinuz

  vmlinuz是可引导的、压缩的内核。“vm”代表“Virtual Memory”。Linux 支持虚拟内存,不像老的操作系统比如DOS有640KB内存的限制。Linux能够使用硬盘空间作为虚拟内存,因此得名“vm”。vmlinuz是可执行 的Linux内核,它位于/boot/vmlinuz,它一般是一个软链接,比如图中是vmlinuz-2.4.7-10的软链接。

  vmlinuz的建立有两种方式。一是编译内核时通过“make zImage”创建,手动拷贝到/boot目录下面。zImage适用于小内核的情况,它的存在是为了向后的兼容性。

  二是内核编译时通过命令make bzImage创建,然后手动拷贝至/boot目录下。bzImage是压缩的内核映像,需要注意,bzImage不是用bzip2压缩 的,bzImage中的bz容易引起误解,bz表示“big zImage”。 bzImage中的b是“big”意思。 zImage(vmlinuz)和bzImage(vmlinuz)都是用gzip压缩的。它们不仅是一个压缩文件,而且在这两个文件的开头部分内嵌有 gzip解压缩代码。所以你不能用gunzip 或 gzip –dc解包vmlinuz。

  内核文件中包含一个微型的gzip用于解压缩内核并引导它。两者的不同之处在于,老的zImage解压缩内核到低端内存(第一个 640K),bzImage解压缩内核到高端内存(1M以上)。如果内核比较小,那么可以采用zImage或bzImage之一,两种方式引导的系统运行 时是相同的。大的内核采用bzImage,不能采用zImage。vmlinux是未压缩的内核,vmlinuz是vmlinux的压缩文件。

  二、initrd-x.x.x.img

  initrd是“initial ramdisk”的简写。initrd一般被用来临时的引导硬件到实际内核vmlinuz能够接管并继续引导的状态。图中的initrd-2.4.7-10.img主要是用于加载ext3等文件系统及scsi设备的驱动。

  比如,使用的是scsi硬盘,而内核vmlinuz中并没有这个scsi硬件的驱动,那么在装入scsi模块之前,内核不能加载根文件系统,但 scsi模块存储在根文件系统的/lib/modules下。为了解决这个问题,可以引导一个能够读实际内核的initrd内核并用initrd修正 scsi引导问题。initrd-2.4.7-10.img是用gzip压缩的文件,initrd实现加载一些模块和安装文件系统等功能。

  initrd映象文件是使用mkinitrd创建的。mkinitrd实用程序能够创建initrd映象文件。这个命令是RedHat专有的(这也是为什么,在Linux内核包里/Documentation/Changes里面没有提到要将mkinitrd升级)。其它Linux发行版或许有相应的命令。这是个很方便的实用程序。具体情况请看帮助:man mkinitrd下面的命令创建initrd映象文件。

   三、uImage文件

  vmlinux是内核文件,zImage是一般情况下默认的压缩内核映像文件,压缩vmlinux,加上一段解压启动代码得到。而uImage 则是使用工具mkimage对普通的压缩内核映像文件(zImage)加工而得。它是uboot专用的映像文件,它是在zImage之前加上一个长度为 64字节的“头”,说明这个内核的版本、加载位置、生成时间、大小等信息;其0x40之后与zImage没区别。

其实就是一个自动跟手动的区别,有了uImage头部的描述,u-boot就知道对应Image的信息,如果没有头部则需要自己手动去搞那些参数。

如何生成 uImage文件?首先在uboot的/tools目录下寻找mkimage文件,把其copy到系统/usr/local/bin目录下,这样就完成制 作工具。然后在内核目录下运行make uImage,如果成功,便可以在arch/arm/boot/目录下发现uImage文件,其大小比 zImage多64个字节。

此外,平时调试用uImage,不用去管调整了哪些东西;zImage则是一切OK后直接烧0X0。开机就运行。

image.rom: 通常 image.rom 的文件大小要比 image.ram 小很多,这是因为 image.rom  
一个压缩过的内核,前面加上一个小的解压程序负责把内核解压后搬到指定位置
这个文件可以直接烧进 flash ,当然也可以在 ram 中运行.这个文件实际上 
就是通常 linux 生成的 zImage 文件.

image.ram: 这个内核没有压缩过,而且必须在 ram 里运行.所以需要通过板子上的 bootloader 
将它下载到指定位置后开始执行.相对 image.rom 而言, ram 里启动内核, 
代码段和数据段都在 ram 里面.这个文件是编译生成的 elf 格式的linux内核。

可以这样形象的说: image.rom = gunzip program + gzipped(image.ram)

http://www.embed.com.cn/downcenter/Article/Catalog11/3732.htm

========================================================================================

带调试信息的ELF格式的内核映像文件在kernel目录下,名称为vmLinux. 直接使用如下命令生成可执行文件image.ram:

arm-linux-objcopy -O binary R .note

R .comment S vmLinux image.ram

嵌入式系统构建之2440开发板内核制作,目地是让大家学会嵌入式内核的配置与编译,学习时应注意与前面X86平台内核制作做对比。比如,从生成的镜像上来看,在pc的x86平台下,我们生成的是bzImage、这里我们生成的是uImage,它们有什么联系?下面来讨论一下这几种镜像之间的关系:

 zImage与uImage

zImage是ARM Linux常用的一种压缩映像文件,uImage是U-boot专用的映像文件,它是在zImage之前加上一个长度为0x40的“头”,说明这个映像文件的类型、加载位置、生成时间、大小等信息。换句话说,如果直接从uImage的0x40位置开始执行,zImage和uImage没有任何区别。

 zImage与bzImage

bzImage是压缩的内核映像,需要注意,bzImage不是用bzip2压缩的,bzImage中的bz容易引起 误解,bz表示“big zImage”。 bzImage中的b是“big”意思。 zImage(vmlinuz)和bzImage(vmlinuz)都是用gzip压缩的。它们不仅是一个压缩文件,而且在这两个文件的开头部分内嵌有 gzip解压缩代码。所以你不能用gunzip 或 gzip –dc解包vmlinuz。

 vmlinuz与vmlinux

vmlinuz是可引导的、压缩的内核。“vm”代表“Virtual Memory”。Linux 支持虚拟内存,不像老的操作系统比如DOS有640KB内存的限制。Linux能够使用硬盘空间作为虚拟内存,因此得名“vm”。zImage和bzImage是vmlinuz的存在形式,在x86系统中,我们是直接通过将bzImage拷贝为/boot/vmlinuz获得vmlinuz的。

vmlinux 是ELF文件,即编译出的最原始的文件,或者称之为基本内核。vmlinuz(zImage或bzImage)是由ELF文件vmlinux经过objcopy后得到binary文件Image,再经过压缩后的文件。

http://blog.csdn.net/RICH_BABA/archive/2011/03/24/6275345.aspx

==================================================

以下是我用arm的交叉编译器编译的zImage、zImage、bzImage、vmlinuz、vmlinux、Image的大小:

zImage:为2.017824M(使用make zImage命令编译使用make bzImage命令会编译出bzImage,zImage和bzImage是差不多大小的)

              -rwxr-xr-x  1 root root 2017824  4月 16 18:58 arch/arm/boot/zImage

vmlinux:

              -rwxr-xr-x  1 root root 2080519  4月 16 18:58 arch/arm/boot/compressed/vmlinux

              而源码根目录下的vmlinux则很大:

               -rwxr-xr-x  1 root root 43635055  4月 17 23:57 vmlinux

            这两个vmlinux有什么区别呢?用file命名查看这两文件类型是一样的。