Linux內核zImage怎么來的?


以下內容基於s5pv210硬件進行分析

  當我們配置好內核后執行make,在arch/arm/Makefile中有:

首先要生成依賴vmlinux,這個過程請參考我的隨筆(Linux內核編譯make做了什么?),得到vmlinux后make會執行:

  $(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $(boot)/$@ 

  即:make  -f   scripts/Makefile.build  obj=arch/arm/boot  arch/arm/boot/zImage

打開arch/arm/boot/Makefile找到該目標如下:

由上圖可知arch/arm/boot/zImage的依賴關系鏈為:

arch/arm/boot/zImage->arch/arm/boot/compressed/vmlinux>arch/arm/boot/image->vmlinux

  1.  vmlinux已經生成,

  2.  接着執行arch/arm/boot/image目標下的命令即可生成arch/arm/boot/image

  3.  再接着執行arch/arm/boot/compressed/vmlinux目標下的命令:

$(Q)$(MAKE) $(build)=$(obj)/compressed $@

即:make  -f   scripts/Makefile.build  obj=arch/arm/boot/compressed  arch/arm/boot/compressed/vmlinux

打開arch/arm/boot/compressed/Makefile,得到:

 

其中:suffix_y = gzip  HEAD = head.o  OBJS = misc.o decompress.o  lib1funcs =lib1funcs.o

在arch/arm/boot/compressed/Makefile,找到vmlinux.lds目標:

 

SEDFLAGS = s/TEXT_START/0/;s/BSS_START/ALIGN(4)/

該命令為將在arch/arm/boot/compressed/vmlinux.lds.in作為輸入產生arch/arm/boot/compressed/vmlinux.lds,該命令的原理不做分析。

在arch/arm/boot/compressed/Makefile,找到arch/arm/boot/compressed/piggy.gzip.o目標:

 

先執行$(call if_changed,$(suffix_y)),即$(call if_changed,gzip),

if_changed是執行參數gzip命令的函數位於scripts/kbuild.include,而gzip命令定義位於scripts/Makefile.lib,如下:

 

該命令意思是將依賴集合中的FORCE出去,剩余的arch/arm/boot/Image通過cat傳給gzip生成piggy.gzip為Image的壓縮文件

piggy.gzip.o  head.o   misc.o decompress.o  lib1funcs.o由makefile.build以及所包含的makefile的下匹配規則產生。

最后回到arch/arm/boot/compressed/vmlinux目標下執行:$(call if_changed,ld)鏈接后成功得到arch/arm/boot/compressed/vmlinux

  4.  回到arch/arm/boot/Makefile/zImage執行命令:$(call if_changed,objcopy)得到zImage

總結

  簡單的說,根目錄下編譯得到的vmlinux內核先生成image文件,用gzip工具將image壓縮成piggy.gzip並且被包含到piggy.s中。通過編譯生成的head.o,piggy.gzip.o,misc.o...鏈接成新的vmlinux,最后用objdump工具得到zimage。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM