linux中vmlinux, zImage, Image的区别

一、Linux内核镜像格式  

        这几种文件都是Linux内核镜像格式,Linux内核有多种格式的镜像,包括:vmlinux、Image、zImage、bzImage、uImage、xipImage、bootpImage等.

  • kernel镜像格式:vmlinux

        vmlinuz是可引导的、可压缩的内核镜像,vm代表Virtual Memory.Linux支持虚拟内存,因此得名vm.它是由用户对内核源码编译得到,实质是elf格式的文件.也就是说,vmlinux是编译出来的最原始的内核文件,未压缩这种格式的镜像文件多存放在PC机上,多放在源码的顶层目录下.

        elf格式文件
        ELF(Executable and Linkable  Format),可执行可链接格式,是UNIX实验室作为应用程序二进制接口而发布的,扩展名为elf,可以简单认为,在elf格式的文件中,除二进制代码外,还包括该可执行文件的某些信息,比如符号表等。

  • kernel镜像格式:Image

        Image是经过objcopy处理的只包含二进制数据的内核代码,它已经不是elf格式了,但这种格式的内核镜像还没有经过压缩。 该文件一般放在文件放在源码的 arch\arm\boot 目录下。
       GNU使用工具程序 objcopy 作用是拷贝一个目标文件的内容到另一个目标文件中,也就是说,可以将一种格式的目标文件转换成另一种格式的目标文件。通过使用binary作为输出目标(-o  binary),可产生一个原始的二进制文件,实质上是将所有的符号和重定位信息都将被抛弃,只剩下二进制数据。

  • kernel镜像格式:zImage

        zImage是ARM linux常用的一种压缩镜像文件,它是由vmlinux加上解压代码经gzip压缩而成,命令格式是#make zImage。该文件一般放在文件放在源码的 arch\arm\boot 目录下。

        这种格式的Linux镜像文件多存放在NAND上.

  • kernel镜像格式:bzImage

        bz表示big zImage,其格式与zImage类似,但采用了不同的压缩算法。注意,bzImage的压缩率更高.

  • kernel镜像格式:uImage

        uImageuboot专用的镜像文件,它是在zImage之前加上一个长度为0x40的头信息(tag),在头信息内说明了该镜像文件的类型、加载位置、生成时间、大小等信息。换句话说,若直接从uImage的0x40位置开始执行,则zImage和uImage没有任何区别。命令格式是#make  uImage。

        该文件一般放在文件放在源码的 arch\arm\boot 目录下。

        这种格式的Linux镜像文件多存放在NAND上.

  • kernel镜像格式:xipImage

        这种格式的Linux镜像文件多存放在NorFlash上,且运行时不需要拷贝到内存SDRAM中,可以直接在NorFlash中运行.


二、Linux内核镜像的产生过程

        在嵌入式Linux中,内核的启动过程分为两个阶段:

        第一阶段启动代码放在 arch/arm/kernel/head.S 文件中,该文件与 CPU体系 相关,与用户的开发板无关,主要是初始化ARM内核等。

        第二阶段启动代码是init目录下的 main.c。

        现以执行命令#make  zImage为例来说明,arm-linux内核镜像的产生过程。

        (1)当用户对Linux内核源码进行编译时,kernel的第1/2阶段代码会生成可执行文件 (镜像文件)vmlinux,该文件是未被压缩的镜像文件,非常大,不能直接下载到NAND中,通常放在PC机上,这也是最原始的Linux镜像文件,试验时该文件约50M。

        (2)镜像文件vmlinux由于很大,肯定不能直接烧入NAND中,因此需要进行 二进制化,即经过objcopy 处理,使之只包含二进制数据的内核代码,去除不需要的文件信息等,这样就制作成了image镜像文件。该镜像文件也是未压缩,只是经过了二进制化而变小,试验时该文件约5M。

        (3)一般来说,内存SDRAM中的内核镜像是经过压缩的,只是在运行时再将其解压.所以,编译时会先使用gzip将镜像文件image进行压缩(压缩比约为  2:1),再将压缩后的镜像文件和源码中的两个文件arch/arm/boot/compressed/head.S、arch/arm/boot  /compressed/misc.c一起链接生成压缩后的镜像文件compress/vmlinux.试验时该文件约为2.5M.注意,这两个源码文件 是解压程序,用于将内存SDRAM中的压缩镜像zImage进行解压。

        (4) 压缩后的镜像文件compress/vmlinux经过二进制化,最终生成镜像文件zImage,试验时该文件约为2.5M.当然,在内存 SDRAM中运行压缩镜像文件zImage时,会首先调用两个解压程序arch/arm  /boot/compressed/head.S、arch/arm/boot/compressed/misc.c将自身解压,然后再执行kernel   的第一阶段启动代码arch/arm/kernel/head.S.简而言之,在内存中运行内核时,kernel先自身解压,再执行第一阶段启动代码.试 验时运行在内存中的镜像文件约为5M,与image镜像文件大小相同.

        (5) 生成的镜像文件image、zImage、uImage均在arch/arm/boot目录下。

二、attention

        (1) 网站:LXR / The Linux Cross Reference
              该网站通过了Linux内核源码,不用解压,在线查询,非常方便.
        (2)启动开发板时,在超级终端内会有许多的提示信息,其中:
              booting linux ...  /*表示正在将内核从NAND拷贝到内存中*/
              unpressed...      /*表示正在解压内核*/
        (3)只有当用户输入boot命令或在boot_delay延时时间后,vivi才将NANDFlash中的内核kernel拷贝到内存SDRAM中.也就是说,当vivi进入命令行模式时,在SDRAM中并没有内核kernel.
        (4)在kernel源码目录下执行命令:
            <1> #tree       /*打印出kernel源码的目录结构*/
            <2> #tree -L 1   /*打印出kernel源码的第一级目录结构*/
            <3> #tree > /home/lishuai/linux.txt   /*将kernel源码的目录结构重定向到某个文件中,用户可以随时查看其目录结构,非常方便*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值