今天微博上看到宋宝华发的一张图,看着不错,保留了下来。
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/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同样如此
4 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通过分析这个头部知道
内核的相关信息