zImage内核镜像解压过程详解

本文详细解析了Linux内核zImage在S3C2410平台上的解压过程,从zImage的生成到解压步骤,包括head.S的初始化工作,以及decompress_kernel函数如何解压内核并重定位。通过对lds文件、Makefile和源代码的分析,阐述了内核运行地址的确定、解压函数参数的物理含义以及如何找到压缩内核在zImage中的位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文以linux- 2.6.14 内核在S 3C 2410平台上运行为例,讲解内核的解压过程。

       内核编译完成后会生成zImage内核镜像文件。关于bootloader加载zImage到内核,并且跳转到zImage开始地址运行zImage的过程,相信大家都很容易理解。但对于zImage是如何解压的过程,就不是那么好理解了。本文将结合部分关键代码,讲解zImage的解压过程。

       先看看zImage的组成吧。在内核编译完成后会在arch/arm/boot/下生成zImage

arch/armboot/Makefile中:

$(obj)/zImage:  $(obj)/compressed/vmlinux FORCE

               $(call if_changed,objcopy)

由此可见,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

 

       其中Image是由内核顶层目录下的vmlinux二进制化后得到的。注意:arch/arm/boot/compressed/vmlinux是位置无关的,这个有助于理解后面的代码。,链接选项中有个 –fpic参数:

       EXTRA_CFLAGS  := -fpic                                                              

       总结一下zImage的组成,它是由一个压缩后的内核piggy.o,连接上一段初始化及解压功能的代码(head.o misc.o,组成的。

       下面就要看内核的启动了,那么内核是从什么地方开始运行的呢?这个当然要看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决定。从中可以看出入口点为‘_start

OUTPUT_ARCH(arm)

ENTRY(_start)

SECTIONS

{

  . = 0;

  _text = .;

  .text : {

    _start = .;

    *(.start)

    *(.text)

                     ……

}

      

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值