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

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自: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内核镜像文件vmlinuxvmlinuzzImage之间的区别以及Linux启动过程的问题。首先,我要确保自己正确理解这些概念,然后再组织语言,用中文清晰解释。 首先,vmlinux是未经压缩的内核可执行文件,通常是ELF格式。它包含了调试信息,体积较大,无法直接用于引导系统。而vmlinuzzImage都是经过压缩的内核镜像,用于实际引导。vmlinuz一般是bzImage格式,适用于大内核,而zImage是旧格式,适用于小内核。需要解释这些文件的生成过程,比如使用objcopy去除调试信息,压缩等步骤。 接下来是Linux启动过程,涉及BIOS/UEFI初始化,加载bootloader(如GRUB),然后加载内核镜像(vmlinuzzImage),解压到内存,初始化硬件,加载initramfs(如果有的话),最后切换到用户空间的init进程。这里要提到initrd或initramfs的作用,可能引用用户提供的引用内容,比如引用[4]提到的mkinitrd命令。 然后要生成相关问题,可能需要包括不同镜像的应用场景、压缩方式的影响、如何生成这些文件、启动过程中各阶段的详细步骤等。 需要注意用户提供的引用中,引用[1]提到启动内核时不使用initrd的命令,引用[2]是内核源码链接,引用[3]是镜像格式转换,引用[4]是创建initrd的方法。这些引用可能需要在适当的地方引用,比如讨论initrd时提到引用[4]。 最后,确保回答结构清晰,分点解释每个文件的区别,然后详细描述启动过程,正确使用LaTeX格式,如使用$符号包裹行内数学表达式,独立公式用$$,但在这个问题中可能数学公式较少。需要检查是否有需要格式化的技术术语或路径,如/usr/src/linux,使用代码块格式。 总结步骤: 1. 解释vmlinuxvmlinuzzImage的区别,包括格式、压缩、用途。 2. 描述Linux启动过程,涉及各阶段和文件的作用。 3. 生成相关问题。 4. 引用提供的资料,如mkinitrd和boot命令。</think>### vmlinux与其他内核镜像文件的区别及Linux启动过程 #### 1. 内核镜像文件区别 - **vmlinux** 这是未经压缩的**原始ELF格式内核可执行文件**,包含完整的调试符号和未优化的二进制代码,主要用于内核调试。由于体积较大(通常数百MB),无法直接用于系统启动。生成命令示例: ```bash make vmlinux ``` - **vmlinuz** 是vmlinux经过压缩和重新封装后的**可引导内核镜像**,文件名中的“z”表示使用`gzip`压缩。它通常采用`bzImage`(Big zImage)格式,支持更大内核(> 512KB),适用于现代系统。存储路径为`/boot/vmlinuz-<kernel-version>`[^1]。 - **zImage** 与vmlinuz类似,但使用旧式压缩格式(适用于小内核,≤ 512KB)。两者的主要区别在于内存布局: $$ \text{zImage加载地址} < 1\text{MB},\quad \text{bzImage加载地址} \geq 1\text{MB} $$ - **其他格式** 如`uImage`(U-Boot专用,添加头部信息)、`Image`(未压缩的原始二进制镜像)等。 #### 2. 生成流程对比 ```mermaid graph LR A[vmlinux: ELF可执行文件] --> B[objcopy去除元数据] B --> C[Image: 原始二进制] C --> D[压缩为zImagebzImage] D --> E[vmlinuz: 可引导镜像] ``` #### 3. Linux启动过程 1. **BIOS/UEFI阶段** 硬件初始化后,从引导设备加载**Bootloader**(如GRUB)。 2. **Bootloader阶段** GRUB读取配置(如`/boot/grub/grub.cfg`),加载内核镜像(如`vmlinuz`)和可选的`initramfs`[^4]。 3. **内核解压与初始化** 内核自解压到内存,初始化硬件、内存管理、进程调度等核心功能。若使用`initramfs`,则在此阶段挂载临时根文件系统[^1]。 4. **用户空间切换** 内核启动`/sbin/init`(或systemd),完成系统服务初始化和用户登录。 #### 引用说明 - `initramfs`的创建可通过`mkinitrd`命令实现(RedHat系)。 - 无`initrd`启动时,需确保内核直接支持根文件系统。 --- ### § 1. 如何从vmlinux生成可引导的bzImage文件? 2. `initramfs`在启动过程中解决了哪些问题? 3. 如何通过QEMU调试vmlinux内核镜像? 4. `zImage`和`uImage`在嵌入式系统中的使用场景有何不同?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值