摘 要:Bootloader是嵌入式系统软件开发的第一个环节,用于初始化目标板硬件,给嵌入式操作系统提供板上硬件资 源信息,并进一步装载、引导嵌入式系统的固件,其性能直接影响系统的稳定性。为了引导嵌入式操作系统,根据S3C44BO 开发板上特定的硬件信息,在不改变Bootloader架构的前提下,对与硬件相关的代码,特别是FLASH芯片Intel 28F320C3B 代码进行了添加修改,将U-bOOt成功地移植到了开发板上,并在基于μCLinux的智能机器人避障系统中使用良好。
关键词:Bootloader;U-boot;S3C44BO;移植
O 引 言
Bootloader是操作系统启动运行之前执行的一段小程序。它是基于特定硬件平台实现的,通过它可以初始化硬件设备,建立内存空间的映射表,从而建立适当的系统软硬件环境,为最终调用操作系统内核作好准备。嵌入式系统的硬件部分不可能完全一致,由于嵌入式系统需要硬件与软件的配合才能正常工作,因此需要针对硬件系统进行有关引导程序的设计。对于嵌入式系统来说,引导程序比较复杂,一般采用在基本符合硬件体系要求的现有引导程序的基础上进行修改,然后通过应用的方法设计引导程序,这就是引导程序的移植。
1 U-boot介绍
U—boot(Universal Boot LoadeI)源自DENX软 件工程中心的Wolfgang Denk,基于8xxrom的源码创 建的PPCBoot工程,遵循GPL条款的开放源码项目,已经可以支持PowerPC,ARM,X86,MIPS等体系结构上的上百种开发板。U-boot提供:启动加载(Boot
Loading)和下载(Down Loading)两种操作模式。并具 有大型Bootloader的全部功能。主要特性有:SCC/ FEC以太网支持;BOOTP/TFTP引导——IP,MAC 预置功能;在线读写FLASH,DOC,IDE,I2C,E2ROM, RTC;支持串行口kermit,S-record下载代码;识别二进制、ELF32,pImage格式的Image;对Linux引导有特别的支持;监控(minitor)命令集;具有读写I/O、内存、寄存器、外设测试等功能。
U-boot还支持多种文件系统,如cramfs,ext2, fat,reiserfs和jffs2等;支持多种嵌入式操作系统内核,如Linux,NetBSD,VxWorks,QNX,RTEMS,ARTOS 和LynxOS等,并对Linux引导有特别的支持。另外, U-boot还提供单任务软件运行环境,可以在没有操作系统的情况下动态加载和运行独立的应用程序,这些独立的应用程序可以利用U-boot提供控制台的I/O函数、内存申请和中断服务等。
2 U-boot启动流程
对ARM7核处理器,U-boot.启动流程主要体现在 3个文件上,即start.s,lib arm/board.c和U-boot/common/main.c。下面详细分析启动流程。
2.1 start.s文件
start.s文件主要是CPU的初始化,用汇编语言编写,其主要代码流程如下:
(1)定义入口。由于一个可执行的Image必须有一个入口点,并且只能有一个全局入口,通常这个入口放在ROM(FLASH)的Ox0地址,在start.s文件中有如下语句:
.globl_start
_start:
因此,必须通知编译器使其知道这个入口.该工作可通过修改连接器脚本文件U-boot.1ds来完成。
(2)设置异常向量(Exception Vector)。异常中断向量表是U-boot与操作系统内核发生联系的关键所在之一。即使操作系统内核已经得到处理器的控制权运行,一旦发生中断,处理器还是会自动跳转到从OxO地址开始的异常中断向量表中的某个位置(依据于中断类型)读取指令运行的。
(3)设置CPU的速度、时钟频率及中断控制寄存器。依次为关闭看门狗计时器,屏蔽所有中断,配置时钟(包括3个寄存器:PLLCON,CLKCON,LOCK-TIME)。
(4)初始化内存控制器。内存控制器初始化主要通过设置13个从1c80000开始的特殊功能寄存器来完成,包括外部数据总线宽度、访问周期、定时的控制信号等。
(5)将ROM中的程序复制到RAM中。首先利用PC取得BootLoader在FIASH的起始地址,再通过标号之差计算出这个程序代码的大小。通过寄存器(r3~r10)为复制的中间媒介将代码复制到RAM中。
(6)初始化堆栈。进入各种模式设置相应模式的堆栈。
(7)转到RAM中执行。该工作可使用指令1dr pc来完成,即Idr pc,start armboot。