uboot:
cmd_bootm.c
do_bootm
printf(Uncompressing Kernel Image ... OK);
bootm.c
do_bootm_linux
printf(Starting kernel ...);
kernel:
boot/compress/misc.c
decompress_kernel
printf(Uncompressing Linux............. done, booting the kernel.);
内核生成一个没有经过处理的vmlinux文件
GZIP 压缩
1>arm-linux-objcopy -O binary -R .note -R .comment -S vmlinux linux.bin //转成二进制格式
2>gzip -9 linux.bin //压缩
3>mkimage -A arm -O linux -T kernel -C gzip -a 0x30008000 -e 0x000800 -n "Linux Kernel Image" -d linux.bin.gz -uImage //构造头部信息
LZMA 压缩
1>arm-linux-objcopy -O binary -R .note -R .comment -S vmlinux linux.bin
2>lzma -9 -f -S .lzma linux.bin
3>mkimage -A arm -O linux -T kernel -C lzma -a 0x30008000 -e 0x000800 -n "Linux Kernel Image" -d linux.bin.lzma -uImage
如果放到UBOOT里面解压 uboot do_bootm 函数会解压 GZIP 或LZMA
如果放到kernel里面解压 decompress_kernel函数会处理,前提是把内核$ARCH/boot/compressed/下面的 head.S misc.c打包到compress/vmlinux里面去
/compressed/head.S
bl decompress_kernel
/compressed/piggy.S
.incbin "arch/arm/boot/compressed/piggy.gz"
/compressed/misc.c
decompress_kernel
decompress_kernel(ulg output_start, ulg free_mem_ptr_p, ulg free_mem_ptr_end_p,int arch_id)
{
putstr("Uncompressing Linux...");
gunzip();
putstr(" done, booting the kernel.\n");
return output_ptr;
}
arm-none-linux-gnueabi-gcc -c -o arch/arm/boot/compressed/head.o arch/arm/boot/compressed/head.S
(cat arch/arm/boot/compressed/../Image | gzip -f -9 > arch/arm/boot/compressed/piggy.gz) || (rm -f arch/arm/boot/compressed/piggy.gz ; false)
arm-none-linux-gnueabi-gcc -c -o arch/arm/boot/compressed/piggy.o arch/arm/boot/compressed/piggy.S // include compressed/piggy.gz"
arm-none-linux-gnueabi-gcc -c -o arch/arm/boot/compressed/misc.o arch/arm/boot/compressed/misc.c
arm-none-linux-gnueabi-ld -EL --defsym zreladdr=0x20008000 --defsym params_phys=0x20000100 -p --no-undefined
-X ../lib/gcc/arm-none-linux-gnueabi/4.3.2/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