嵌入式Linux的核心鏡像生成過程
最近讀了《embedded linux primer》,裡面講到了Linux核心鏡像的生成過程。
感覺在這方面算是講的比較好的。在這裡翻譯一下。
頂層目錄的vmlinux
配置好交叉編譯環境後,就可以以開始準備編譯核心了。
首先需要編譯生成核心頭檔案,然後開始編譯核心。核心編譯完成後,會在
頂層目錄生成vmlinux ELF檔案。
這個vmlinux檔案包含整個核心代碼,包括注釋,調試符号資訊等。
piggy.o
piggy.o是包含經過壓縮的核心代碼的object檔案。piggy.o主要是為了友善與其他object檔案
連結生成最終Linux核心鏡像檔案。
生成piggy.o檔案主要包含:
- 利用objcopy去掉vmlinux的一些輔助資訊,生成鏡像檔案Image。
- 利用gzip将Image壓縮成piggy.gz。
- 利用asm編譯piggy.gzip.S生成piggy.o。
到此核心二進制鏡像制作完成。
Bootstrap Loader
許多CPU架構都設計成通過兩個階段來加載Linux核心鏡像。第一階段為BootLoader,
第二階段為Bootstrap Loader。每個階段都有各自的設計目的。
Bootstrap Loader主要提供檢查核心鏡像完整性,解壓核心鏡像,核心鏡像重定位功能。
Bootstrap Loader主要包括:
- misc.o 核心解壓,重定位相關代碼。
- head.o CPU啟動相關底層代碼。配置cache,建立C運作環境等。
- 其他.o
另一個vmlinux
将Bootstrap Loader和piggy.o連結成vmlinux。這個vmlinux在/arch/arm/boot/compressed/
目錄下。
zImage
使用objcpoy将剛剛提到的vmlinux打包成Boot Loader需要的zImage檔案。
結束
把之前的過程總結為下圖: