基于ARM 的Linux 的启动分析报告——ARM+Linux的启动分析(1)

基于ARM 的Linux 的启动分析报告
摘要:本文主要分析基于ARM 的Linux-2.2.26 内核启动过程。将首先从/
arch/arm/Makefile着手,介绍三种不同的启动方案,再剖析典型的压缩内核
zImage启动方案的代码结构,最后将详细分析这种方案的启动过程,直到调用
start_kernel()为止。
1、Linux 内核的启动方案:
由/arch/arm/Makefile的代码可以看出,主要有三种启动方案,分别是:
echo '* zImage - Compressed kernel image (arch/$
(ARCH)/boot/zImage)'
echo ' Image - Uncompressed kernel image (arch/$
(ARCH)/boot/Image)'
echo ' bootpImage - Combined zImage and initial RAM disk'
echo ' (supply initrd image via make variable INITRD=<path>)'
Linux内核有两种映像:一种是非压缩内核,叫 Image,另一种是它的压缩版
本,叫zImage。根据内核映像的不同,Linux内核的启动在开始阶段也有所不同。
zImage是Image经过压缩形成的,所以它的大小比 Image小。但为了能使用
zImage,必须在它的开头加上解压缩的代码,将 zImage解压缩之后才能执行,
因此它的执行速度比Image要慢。但考虑到嵌入式系统的存储空容量一般比较小,
采用zImage可以占用较少的存储空间,因此牺牲一点性能上的代价也是值得的。
所以一般的嵌入式系统均采用压缩内核的方式(另外bootpImage 是编译包含
zImage和initrd的映像,可以通过make变量INITRD=<path>提供initrd映像)。
2、基于zImage 的启动方案。
1、zImage 的生成过程
1、编译链接vmlinux
2、生成vmlinux.lds链接脚本
3、链接生成zImage
2、zImage 的代码结构
在内核编译完成后会在arch/arm/boot/下生成zImage。
#arch/arm/boot/Makefile:
$(obj)/zImage: $(obj)/compressed/vmlinux FORCE
$(call if_changed,objcopy)
@echo ' Kernel: $@ is ready'
由此可见,zImage的是elf格式的,由内核顶层目录下的
arch/arm/boot /compressed/vmlinux二进制化得到的:
#arch/armboot/compressed/Makefile:
$(obj)/vmlinux: $(obj)/vmlinux.lds $(obj)/$(HEAD) $(obj)/piggy.o /
$(addprefix $(obj)/, $(OBJS)) FORCE
$(call if_changed,ld)
@:
$(obj)/piggy.gz: $(obj)/../Image FORCE
$(call if_changed,gzip)
$(obj)/piggy.o: $(obj)/piggy.gz FORCE
总结一下zImage 的组成,它是由一个压缩后的内核piggy.o,连接
上一段初始化及解压功能的代码(head.o misc.o)组成的。

你可能感兴趣的:(基于ARM 的Linux 的启动分析报告——ARM+Linux的启动分析(1))