1、zImage的组成
zImage是由一个压缩后的内核piggy.o,连接上一段初始化及解压功能的代码(head.o misc.o)组成的。
2、Linux的入口
内核从什么地方开始运行呢?当然要看lds文件啦。zImage的 生成经历了两次大的链接过程:
一次是顶层根目录下vmlinux的生成,由arch/arm/boot/vmlinux.lds(这个lds文件是由 arch/arm/kernel/vmlinux.lds.S生成的)决定;
另一次是arch/arm/boot/compressed/vmlinux 的生成,是由arch/arm/boot/compressed/vmlinux.lds(这个lds文件是由 arch/arm/boot/compressed/vmlinux.lds.in生成的)决定。
所以,zImage的入口点应该由 arch/arm/boot/compressed/vmlinux.lds决定。截取/vmlinux.lds部分内容,如下所示。从中可以看出入口点为‘_start’
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
. = 0;
_text = .;
.text : {
_start = .;
*(.start)
*(.text)
……
}
并且,arch/arm/boot/compressed/Makefile里有如下两句:
HEAD = head.o
$(obj)/vmlinux: $(obj)/vmlinux.lds $(obj)/$(HEAD) $(obj)/piggy.o \
$(addprefix $(obj)/, $(OBJS)) FORCE
所以,zImage的入口点便是arch/arm/boot/compressed/head.S里的start。其整个流程如下: