make uImage-uImage生成过程

时间:2023-02-09 16:37:18

今天微博上看到宋宝华发的一张图,看着不错,保留了下来。

make uImage-uImage生成过程

0 最顶层的vmlinux是如何生成的?

依据arch/arm/kernel/vmlinux.lds 生成linux内核源码根目录下的vmlinux,这个vmlinux属于未压缩,带调试

信息、符号表的最初的内核,我用linux3.4.2编译出来有45M; 

arm-linux-gnu-ld -EL  -p --no-undefined -X -o vmlinux -T arch/arm/kernel/vmlinux.lds 

-EL 文件小端存储,为默认

-T    连接依赖的脚本文件vmlinux.lds

built-in.o   是各个子目录下递归产生的中间文件,依次递归到内核根目录的built-in.o,就是vmlinux 

arch/arm/kernel/head.o  
arch/arm/kernel/init_task.o   
init/built-in.o  
--start-group   
usr/built-in.o   
arch/arm/kernel/built-in.o   
arch/arm/mm/built-in.o   
arch/arm/common/built-in.o   
arch/arm/mach-s3c2410/built-in.o   
arch/arm/nwfpe/built-in.o   
kernel/built-in.o          
mm/built-in.o   
fs/built-in.o   
ipc/built-in.o   
security/built-in.o   
crypto/built-in.o   
lib/lib.a   
arch/arm/lib/lib.a   
lib/built-in.o   
arch/arm/lib/built-in.o   
drivers/built-in.o   
sound/built-in.o   
net/built-in.o  

--end-group .tmp_kallsyms2.o 

1 arm-none-linux-gnueabi-objcopy -O binary -R .note -R .comment -S 

 vmlinux arch/arm/boot/Image

-R remove 删除某种信息

-S strip all 去掉一切不必要的

将上面的vmlinux去除调试信息、注释、符号表等内容,生成arch/arm/boot/Image,这是不带多余信息的linux内核,

Image的大小约4MB

2 gzip -f -9 

用gzip压缩Image文件,重定向到piggy.gz

-f force强制压缩

-9 最大比例压缩,默认为6

3 head.S  misc.c 实际目录为arch/arm/boot/compressed/

所以实际指令应该为

arm-none-linux-gnueabi-gcc -c -oarch/arm/boot/compressed/head.o arch/arm/boot/compressed/head.S

4、5同样如此

 arm-none-linux-gnueabi-gcc  -c -o piggy.o piggy.S

在linux2.6.22中是piggy.S,linux3.4.2中piggy.gz.S,内容完全相同

路径仍为arch/arm/boot/compressed/

指令应该同3类似,这里要说明piggy.S和piggy.gz的关系

实际上piggy.S只有6行内容,只是包含了piggy.gz,并把它放到某个段

5 、6不解释

7 把vmlinux再一次像第1步一样处理,去掉多余信息

8 给zImage加一个40h的头部组成uImage,uboot通过分析这个头部知道

内核的相关信息