close

<前言>

繼 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 是一樣的東西了.

arrow
arrow
    全站熱搜

    sakbk 發表在 痞客邦 留言(4) 人氣()