微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM linux解析之zImage镜像文件的生成

ARM linux解析之zImage镜像文件的生成

时间:11-11 来源:互联网 点击:

的。

内容如下:

.text : {

_start = .;

*(.start)

*(.text)

*(.text.*)

*(.fixup)

*(.gnu.warning)

*(.rodata)

*(.rodata.*)

*(.glue_7)

*(.glue_7t)

*(.piggydata)

. = ALIGN(4);

}

是放在.text段的最后的,并且input_data和input_data_end包含里他们的起止地址。

最后是arch/arm/boot/compressed/vmlinux.lds文件的生成,这个是以arch/arm/boot/compressed/vmlinux.lds.in为蓝本,只是修改了

. = TEXT_START;

这个是在arch/arm/boot/compressed/Makefile中

SEDFLAGS = s/TEXT_START/$(ZTEXTADDR)/;s/BSS_START/$(ZBSSADDR)/

$(obj)/vmlinux.lds: $(obj)/vmlinux.lds.in arch/arm/boot/Makefile $(KCONFIG_CONFIG)

@sed "$(SEDFLAGS)" < $< > $@

ifeq ($(CONFIG_ZBOOT_ROM),y)

ZTEXTADDR:= $(CONFIG_ZBOOT_ROM_TEXT)

ZBSSADDR:= $(CONFIG_ZBOOT_ROM_BSS)

else

ZTEXTADDR:= 0

ZBSSADDR:= ALIGN(8)

endif

就是:TEXT_START = $(ZTEXTADDR)BSS_START = $(ZBSSADDR)

如果内枋是在nor flash中运行的,则选第一个,这时CONFIG_ZBOOT_ROM这个变量会定义,在RAM中运行的话,选第二个。在RAM中运行的代码是被编译成与位置无关的,所以可以加载到任何地方运行。

所以合起来的解释是:

通过以下规则,最终生成arch/arm/boot/compress/vmlinux

$(obj)/vmlinux: $(obj)/vmlinux.lds $(obj)/$(HEAD) $(obj)/piggy.$(suffix_y).o \

$(addprefix $(obj)/, $(OBJS)) $(lib1funcs) FORCE

$(call if_changed,ld)

@$(check_for_bad_syms)

这个arch/arm/boot/compressed/vmlinux和前面的根目录下生成的vmlinux都是elf文件,但是却不是同一个东西。它是包令里解压用的头文件head.s,解压程序misc.c,decompress.c的,再加入压缩内核的elf文件,是可以通过trace32加载运行的。

下面是最后一步:

$(obj)/Image: vmlinux FORCE

$(call if_changed,objcopy)

@echo Kernel: $@ is ready

这个时候再把arch/arm/boot/compressed/vmlinux通过objcopy生成bin文件zImage,到这里,zImage文件生成完毕。

最后用个图表示一下整个zImage的生成过程:

图1.ARM linux的zImage生成过程

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top