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

本文深入解析了Linux内核的多种镜像类型及其生成过程,包括vmlinux、Image、zImage、bzImage、uImage、xipImage、bootpImage等,并详细介绍了各类型的特性和生成步骤。

转自:http://www.cnblogs.com/hnrainll/category/283519.html

 

linux内核镜像格式

一、Linux内核镜像格式  
   Linux内核有多种格式的镜像,包括vmlinux、Image、zImage、bzImage、uImage、xipImage、bootpImage等.
(1)kernel镜像格式:vmlinux
   vmlinuz是可引导的、可压缩的内核镜像,vm代表Virtual Memory.Linux支持虚拟内存,因此得名vm.它是由用户对内核源码编译得到,实质是elf格式的文件.也就是说,vmlinux是编译出来的最原始的内核文件,未压缩.这种格式的镜像文件多存放在PC机上.
  【 attention】elf格式文件
      ELF,Executable and Linkable Format,可执行可链接格式,是UNIX实验室作为应用程序二进制接口而发布的,扩展名为elf.可以简单的认为,在elf格式的文件中,除二进制代码外,还包括该可执行文件的某些信息,比如符号表等.
(2)kernel镜像格式:Image
   Image是经过objcopy处理的只包含二进制数据的内核代码,它已经不是elf格式了,但这种格式的内核镜像还没有经过压缩.
  【 attention】objcopy
      GNU使用工具程序objcopy作用是拷贝一个目标文件的内容到另一个目标文件中,也就是说,可以将一种格式的目标文件转换成另一种格式的目标文件.通过使用binary作为输出目标(-o binary),可产生一个原始的二进制文件,实质上是将所有的符号和重定位信息都将被抛弃,只剩下二进制数据.
(3)kernel镜像格式:zImage
   zImage是ARM linux常用的一种压缩镜像文件,它是由vmlinux加上解压代码经gzip压缩而成,命令格式是#make zImage.这种格式的Linux镜像文件多存放在NAND上.
(4)kernel镜像格式:bzImage
   bz表示big zImage,其格式与zImage类似,但采用了不同的压缩算法,注意,bzImage的压缩率更高.
(5)kernel镜像格式:uImage
   uImage是uboot专用的镜像文件,它是在zImage之前加上一个长度为0x40的头信息(tag),在头信息内说明了该镜像文件的类型、加载位置、生成时间、大小等信息.换句话说,若直接从uImage的0x40位置开始执行,则zImage和uImage没有任何区别.命令格式是#make uImage.这种格式的Linux镜像文件多存放在NAND上.
(6)kernel镜像格式:xipImage
   这种格式的Linux镜像文件多存放在NorFlash上,且运行时不需要拷贝到内存SDRAM中,可以直接在NorFlash中运行.


二、Linux内核镜像的产生过程
  在嵌入式Linux中,内核的启动过程分为两个阶段.其中,第一阶段启动代码放在arch/arm/kernel/head.S文件中,该文件与体系结果相关,与用户的开发板无关,主要是初始化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镜像文件大小相同.
【 attention】
(1) 网站:http://lxr.linux.no/
   该网站通过了Linux内核源码,不用解压,在线查询,非常方便.
(2)生成的镜像文件vmlinux放在源码的顶层目录下.
(3)生成的镜像文件image、zImage均在arch/arm/boot目录下.
(4)启动开发板时,在超级终端内会有许多的提示信息,其中:
      booting linux ...  /*表示正在将内核从NAND拷贝到内存中*/
      unpressed...      /*表示正在解压内核*/
(5)只有当用户输入boot命令或在boot_delay延时时间后,vivi才将NANDFlash中的内核kernel拷贝到内存SDRAM中.也就是说,当vivi进入命令行模式时,在SDRAM中并没有内核kernel.
(6)在kernel源码目录下执行命令:
  <1> #tree       /*打印出kernel源码的目录结构*/
  <2> #tree -L 1   /*打印出kernel源码的第一级目录结构*/
  <3> #tree > /home/lishuai/linux.txt   /*将kernel源码的目录结构重定向到某个文件中,用户可以随时查看其目录结构,非常方便*/


以下转自:http://ibeyond.blog.51cto.com/1988404/400852

