arch/arm/boot/compressed/vmlinux生成过程

本文深入探讨了Linux内核中zImage到arch/arm/boot/compressed/vmlinux的生成流程,包括依赖关系、Q参数的作用、vmlinux.lds文件的生成以及最终的链接过程。

[Author: Bo Shen <voice.shen@gmail.com>]

[Linux kernel: 3.13-rc6, ]


前面文章讲解了zImage的生成过程(http://blog.youkuaiyun.com/voice_shen/article/details/17713441),其要依赖于<arch/arm/boot/compressed/vmlinux>。下面详细讲解<arch/arm/boot/compressed/vmlinux>生成过程。

 51 $(obj)/compressed/vmlinux: $(obj)/Image FORCE
 52         $(Q)$(MAKE) $(build)=$(obj)/compressed $@
由51行可知,<arch/arm/compressed/vmlinux>的生成需要依赖于Image。后面给出分析。

其52行的$(Q)表示什么意思呢?查看Linux根目录下面的Makefile可知:

 300 # If KBUILD_VERBOSE equals 0 then the above command will be hidden.
 301 # If KBUILD_VERBOSE equals 1 then the above command is displayed.
 302 
 303 ifeq ($(KBUILD_VERBOSE),1)
 304   quiet =
 305   Q =
 306 else
 307   quiet=quiet_
 308   Q = @
 309 endif
由303~309行可知,Q的取值由KBUILD_VERBOSE是否为1决定。那么KBUILD_VERBOSE在什么情况下等于1呢?

  44 # To put more focus on warnings, be less verbose as default
  45 # Use 'make V=1' to see the full commands
  46 
  47 ifeq ("$(origin V)", "command line")
  48   KBUILD_VERBOSE = $(V)
  49 endif
  50 ifndef KBUILD_VERBOSE
  51   KBUILD_VERBOSE = 0
  52 endif
由上面代码可知,KBUILD_VERBOSE在执行命令"make V=1"的时候取值为1。

分析完Q的值后,就可以知道编译生成<arch/arm/boot/compressed/vmlinux>的过程了。其就是进入<arch/arm/boot/compressed>目录后执行: make vmlinux。 下面进入到<arch/arm/boot/compressed>目录下查看Makefile文件。

179 $(obj)/vmlinux: $(obj)/vmlinux.lds $(obj)/$(HEAD) $(obj)/piggy.$(suffix_y).o \
180                 $(addprefix $(obj)/, $(OBJS)) $(lib1funcs) $(ashldi3) FORCE
181         @$(check_for_multiple_zreladdr)
182         $(call if_changed,ld)
183         @$(check_for_bad_syms)
根据vmlinux.lds,将这些文件链接在一起生成最后的vmlinux文件。

vmlinux.lds文件的生成:

195 $(obj)/vmlinux.lds: $(obj)/vmlinux.lds.in arch/arm/boot/Makefile $(KCONFIG_CONFIG)
196         @sed "$(SEDFLAGS)" < $< > $@
 84 SEDFLAGS        = s/TEXT_START/$(ZTEXTADDR)/;s/BSS_START/$(ZBSSADDR)/
从上面的代码可知,vmlinux.lds文件是把vmlinux.lds.in文件中的TEXT_START换成$(ZTEXTADDR), BSS_START换成$(ZBSSADDR)后得到。对于ARM来说,ZTEXTADDR=0, ZBSSADDR=ALIGN(8)。 

185 $(obj)/piggy.$(suffix_y): $(obj)/../Image FORCE
186         $(call if_changed,$(suffix_y))
187 
188 $(obj)/piggy.$(suffix_y).o:  $(obj)/piggy.$(suffix_y) FORCE

因为编译Linux kernel选择了gzip,所以suffix_y=gzip。在185~186,对上一层目录的Image文件进行gzip压缩。

 86 suffix_$(CONFIG_KERNEL_GZIP) = gzip
 87 suffix_$(CONFIG_KERNEL_LZO)  = lzo
 88 suffix_$(CONFIG_KERNEL_LZMA) = lzma
 89 suffix_$(CONFIG_KERNEL_XZ)   = xzkern
 90 suffix_$(CONFIG_KERNEL_LZ4)  = lz4

OBJS如下:

 25 HEAD    = head.o
 26 OBJS    += misc.o decompress.o
 27 ifeq ($(CONFIG_DEBUG_UNCOMPRESS),y)
 28 OBJS    += debug.o
 29 endif
 33 OBJS            += string.o

综上所述,<arch/arm/boot/compressed/vmlinux>的生成,是将<arch/arm/boot/Image>进行gzip压缩,然后按照vmlinux.lds文件链接相关的文件。





AS arch/arm/boot/compressed/piggy.o LD arch/arm/boot/compressed/vmlinux OBJCOPY arch/arm/boot/zImage Kernel: arch/arm/boot/zImage is ready if [ -d arch/arm/boot/ven_bin ]; then rm -rf arch/arm/boot/ven_bin; fi mkdir -p arch/arm/boot/ven_bin cp -r /home/zyl/Documents/Platform_NVMP/nvmp/product_config/cx20iv1.20/dts/Linux arch/arm/boot/ven_bin/ [ ! -e arch/arm/boot/ven_bin/cfg_gen ] && ln -s /home/zyl/Documents/Platform_NVMP/nvmp/build_dir/target-arm-ca9-linux-uclibcgnueabihf-cx20iv1.20/linux-nvt9856x_generic/linux-4.19.91/arch/arm/boot/ven_bin/Linux/cfg_561_IPCAM1_NOR_EVB/ arch/arm/boot/ven_bin/cfg_gen cpp -nostdinc -I /home/zyl/Documents/Platform_NVMP/nvmp/build_dir/target-arm-ca9-linux-uclibcgnueabihf-cx20iv1.20/linux-nvt9856x_generic/linux-4.19.91/include -undef -x assembler-with-cpp /home/zyl/Documents/Platform_NVMP/nvmp/build_dir/target-arm-ca9-linux-uclibcgnueabihf-cx20iv1.20/linux-nvt9856x_generic/linux-4.19.91/arch/arm/boot/ven_bin/cfg_gen/nvt-evb.dts > /home/zyl/Documents/Platform_NVMP/nvmp/build_dir/target-arm-ca9-linux-uclibcgnueabihf-cx20iv1.20/linux-nvt9856x_generic/linux-4.19.91/arch/arm/boot/ven_bin/cfg_gen/nvt-evb.tmp.dts dtc -O dtb -b 0 -o /home/zyl/Documents/Platform_NVMP/nvmp/build_dir/target-arm-ca9-linux-uclibcgnueabihf-cx20iv1.20/linux-nvt9856x_generic/linux-4.19.91/arch/arm/boot/ven_bin/cfg_gen/nvt-evb.dtb /home/zyl/Documents/Platform_NVMP/nvmp/build_dir/target-arm-ca9-linux-uclibcgnueabihf-cx20iv1.20/linux-nvt9856x_generic/linux-4.19.91/arch/arm/boot/ven_bin/cfg_gen/nvt-evb.tmp.dts make[6]: dtc: Command not found arch/arm/boot/Makefile:70: recipe for target 'arch/arm/boot/nvt-evb.dtb' failed make[6]: *** [arch/arm/boot/nvt-evb.dtb] Error 127 arch/arm/Makefile:342: recipe for target 'uImage' failed make[5]: *** [uImage] Error 2 make[5]: Leaving directory '/home/zyl/Documents/Platform_NVMP/nvmp/build_dir/target-arm-ca9-linux-uclibcgnueabihf-cx20iv1.20/linux-nvt9856x_generic/linux-4.19.91' Makefile:57: recipe for target '/home/zyl/Documents/Platform_NVMP/nvmp/build_dir/target-arm-ca9-linux-uclibcgnueabihf-cx20iv1.20/linux-nvt9856x_generic/linux-4.19.91/.modules' failed make[4]: *** [/home/zyl/Documents/Platform_NVMP/nvmp/build_dir/target-arm-ca9-linux-uclibcgnueabihf-cx20iv1.20/linux-nvt9856x_generic/linux-4.19.91/.modules] Error 2 make[4]: Leaving directory '/home/zyl/Documents/Platform_NVMP/nvmp/target/linux/nvt9856x' Makefile:13: recipe for target 'compile' failed make[3]: *** [compile] Error 2 make[3]: Leaving directory '/home/zyl/Documents/Platform_NVMP/nvmp/target/linux' target/Makefile:21: recipe for target 'target/linux/compile' failed make[2]: *** [target/linux/compile] Error 2 make[2]: Leaving directory '/home/zyl/Documents/Platform_NVMP/nvmp' target/Makefile:16: recipe for target '/home/zyl/Documents/Platform_NVMP/nvmp/staging_dir/target-arm-ca9-linux-uclibcgnueabihf-cx20iv1.20/stamp/.target_compile' failed make[1]: *** [/home/zyl/Documents/Platform_NVMP/nvmp/staging_dir/target-arm-ca9-linux-uclibcgnueabihf-cx20iv1.20/stamp/.target_compile] Error 2 make[1]: Leaving directory '/home/zyl/Documents/Platform_NVMP/nvmp' /home/zyl/Documents/Platform_NVMP/nvmp/include/toplevel.mk:203: recipe for target 'world' failed make: *** [world] Error 2
最新发布
08-26
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值