基于ARM 的Linux 的启动分析报告——ARM+Linux的启动分析(1)
2010-06-21 10:18
423 查看
基于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-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的启动分析(2)
- 基于ARM 的Linux 的启动分析报告——ARM+Linux的启动分析(5)
- 基于ARM 的Linux 的启动分析报告——ARM+Linux的启动分析(3)
- 基于ARM 的Linux 的启动分析报告——ARM+Linux的启动分析(4)
- 基于Arm 的linux 的启动分析
- 基于Arm 的linux 的启动分析
- 基于S3C2410-ARM Linux启动过程分析
- 基于arm的Linux的启动分析(至start_kernel)
- 基于Arm 的linux 的启动分析
- 基于arm的Linux的启动分析(至start_kernel)
- 基于Arm 的linux 的启动分析
- ARM linux的启动部分源代码简略分析(精)
- ARM-Linux移植之(三)——init进程启动流程分析
- u-boot 分析 - [嵌入式Linux系统开发技术详解-基于ARM] [转贴]
- arm-linux内核start_kernel之前启动分析(1)-接过bootloader的衣钵
- Arm&nbsp;linux启动分析(1)
- Arm&nbsp;linux启动分析(5)
- Atmel at91rm9200的armlinux的bootloader启动代码分析
- linux启动流程分析(基于ARM架构)
- arm-linux head.s 分析 基于mini2440 uboot后的解压过程