Linux 有许多Boot Loader可用,比较常见的有U-boot,vivi,RedBoot等,本课程介绍U-boot的版级移植,对应的硬件平台是S3C2440。
嵌入式 系统中,系统上电或复位后,CPU通常从地址0X00000000处读取第一条指令开始执行,而Boot Loader就放置与此,他比较类似PC机的Bios。他的工作非常重要:初始化硬件设备、建立内存空间映像图,将硬件环境带到一个合适的状态。
一般我们可以把U-boot的启动过程分为两个阶段,阶段一和阶段二,第一阶段一般用汇编编写,第二阶段一般用C编写,具体如下
阶段一:
初始化基本的硬件设备(中断、关闭处理器的指令、数据Cache)
初始化系统内存
设置堆栈
跳转到第二阶段的C语言程序入口点。
阶段二:
初始化本阶段使用的硬件(串口、以太网口等)
检测系统内存映射
将内核镜像和根文件系统从Flash读到内存中。
为内核设置启动参数。
调用内核,将系统控制权交给内核。
下面我们来分析U-boot的源代码。ftp://ftp.denx.de/pub/u-boot/
下载U-boot 1.2.0 压缩包u-boot-1.2.0.tar.bz2 通过SSH上传到用户的跟目录/home/21iee 下,解压:
tar -jxvf u-boot-1.2.0.tar.bz2
通过SSH我们可以看到U-Boot源代码结构,如图:
U-Boot的源代码高度模块化。其中我们关心的主要目录有:
-
Board:U-boot 支持的开发板相关程序原代码。其中board/SMDK 2410目录包含了三星官方SMDK2410开发板的源文件。
-
Common: 与体系无关的文件。
-
cpu: 包含U-Boot所支持的所以CPU的源代码。S3C2440A属于ARM920T家族,所以只需要关心cpu/arm920t目录,其中start.S文件最终会成为u-boot.bin文件的第一段代码。
-
Drivers: 通用设备驱动程序,如串口,网口,usb等
-
Doc: 说明文档。
-
fs: U-Boot支持的文件系统。
-
include: 包含的头文件目录。其中include/configs/board_name.h中定义了所以和开发板相关的硬件资源配置参数,如网卡地址、内核启动参数、物理内存映射等。
-
lib_arm: 与arm体系结构有关的一些公用接口代码。
-
net: 网络相关代码。
-
tools: 编译相关工具。
在动手操作前,不管三七二十一,先编译一把 (我用的是GCC3.3.2的环境用3.4.1有一个error,可根据第二课内容更改bashrc文件修改)
命令为:Make smdk2410_config //smdk2410_config 是目标平台。
然后通过 make all 命令编译,几分钟后如果提示
说明U-Boot已经创建完成。
-----------------------------------------------------------------------------------------------------------------------
U-Boot移植到新的S3C2440A平台上,首先在board目录下增加一个新的开发板目录。
1.新建开发板目录,我取名为hztour2440A 。
在u-boot-1.2.0/board/ 下建立目录 hztour2440A ,该目录下需要几个基本文件:config.mk、flash.c、Makefile、mensetup.S、u-boot.lds ,以及以开发板命名的hztour2440A.c 文件。
cd board/ cp -arv smdk2410 hztour2440A //我们2440和2410类似,所以我们复杂smdk2410下的所有文件 mv hztour2440A/smdk2410.c hztour2440A/hztour2440A.c //重命名为hztour2440A.c |
2. 在include/configs/ 目录下建立目标板配置头文件。
cd include/configs cp smdk2410.h hztour2440A.h //复制smdk2410.h头文件 |
3.修改Makefile文件,添加编译项
hztour2440A_config: unconfig |
这里hztour2440A与board/目录下目标板文件夹名称hztour2440A一致。
4.确认编译环境(可选)
该Makefile 中定义了CROSS_COMPILE的值,用于在交叉编译时指定交叉编译器,默认为
ifeq ($(ARCH),arm) CROSS_COMPILE = arm-linux- //默认的 交叉编译器名的前缀,如果用crosstool生产的编译器,前缀该是 arm-9tdmi-linux-gnu- endif //也可以直接写路径 |
5.修改board/hztour2440A 下的Makefile
COBJS := hztour2440A.o flash.o |
6.测试编译
make hztour2440A_config //出现Configuring for hztour2440A board...提示,说明配置成功 make //测试编译 |
到这里为止,我们编译出来的这个u-boot还不 能真正适用于我们的目标板,只是实现了对新目标板的定义,接下来我们还要根据新的目标板的特性来移植,请关注 第四课 Boot Loader 移植(U-boot)之二的内容
作者:hztour 转载请注明出处