linux2.6.35zImage生成流程简介

  • Post author:
  • Post category:linux

zImageARM Linux常用的一种压缩映像文件,uImageU-boot专用的映像文件,它是在zImage之前加上一个长度为0x40,说明这个映像文件的类型、加载位置、生成时间、大小等信息。换句话说,如果直接从uImage0x40位置开始执行,zImageuImage没有任何区别。另外, Linux2.4内核不支持uImageLinux2.6内核加入了很多对嵌入式系统的支持,但是uImage的生成也需要设置。

 

分析一下zImage的组成。在内核编译完成后会在arch/arm/boot/下生成zImage。 

arch/armboot/Makefile中:

$(obj)/zImage: $(obj)/compressed/vmlinux FORCE

                    $(call if_changed,objcopy)

由此可见,zImage的是elf格式的arch/arm/boot/compressed/vmlinux二进制化得到的 

arch/armboot/compressed/Makefile中:

HEAD= head.o

OBJS= misc.o decompress.o

$(obj)/vmlinux: $(obj)/vmlinux.lds $(obj)/$(HEAD) $(obj)/piggy.o /

                                                            $(addprefix $(obj)/, $(OBJS)) FORCE

                    $(call if_changed,ld)

$(obj)/piggy.gz: $(obj)/../Image FORCE

                    $(call if_changed,gzip)

$(obj)/piggy.o: $(obj)/piggy.gz FORCE

这里我们可以看到,vmlinux主要依赖下面几个文件:

Ø vmlinux.lds

Ø head.o

Ø piggy.o

Ø decompress.o

piggy.o依赖piggy.gz

piggy.gz依赖arch/arm/boot/Image

查看arch/arm/boot/Makefile,得知

$(obj)/Image: vmlinux FORCE

$(call if_changed,objcopy)

@echo ‘  Kernel: $@ is ready’

其中Image是由内核顶层目录下的vmlinux二进制化后得到的。注意:arch/arm/boot/compressed/vmlinux是位置无关的,这个有助于理解后面的代码,链接选项中有个 –fpic参数:

EXTRA_CFLAGS := -fpic 

总结一下zImage的组成,它是由一个压缩后的内核piggy.o,连接上一段初始化及解压功能的代码(head.o misc.o decompress.o)组成的。