Linux核心zImage怎麼來的?

2022-08-02 06:57:09 字數 2406 閱讀 3742

以下內容基於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目標:

該命令為將在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。

Linux學習之zImage核心映象解壓過程詳解

zimage核心映象解壓過程詳解 本文以linux 2.6.14核心在s3c2410平台上執行為例,講解核心的解壓過程。核心編譯完成後會生成zimage核心映象檔案。關於bootloader載入zimage到核心,並且 跳轉到zimage開始位址執行zimage的過程,相信大家都很容易理解。但對於z...

zImage核心映象解壓過程詳解

在華清遠見教學過程中,發現很多學員對核心映象解壓過程比較感興趣,但網上相關的文章往往不能把關鍵問題講清楚,所以寫了這篇文章。本文以linux 2.6.14核心在s3c2410平台上執行為例,講解核心的解壓過程。核心編譯完成後會生成zimage核心映象檔案。關於bootloader載入zimage到核...

zImage核心映象解壓過程詳解

在華清遠見教學過程中,發現很多學員對核心映象解壓過程比較感興趣,但網上相關的文章往往不能把關鍵問題講清楚,所以寫了這篇文章。本文以linux 2.6.14核心在s3c2410平台上執行為例,講解核心的解壓過程。核心編譯完成後會生成zimage核心映象檔案。關於bootloader載入zimage到核...