vmlinux 相关知识锦集

 

原文出处:

http://www.360doc.com/content/10/1228/08/496343_81916311.shtmlhtml

 

 


vmlinux, zImage, Image的区别 

从下面的内核编译过程,能够看出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/zImagelinux

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

objcopy:网络

GNU 实用工具程序objcopy的做用是拷贝一个目标文件的内容到另外一个目标文件中。Objcopy使用GNUBFD库去读或写目标文件。Objcopy能够 使用不一样于源目标文件的格式来写目的目标文件(也便是说能够将一种格式的目标文件转换成另外一种格式的目标文件)。经过以上命令行选项能够控制 Objcopy的具体操做。ide

Objcopy在进行目标文件的转换时,将生成一个临时 文件,转换完成后就将这个临时文件删掉。Objcopy使用BFD作转换工做。若是没有明确地格式要求,则Objcopy将访问全部在BFD库中已经描述 了的而且它能够识别的格式,请参见《GNUpro Decelopment Tools》中“using ld”一章中“BFD库”部分和“BFD库中规范的目标文件格式”部分。工具

经过使用srec做为输出目标(使用命令行选项-o srec),Objcopy能够产生S记录格式文件。post

通 过使用binary做为输出目标(使用命令行选项-obinary),Objcopy能够产生原始的二进制文件。使用Objcopy产生一个原始的二进制 文件,实质上是进行了一回输入目标文件内容的内存转储。全部的符号和重定位信息都将被丢弃。内存转储起始于输入目标文件中那些将要拷贝到输出目标文件去的 部分的最小虚地址处。性能

使用Objcopy生成S记录格式文件或者原始的二进制文件的过程当中,-S选项和-R选项可能会比较有用。-S选项是用来删掉包含调试信息的部分,-R选项是用来删掉包含了二进制文件不须要的内容的那些部分。ui

 

vmlinux,vmlinuz,uImage,zImage,bzImage之间的异同  spa

在 网络中,很多服务器采用的是Linux系统。为了进一步提升服务器的性能,可能须要根据特定的硬件及需求从新编译Linux内核。编译Linux 内核,须要根据规定的步骤进行,编译内核过程当中涉及到几个重要的文件。好比对于RedHatLinux,在/boot目录下有一些与Linux内核有关的 文件,进入/boot执行。
编译过RedHat Linux内核的人对其中的System.map、vmlinuz、initrd-2.4.7-10.img印象可能比较深入,由于编译内核过程当中涉及到这些文件的创建等操做。那么这几个文件是怎么产生的?又有什么做用呢?本文对此作些介绍。
  1、vmlinuz
  vmlinuz是可引导的、压缩的内核 。“vm”表明“Virtual Memory”。Linux 支持虚拟内存,不像老的操做系统好比DOS有640KB内存的限制。Linux可以使用硬盘空间做为虚拟内存,所以得名“vm”。vmlinuz是可执行 的Linux内核,它位于/boot/vmlinuz,它通常是一个软连接,好比图中是vmlinuz-2.4.7-10的软连接。
  vmlinuz的创建有两种方式。一是编译内核时经过“make zImage”建立,手动拷贝到/boot目录下面。zImage适用于小内核的状况,它的存在是为了向后的兼容性。
   二是内核编译时经过命令makebzImage建立,而后手动拷贝至/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的压缩文件。
  2、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映象文件。
   3、uImage文件
   vmlinux是内核文件,zImage是通常状况下默认的压缩内核映像文件,压缩vmlinux,加上一段解压启动代码获得。而uImage则是使用 工具mkp_w_picpath对普通的压缩内核映像文件(zImage)加工而得。它是uboot专用的映像文件,它是在zImage以前加上一个长度为64字节的 “头”,说明这个内核的版本、加载位置、生成时间、大小等信息; 其0x40以后与zImage没区别。  
其实就是一个自动跟手动的区别,有了uImage头部的描述,u-boot就知道对应Image的信息,若是没有头部则须要本身手动去搞那些参数。
如 何生成uImage文件?首先在uboot的/tools目录下寻找mkp_w_picpath文件,把其copy到系统/usr/local/bin目录下,这样就 完成制做工具。而后在内核目录下运行make uImage,若是成功,即可以在arch/arm/boot/目录下发现uImage文件,其大小比 zImage多64个字节。

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

 

 

在make install发生的事

在make install后, 会有三个文件被放到/boot下:
1. vmlinuz-2.6.x.y.z
2. System.map
3. config
4. 为何个人gentoo没有initrd.img的??
在/usr/src/linux下还有一个vmlinux的方件.

 

那么/boot下的vmlinux是哪一个呢? 以下:

jessinio@niolaptop /usr/src/linux $ diff /usr/src/linux/arch/x86/boot/bzImage /usr/src/linux/vmlinux
Files /usr/src/linux/arch/x86/boot/bzImage and /usr/src/linux/vmlinux differ
jessinio@niolaptop /usr/src/linux $ diff /usr/src/linux/arch/x86/boot/bzImage /boot/vmlinuz

能够看出/boot下的vmlinux是/usr/src/linux/arch/x86/boot/bzImage


随便提一下make内核时的过程:

就常使用的make也过程:
cd /usr/src/linux
make menuconfig
make
make modules_install
make install

注意到上面的一个make是不参数的, 这种状况实际以下:
Execute "make" or "make all" to build all targets marked with [*]

"*"号等于以下:
make vlinux modules bzImage

 

zImage / vmlinux / Image生成的流程图

  SRC_TREE    :=./
HEADER_PATH    :=arch/arm/boot/compressed
BOOT_PATH    :=arch/arm/boot/
KERNEL_PATH    :=arch/arm/kernel

 


-----------------------------------------------------------------------------------------------------------------------

1 SRC_TREE 目录下的vmlinux通过objcoy后生成二进制文件Image,Image在通过gzip压缩后生成piggy.o
   piggy.o是真正的内核镜像文件

2 HEADER_PATH/head.o ,head-xscal.o ,misc.o 的做用就是把piggy.o解压到指定的位置,而后执行piggy.o解压后的代码


HEADER_PATH/zImage
       ^
       |[objcopy]
       |
HEADER_PATH/vmlinux
       ^
       |[ld]
       |
       +-<--HEADER_PATH/head.o
       |
       +-<--HEADER_PATH/head-xscal.o
       |
       +-<--HEADER_PATH/misc.o
       |
       +-<--HEADER_PATH/piggy.o <-- HEADER_PATH/piggy.gz <--[gzip]-- BOOT_PATH/Image <--[objcopy]--SRC_TREE/vmlinux

-----------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------

SRC_TREE目录下的vmlinux是由一下三部分组成的:

$(vmlinux-init)

$(vmlinux-main)

kallsyms.o

vmlinux    ^    |    +-<--$(vmlinux-init)    |          ^    |          |    |          +--<--KERNEL_PATH/head.S    |          |    |          +--<--KERNEL_PATH/init_task.o    |          |    |          +--<--SRC_TREE/init/build-in.o    |            +--< $(vmlinux-main)    |          ^    |          |$(cory-y)    |          +--<--SRC_TREE/driver/built-in.o    |          |    |          +--<--SRC_TREE/mm/built-in.o    |          |    |          +--<--SRC_TREE/usr/built-in.o    |          |    |          +--<--SRC_TREE/kernel/built-in.o    |          |    |          +--<--SRC_TREE/mm/built-in.o    |          |    |          +--<--SRC_TREE/fs/built-in.o    |          |    |          +--<--SRC_TREE/ipc/built-in.o    |          |    |          +--<--SRC_TREE/securiy/built-in.o    |          |    |          +--<--SRC_TREE/crypto/built-in.o    |          |    |          +--<--SRC_TREE/block/built-in.o    |          |    |          +--<--arch/arm/kernel/built-in.o    |          |    |          +--<--arch/arm/mm/built-in.o    |          |    |          +--<--arch/arm/common/built-in.o    |          |    |          +--<--arch/arm/mach-pxa/built-in.o    |          |    |          +--<--arch/arm/nwfpe/buit-in.o    |          |    |          |$(lib-y)    |          +--<--SRC_TREE/lib/built-in.o    |          |    |          +--<--arch/arm/lib/built-in.o    |          |    |          |$(drivers-y)    |          +--<--SRC_TREE/drivers/buit-in.o    |          |    |          +--<--SRC_TREE/sound/buit-in.o    |          |    |          |$(net-y)    |          +--<--SRC_TREE/net/buit-in.o    |    +--< kallsyms.o

相关文章
相关标签/搜索