ARMlinux内核启动分析.

ARM linux 内核启动分析[原创 2007-06-11 10:35:46 ] 发表者: jimmy_lee

head-armv.S主支分析

head-armv.S是解压后(或未压缩的内核最先执行的一个文件,这个文件位于arch/arm/kernel/head-armv.S,在与这个文件同目录下还有一个文件head-armo.S与head-armv.S

很相似,但从arch/arm/下的Makefile中可以看到区别在哪里:

ifeq ($(CONFIG_CPU_26,y PROCESSOR := armo

ifeq ($(CONFIG_ROM_KERNEL,y DATAADDR = 0x02080000 TEXTADDR = 0x03800000

LDSCRIPT = arch/arm/vmlinux-armo-rom.lds.in else

TEXTADDR = 0x02080000

LDSCRIPT = arch/arm/vmlinux-armo.lds.in endif endif

ifeq ($(CONFIG_CPU_32,y PROCESSOR = armv TEXTADDR = 0xC0008000

LDSCRIPT = arch/arm/vmlinux-armv.lds.in endif ……

HEAD :=arch/arm/kernel/head-$(PROCESSOR.o \\ arch/arm/kernel/init_task.o

闲话少说,在进入分析head-armv.S之前,交待一下我所分析的内核版本号以及硬件平台,内核是2.4.19-rmk7-pxa2,对应的硬件平台为pxa 270。

开篇说到,head-armv.S是进入内核最先执行的文件,为什么呢?内核可执行文件由许多链接在一起的对象文件组成。对象文件有许多节,如文本、数据、init 数据、bass 等等。这些对象

文件都是由一个称为link script的文件链接并装入的。这个link script的功能是将输入对象文件的各节映射到输出文件中;换句话说,它将所有输入对象文件都链接到单一的可执行文件中,将该可执行文件的各节装入到指定地址处。vmlinux-armv.lds就是链接内核用到的link

script,它位于arch/arm/目录下,你可能注意到了同目录下还有一vmlinux-armv.lds.in文件,这两文件可是有关系的,答案就在arch/arm/Makefile里。

ifeq ($(CONFIG_CPU_32,y /* 对于pxa 270来说这里是True */ PROCESSOR = armv TEXTADDR = 0xC0008000

LDSCRIPT = arch/arm/vmlinux-armv.lds.in endif

arch/arm/vmlinux.lds: arch/arm/Makefile $(LDSCRIPT \\

$(wildcard include/config/cpu/32.h \\ $(wildcard include/config/cpu/26.h \\ $(wildcard include/config/arch/*.h @echo ' Generating $@'

@sed 's/TEXTADDR/$(TEXTADDR/;s/DATAADDR/$(DATAADDR/' $(LDSCRIPT >$@

从这个Makefile中我们可以看到,实际上arch/arm/vmlinux-armv.lds.in就是arch/arm/vmlinux-armv.lds是一个蓝本,在make的时候vmlinux-armv.lds是由sed命令来替换vmlinux-armv.lds.in文件中的TEXTADDR, DATAADDR为特定的值而生成的。 接下来就来真正看一下vmlinux-armv.lds里面的内容:

OUTPUT_ARCH(arm ENTRY(stext SECTIONS {

. = 0xC0008000;

.init : { /* Init code and data*/ _stext = .; __init_begin = .; *(.text.init

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4