- 获得 ecos 代码
- 编译 RedBoot
- 编译 zImage 和 ramdisk.gz
- eCos Makefile
- RedBoot Makefile
获得 ecos 代码
该篇开始分析 RedBoot 源码,源代码选取了 ecos-2.0.i386linux.tar.bz2。你可以在 ecos 官网选取镜像来下载代码。
而本节将选取我曾使用的 Cirrus BSP (EP9302)来作参考,BSP是开发板提供商完成的 系统套件,他包括了 Bootloader,Linux,还有其他系统工具和应用软件等等。BSP下载位 置如下,作为源代码演练,自然选择linux_1-0-3-src.tar.bz2 http://arm.cirrus.com/files/linux/releases/linux-2.6/1.0.3
编译过程
在这里重点讲述Cirrus BSP 中 eCos 的编译过程。 我曾经在博客中提到过老版本 BSP 的构建方法,简要介绍了如何使用 Cirrus 的 BSP 来生 成 redboot.bin。
时隔多日 Cirrus Logic 已经更新了新的 BSP,他将构建过程和所需的软件包分开,所有的 目标文件都剥离出来,在make的时候通过网络的形式获取。另外使用 menuconfig 方式简化 了配置,用他来构建代码更加方便。
下面就来介绍新型的 BSP 的构建方式 —-
编译环境构建
首先我们需要 arm-linux-gcc 来构建编译环境,另外 RedBoot 需要 arm-elf-gcc 来链接。 这在 linux_1-0-3-src.tar.bz2 的 README.BUILDING 中都有提到。
wick@ project: wget http://arm.cirrus.com/files/tools/arm-linux-gcc-3.4.3-1.0.1.tar.bz2解压生成了 /usr/local/arm/3.2.1-elf 和 /opt/buildroot,然后将工具集合加入到PATH 环境变量。你可以将export语句加入到启动脚本中,保证开机即可找到 arm 工具链.
wick@ project: wget http://arm.cirrus.com/files/tools/arm-elf-gcc-3.2.1-full.tar.bz2
wick@ project: sudo tar arm-linux-gcc-3.4.3-1.0.1.tar.bz2 -C /
wick@ project: sudo tar arm-elf-gcc-3.2.1-full.tar.bz2 -C /
wick@ project: export PATH="/usr/local/arm/3.4/bin:/usr/local/arm/3.2.1-elf/bin:$PATH"
编译 RedBoot
wick@ project: tar jxf linux_1-0-3-src.tar.bz2通过解压得到源代码,然后进入主目录menuconfig菜单,显得非常简洁(而且亲切:-)
wick@ linux-crater_1-0-3: cd linux-crater_1-0-3
wick@ linux-crater_1-0-3: cp defconfigs/edb9302_bsp .config
wick@ linux-crater_1-0-3: make menuconfig
- Boot options,根据工具链填写你的位置
- Linux kernel for EP9XXX,填写你的开发板型号,我的是 EP9302
- Bootloader Options,选上 RedBoot 和 EP9302
- Individual Package Selection,选上你的工具集合
- Targer Options,我们的ramdisk!选择ext2吧。
最后编译:
wick@ linux-crater_1-0-3: make redboot
编译 zImage 和 ramdisk.gz
下面是内核镜像和内存盘的编译,我均采用默认config,尽量保证没有作太多修改。
wick@ linux-crater_1-0-3: make
最终得到的 是以下images三个文件:
redboot.bin, zImage, ramdisk.gz
eCos Makefile
开始进入代码的领域,RedBoot来自eCos,他的代码位于 linux-crater_1-0-3/build/ecos
wick@ ecos: tree -L 1其中 packages 装有 eCos 所有的源代码,内含多个CPU支持。eCos提供了大量的选项来提 供支持,通过工具我们可以轻松构建我们需要的目标代码。现在讲述目标代码构建过程。
.
|-- acsupport
|-- build
|-- doc
|-- ecos
|-- examples
|-- packages
|-- COPYING
|-- ChangeLog
|-- Makefile.am
|-- Makefile.in
|-- README.host
|-- acinclude.m4
|-- aclocal.m4
|-- configure
|-- configure.in
`-- redboot.9302.bin
6 directories, 10 files
大致一看,linux-crater_1-0-3/Makefile 里是没有 bootloader 或者 RedBoot 描述的, 他被包含在了 packages 目录中。
include packages/kernel/*/*.mk我们最终会探测到 packages/bootloader/ecos/ecos.mk,他是 redboot.bin 的工程文件。
include packages/bootloader/*/*.mk
include packages/*/*.mk
include packages/rootfs/*/*.mk
ecos.mk一大段,要一一说来实在费心,主要的步骤也非是获取源代码包、解压、打包、配 置和编译、放置好位置。其中最主要的一段,当属 —-
( cd $(ECOS_DIR)/build ; \要看清楚这一段,必须清楚 ecosconfig 工具和 ecos 代码树的形成。基本上讲, ecosconfig new 是按照 redboot 模板生成 Cirrus edb93xx 的ecos.ecc脚本,然后添加配 置脚本,最后使用 ecosconfig tree 生成代码树。
export ECOS_REPOSITORY=$(ECOS_DIR)/packages ; \
PATH=$(BASE_DIR)/packages/bootloader/ecos:$(ECOS_CC_PATH):$$PATH ; \
ecosconfig new $(PROC) redboot; \
ecosconfig import $(ECOS_REPOSITORY)/$(ECM); \
ecosconfig import $(BOARD_VARIANT).ecm; \
ecosconfig tree ; \
make clean ; \
make ; )
ecos 代码解压位置在 linux-crater_1-0-3/build/ecos/ EDB9302 代码树的位置在 linux-crater_1-0-3/build/ecos/build
RedBoot Makefile
我们来检查上述提到的 make 的行为。
# ./build/ecos/build/makefilemakefile的主要object就是build,从这里看到了build要作的事情。在后面我们找到了链接 脚本 $(PREFIX)/lib/target.ld,他在人群中是如此的闪光……
# ...
build: headers $(PREFIX)/include/pkgconf/ecos.mak
$(MAKE) -r -C hal/arm/arch/current arm.inc
$(MAKE) -r -C hal/arm/arch/current $@
$(MAKE) -r -C hal/arm/arm9/var/current $@
$(MAKE) -r -C hal/arm/arm9/edb93xx/current $@
$(MAKE) -r -C devs/flash/arm/edb93xx/current $@
$(MAKE) -r -C devs/eth/arm/edb93xx/current $@
$(MAKE) -r -C hal/common/current $@
$(MAKE) -r -C infra/current $@
$(MAKE) -r -C redboot/current $@
$(MAKE) -r -C isoinfra/current $@
$(MAKE) -r -C language/c/libc/string/current $@
$(MAKE) -r -C services/crc/current $@
$(MAKE) -r -C devs/flash/intel/strata/current $@
$(MAKE) -r -C io/flash/current $@
$(MAKE) -r -C io/eth/current $@
$(MAKE) -r -C hal/common/current $(PREFIX)/lib/extras.o
$(MAKE) -r -C hal/arm/arch/current $(PREFIX)/lib/vectors.o
$(MAKE) -r -C hal/arm/arch/current $(PREFIX)/lib/target.ld
$(MAKE) -r -C redboot/current $(PREFIX)/bin/redboot.elf
$(MAKE) -r -C hal/arm/arm9/edb93xx/current $(PREFIX)/bin/redboot.bin
@echo $@ finished
STARTUP(vectors.o)我们只要看target.ld的前三段,可以看出内核的总入口是reset_vector,他位于vectors.o。 因此vectors.o将会是我们的重点。
ENTRY(reset_vector)
INPUT(extras.o)
[...]
下一章我们就深入到第一个汇编源代码文件 vectors.S,来查看 ARM 初始化的内幕。