如何生成 uImage文件?首先在uboot的/tools目录下寻找mkimage文件,把其copy到系统/usr/local/bin目录下,这样就完成制 作工具。然后在内核目录下运行make uImage,如果成功,便可以在arch/arm/boot/目录下发现uImage文件,其大小比 zImage多64个字节。此外,平时调试用uImage,不用去管调整了哪些东西;zImage则是一切OK后直接烧0X0。开机就运行。
<think>我们正在讨论Linux内核编译过程中生成的不同映像文件:vmlinux, vmlinuz, Image, Image.gz。根据引用内容,我们可以总结如下: 1. **vmlinux**:这是编译后生成的最原始的内核映像文件,它是ELF(Executable and Linkable Format)格式的文件,包含完整的符号表和调试信息。通常文件较大,不能直接用于引导系统,主要用于调试。 2. **vmlinuz**:这是经过压缩的vmlinux文件。压缩使用的是gzip算法(引用[1]和引用[3]都提到了gzip压缩)。它是可引导的内核映像,通常用于x86架构。在x86架构中,压缩后的内核映像有两种格式:zImagebzImage(大内核映像)。其中,bzImage用于较大内核(大于512KB),而vmlinuz通常是指bzImage(引用[1]和引用[3])。 3. **Image**:对于ARM或ARM64架构,编译生成的非压缩原始内核映像文件,它是二进制格式(bin文件)。它是通过objcopy工具从vmlinux转换而来的(引用[2]和引用[4])。 4. **Image.gz**:这是将Image文件使用gzip压缩后的文件(引用[2])。对于ARM64架构,通常使用Image.gz作为压缩内核映像。 引用[4]提到,生成这些映像的过程是: - 源代码编译链接生成ELF格式的可执行文件(vmlinux)。 - 使用objcopy工具将vmlinux转换成二进制文件(Image),然后可以压缩成Image.gz(ARM64)或者进一步处理成其他格式。 而引用[1]和[3]指出,vmlinuz是由vmlinux经过压缩(gzip)得到的。 因此,我们可以这样总结它们之间的关系: - vmlinux -> (压缩gzip) -> vmlinuz(x86架构下通常指bzImage) - vmlinux -> (objcopy) -> Image(ARM/ARM64架构的原始二进制映像)-> (gzip压缩) -> Image.gz 另外,引用[1]提到vmlinuz的文件大小小于未压缩的vmlinux,这是显然的。 下面我们按照用户的要求,用中文回答,并生成相关问题。注意LaTeX格式的使用(行内用$...$,独立公式用$$...$$),以及引用标识。 </think>### Linux内核映像文件详解:vmlinuxvmlinuz、Image与Image.gz #### **1. vmlinux:原始ELF内核** - **本质**:编译生成的最原始可执行文件(ELF格式) - **特点**: - 包含完整符号表和调试信息,体积最大 - 未压缩,无法直接引导系统 - 主要用于内核调试和开发 - **生成路径**:`linux-5.15/vmlinux` - **数学关系**: 设原始内核大小为$S_{src}$,则: $$S_{vmlinux} ≈ S_{src} + S_{debug\_info}$$ #### **2. vmlinuz:可引导压缩内核** - **本质**:由vmlinux经**gzip压缩**生成的可引导映像[^1][^3] - **特点**: - 压缩率约60-70%(例如:100MB→4MB) - 内置解压代码,支持系统引导 - 标准命名:`vmlinuz-<版本号>` - **生成过程**: ```mermaid graph LR A[vmlinux] --> B[objcopy转换] B --> C[gzip -9压缩] C --> D[vmlinuz] ``` - **数学关系**: 压缩率$\eta$满足: $$\eta = 1 - \frac{S_{vmlinuz}}{S_{vmlinux}} \approx 0.6 \sim 0.7$$ #### **3. Image:原始二进制映像** - **本质**:通过`objcopy`从vmlinux转换的**纯二进制文件**[^2][^4] - **特点**: - 移除了ELF头等元数据 - 无压缩,体积小于vmlinux但大于压缩格式 - ARM架构的标准内核映像 - **生成命令**: ```bash objcopy -O binary -S vmlinux Image ``` - **数学关系**: 设ELF头部大小为$S_{elf}$,则: $$S_{Image} = S_{vmlinux} - S_{elf}$$ #### **4. Image.gz:压缩二进制映像** - **本质**:Image经gzip压缩的版本[^2] - **特点**: - ARM64架构常用引导格式 - 支持UEFI直接加载 - 文件名示例:`Image.gz-5.15.0` - **压缩过程**: ```bash gzip -9 -c Image > Image.gz # -9为最高压缩级别 ``` - **体积对比**: | 文件类型 | 相对体积比 | 引导能力 | |--------------|-----------|---------| | vmlinux | 100% | ❌ | | Image | 80%~90% | ✅ | | Image.gz | 30%~40% | ✅ | | vmlinuz | 30%~40% | ✅ | --- ### 关键区别总结 | 特性 | vmlinux | vmlinuz | Image | Image.gz | |---------------|---------------|------------------|----------------|----------------| | **文件格式** | ELF可执行文件 | 压缩二进制 | 原始二进制 | 压缩二进制 | | **压缩** | 无 | gzip压缩 | 无 | gzip压缩 | | **引导能力** | 不可引导 | 可引导(x86) | 可引导(ARM) | 可引导(ARM64) | | **主要用途** | 内核调试 | 桌面系统引导 | 嵌入式设备 | 服务器/UEFI | | **符号表** | 完整保留 | 部分移除 | 完全移除 | 完全移除 | > 引用说明: > [^1]: vmlinuzvmlinux的gzip压缩版本 > [^2]: Image.gz通过gzip压缩Image生成 > [^3]: vmlinuz的压缩过程使用`gzip -9`最高压缩级别 > [^4]: Image由vmlinux经objcopy转换得到
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值