|
三,arch/arm/boot/Makefile和arch/arm/boot/compressed/Makefile:
arch/arm/boot/Makefile原文摘要:
11 SYSTEM =$(TOPDIR)/vmlinux
35 ifeq ($(CONFIG_ARCH_S3C2410),y)
36 ZTEXTADDR = 0x30f00000
37 ZRELADDR = 0x30008000
38 endif
123
zImage: $(CONFIGURE) compressed/vmlinux
124 $(OBJCOPY) -O binary -R .note -R
.comment -S compressed/vmlinux $@
129
compressed/vmlinux: $(TOPDIR)/vmlinux dep
130 @$(MAKE) -C compressed vmlinux
显然SYSTEM即代表了前文提到的非压缩内核镜像文件。
ZTEXTADDR:非压缩内核的加载(物理)地址。
ZREALADDR:非压缩内核的运行地址,也是个物理地址。
由123行可知,zImage是由compressed/vmlinux得到的。
注意,该vmlinux并非前文所指的“非压缩内核镜像vmlinux”。
而129行中,compressed/vmlinux由compressed目录下的makefile (vmlinux目标)生成(见130行命令)。
请看compressed目录下的Makefile。
arch/arm/boot/compressed/Makefile原文摘要:
10 HEAD = head.o
11 OBJS = misc.o
14 ZLDFLAGS = -p -X -T vmlinux.lds
36 ifeq ($(CONFIG_ARCH_S3C2410),y)
37 OBJS += head-s3c2410.o
38 endif
72 SEDFLAGS =
s/TEXT_START/$(ZTEXTADDR)/;s/LOAD_ADDR/$(ZRELADDR)/;s/BSS_START/$(ZBSSADDR)/
78 vmlinux: $(HEAD) $(OBJS) piggy.o vmlinux.lds
79 $(LD) $(ZLDFLAGS) $(HEAD)
$(OBJS) piggy.o $(LIBGCC) -o vmlinux
84 piggy.o: $(SYSTEM)
85 $(OBJCOPY) -O binary -R .note
-R .comment -S $(SYSTEM) piggy
86 gzip $(GZFLAGS) < piggy
> piggy.gz
87 $(LD) -r -o $@ -b binary
piggy.gz
88 rm -f piggy piggy.gz
93 vmlinux.lds:
vmlinux.lds.in Makefile $(TOPDIR)/arch/$(ARCH)/boot/Makefile
$(TOPDIR)/.config
94
@sed "$(SEDFLAGS)" < vmlinux.lds.in > $@
首先来看10~38行,以及78-79行:对于s3c2410的开发板
Compressed/vmlinux=HEAD+OBJS+piggy.o
=head.o+head-s3c2410.o+misc.o+piggy.o
继续往下84-87行,分析得出,piggy.o其实是经过gzip压缩的vmlinux(请看上文提到的SYSTEM变量定义)。Misc.o包含了解压函数decompressed_kernel。
Ld是如何组合这些目标文件的,那就要查ZLDFLAGS标志了:显然,是根据compressed目录下的vmlinux.lds文件组织的。
而vmlinux.lds是在93-94行生成的: sed命令,按照SEDFLAGS,替换vmlinux.Lds.in
里面的相关字符。即:TEXT_START= ZTEXTADDR;LOAD_ADDR= ZRELADDR;BSS_START= ZBSSADDR,
最后生成了vmlinux.lds文件。在vmlinux.lds文件中我们发现LOAD_ADDR是等于0x30008000的。
四,本章总结
1,zImage的组成总结
1)SYSTEM=$(TOPDIR)/vmlinux
= head-armv.o+init_task.o+init/main.o+init/version.o+核心+驱动+网络+库.
Ld链接文件arch/arm/vmlinux.lds
2)Piggy.o=gzip压缩的SYSTEM
3)compressed/vmlinux=head.o+head-s3c2410.o+misc.o+piggy.o
Ld链接文件arch/arm/boot/compressed/vmlinux.lds
4)zImage=compressed/vmlinux
2,入口总结
1)压缩内核zImage的入口: head.S文件中start。
执行完head.S和head-s3c2410.S 中的“.start”段 后,返回执行head.S 的“.text”段
2)非压缩内核vmlinux的入口:head-armv.S中的stext 入口
3),在我的blog上建立了本书的讨论主题,http://eesdn.cn/blog.阅读过程中的FAQ可以在这里找到.