内核启动解压过程

来源:互联网 发布:java 子类的构造器 编辑:程序博客网 时间:2024/06/03 07:35

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 

0 0
原创粉丝点击