<前言>
繼 x86 之後 想說又來研究一下 zImage 含了什麼鬼東西 所以 在此做了一些紀綠.
<Trace>
下面這個是彷照 x86 的方式 把它 log 下來的message ...
在當設定完 ARCH=arm CROSS_COMPILE=path/to/your/toolchain 時 並 make 會在 kernel source tree 最上層目錄產出一個 vmlinux 這個檔案非常的大 因為它是一個沒有壓縮過的核心
make -f scripts/Makefile.build obj=arch/arm/boot MACHINE=arch/arm/mach-dove/ arch/arm/boot/uImage
arm-marvell-linux-gnueabi-objcopy -O binary -R .note -R .note.gnu.build-id -R .comment -S vmlinux arch/arm/boot/Image
Kernel: arch/arm/boot/Image is ready
(紅色字的 vmlinux 就是上面那一個很大的核心喔!)
經由 XXX-objcopy 這個 Image 是一個 移除 symbol 過後的 Image, size 小很多了
make -f scripts/Makefile.build obj=arch/arm/boot/compressed arch/arm/boot/compressed/vmlinux
(cat arch/arm/boot/compressed/../Image | gzip -f -9 > arch/arm/boot/compressed/piggy.gz) || (rm -f arch/arm/boot/compressed/piggy.gz ; false)
接下來 把這個 Image 直接透過 gzip 壓縮成 piggy.gz
arm-marvell-linux-gnueabi-gcc -Wp,-MD,arch/arm/boot/compressed/.piggy.o.d -nostdinc -isystem /home/chris/marvell/kernel/toolchain/Compiler/2008q3-13-4.2.0-LE-cross/arm-marvell-linux- gnueabi-hardvfp/bin/../lib/gcc/arm-marvell-linux-gnueabi/4.2.0/include -Iinclude -I/home/chris/marvell/asus-evb/5.0-asus/linux-2.6.32.3/arch/arm/include -include include/linux/autoconf.h -D__KERNEL__ -mlittle-endian -Iarch/arm/mach-dove/include -Iarch/arm/plat-orion/include -D__ASSEMBLY__ -mabi=aapcs-linux -mno-thumb-interwork -funwind-tables -D__LINUX_ARM_ARCH__=7 -march=armv7-a -include asm/unified.h -msoft-float -gdwarf-2 -Wa,-march=all -c -o arch/arm/boot/compressed/piggy.o arch/arm/boot/compressed/piggy.S
下面這個是 piggy.S 的 組合語言檔案
.section .piggydata,#alloc
.globl input_data
input_data:
.incbin "arch/arm/boot/compressed/piggy.gz"
.globl input_data_end
input_data_end:
可以看到 它會把剛剛 piggy.gz (Image 的 gzip 壓縮), 透過 piggy.S 輸出成 piggy.o
arm-marvell-linux-gnueabi-ld -EL --defsym zreladdr=0x00008000 --defsym initrd_phys=0x00800000 --defsym params_phys=0x00000100 -p --no-undefined -X /home/chris/marvell/kernel/toolchain/Compiler/2008q3-13-4.2.0-LE-cross/arm-marvell-linux-gnueabi-hardvfp/bin/../lib/gcc/arm-marvell-linux-gnueabi/4.2.0/libgcc.a -T arch/arm/boot/compressed/vmlinux.lds arch/arm/boot/compressed/head.o arch/arm/boot/compressed/piggy.o arch/arm/boot/compressed/misc.o -o arch/arm/boot/compressed/vmlinux
接著利用 linker 將 misc.o head.o piggy.o 整個包成 vmlinux (紅色字),其實這個名字 很容易和上面的 vmlinux 混淆 要特別注意 不然很容易不知道到底哪一個是誰
arm-marvell-linux-gnueabi-objcopy -O binary -R .note -R .note.gnu.build-id -R .comment -S arch/arm/boot/compressed/vmlinux arch/arm/boot/zImage
Kernel: arch/arm/boot/zImage is ready
最後在將 arch/arm/boot/compressed/vmlinux 輸出成 zImage.
仔細看一下, 在這三個 folder 下會產出下面幾個.o
arch/arm/boot/compressed/head.o
arch/arm/boot/compressed/misc.o
arch/arm/boot/compressed/piggy.o
基本上 (head.o + misc.o) 可以視為 bootstrap loader, 為什麼會這樣說呢? 是因為 head.o是和架構有關的 initial 接下來會交由 misc.o 將 kernel 解壓 在真正把控制權交給 kernel (piggy.o).
這個 arch/arm/boot/zImage 就是和我上一篇說的 u-boot 是一樣的東西了.
留言列表