zImage/uImage编译过程解析

uImage生成过程


  为什么要用uImage,为什么不直接用未压缩的Image/vmlinux镜像?
  嵌入式设备由于成本限制,flash容量往往十分紧张,所以在存放固件时,需要对固件进行压缩处理。
  时间换空间,解压缩时花费更多的时间(增加启动时间,节省存储空间)。uImage/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/zImage

  编译最先链接生成的vmlinux是可引导的、可压缩的内核镜像,vm代表Virtual Memory。Linux支持虚拟内存,因而得名vm。它是由用户对内核源码编译得到,实质是elf格式的可执行文件。也就是说,vmlinux是编译出来的最原始的内核文件,未压缩,这种格式的镜像多存放在PC机上。
  OBJCOPY arch/arm/boot/Image命令,则将vmlinux去除符号,只保留二进制文件,此时的Image文件已经不是elf格式了。arm架构下,此步骤会把可执行文件拷贝到arch/arm/boot/目录下。
  GZIP arch/arm/boot/compressed/piggy.gz把Image文件压缩成piggy.gz,这里的打印是使用gzip格式压缩,内核menuconfig配置时,可以配置压缩格式。压缩比率最高的应该时lzma各式,但是相对的,设备启动自解压内核的时间也会更长。
  LD arch/arm/boot/compressed/vmlinux,这里的vmlinux是自解压可执行程序和经过压缩过后piggy.gz文件拼接而成的。arch/arm/boot/compressed/目录下存放了自解压程序源码,会根据内核配置的压缩格式,编译对应的自解压程序,编译成的自解压程序是一个单独的可执行文件(独立于内核)。自解压程序+piggy.gz拼接成新的vmlinux镜像(elf格式)。
  zImage是新的vmlinux,二进制化后形成的内核镜像文件(非elf)
  uImage是在zImage基础上,使用uboot下mkimage工具,编译生成的uboot专用镜像。

  在编译过程中可以留心观察一下,最终编译链接的打印,以及上文提到各个文件的大小。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值