
U-Boot
U-Boot,全称 Universal Boot Loader,是遵循GPL条款的开放源码项目。U-Boot的作用是系统引导。U-Boot从FADSROM、8xxROM、PPCBOOT逐步发展演化而来。其源码目录、编译形式与Linux核心很相似,事实上,不少U-Boot源码就是根据相应的Linux核心源程式进行简化而形成的,尤其是一些设备的驱动程式,这从U-Boot源码的注释中能体现这一点。
基本介绍
- 中文名:U-Boot
- 全称:Universal Boot Loader
- 类型:开放源码项目
- 特点:遵循GPL条款
简介
U-Boot不仅仅支持嵌入式Linux系统的引导,它还支持NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS, android嵌入式作业系统。其目前要支持的目标作业系统是OpenBSD, NetBSD, FreeBSD,4.4BSD, Linux, SVR4, Esix, Solaris, Irix, SCO, Dell, NCR, VxWorks, LynxOS, pSOS, QNX, RTEMS, ARTOS, android。这是U-Boot中Universal的一层含义,另外一层含义则是U-Boot除了支持PowerPC系列的处理器外,还能支持MIPS、 x86、ARM、NIOS、XScale等诸多常用系列的处理器。这两个特点正是U-Boot项目的开发目标,即支持儘可能多的嵌入式处理器和嵌入式作业系统。就目前来看,U-Boot对PowerPC系列处理器支持最为丰富,对Linux的支持最完善。其它系列的处理器和作业系统基本是在2002年11 月PPCBOOT改名为U-Boot后逐步扩充的。从PPCBOOT向U-Boot的顺利过渡,很大程度上归功于U-Boot的维护人德国DENX软体工程中心Wolfgang Denk[以下简称W.D]本人精湛专业水平和执着不懈的努力。当前,U-Boot项目正在他的领军之下,众多有志于开放源码BOOT LOADER移植工作的嵌入式开发人员正如火如荼地将各个不同系列嵌入式处理器的移植工作不断展开和深入,以支持更多的嵌入式作业系统的装载与引导。

选择U-Boot的理由:
① 开放源码;
② 支持多种嵌入式作业系统核心,如Linux、NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS, android;
③ 支持多个处理器系列,如PowerPC、ARM、x86、MIPS;
④ 较高的可靠性和稳定性;
⑤ 高度灵活的功能设定,适合U-Boot调试、作业系统不同引导要求、产品发布等;
⑥ 丰富的设备驱动源码,如串口、乙太网、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、键盘等;
⑦ 较为丰富的开发调试文档与强大的网路技术支持;
目录结构
* board 目标板相关档案,主要包含SDRAM、FLASH驱动;
* common 独立于处理器体系结构的通用代码,如记忆体大小探测与故障检测;
* cpu 与处理器相关的档案。如mpc8xx子目录下含串口、网口、LCD驱动及中断初始化等档案;
* driver 通用设备驱动,如CFI FLASH驱动(目前对INTEL FLASH支持较好)
* doc U-Boot的说明文档;
* examples可在U-Boot下运行的示例程式;如hello_world.c,timer.c;
* include U-Boot头档案;尤其configs子目录下与目标板相关的配置头档案是移植过程中经常要修改的档案;
* lib_xxx 处理器体系相关的档案,如lib_ppc, lib_arm目录分别包含与PowerPC、ARM体系结构相关的档案;
* net 与网路功能相关的档案目录,如bootp,nfs,tftp;
* post 上电自检档案目录。尚有待于进一步完善;
* rtc RTC驱动程式;
* tools 用于创建U-Boot S-RECORD和BIN镜像档案的工具;
(以上关于目录结构的说明只适应u-boot-2010.06之前版本。u-boot-2010.06之后目录结构改变
1.cpu与lib_arch合二为一,命名arch
2.增加include folder
3.分离出通用库资料夹lib
)
主要功能
U-Boot可支持的主要功能列表:
*系统引导支持NFS挂载、RAMDISK(压缩或非压缩)形式的根档案系统;支持NFS挂载、从FLASH中引导压缩或非压缩系统核心;
* 基本辅助功能强大的作业系统接口功能;可灵活设定、传递多个关键参数给作业系统,适合系统在不同开发阶段的调试要求与产品发布,尤以Linux支持最为强劲;支持目标板环境参数多种存储方式,如FLASH、NVRAM、EEPROM;
* CRC32校验可校验FLASH中核心、RAMDISK镜像档案是否完好;
* 设备驱动串口、SDRAM、FLASH、乙太网、LCD、NVRAM、EEPROM、键盘、USB、PCMCIA、PCI、RTC等驱动支持;
* 上电自检功能SDRAM、FLASH大小自动检测;SDRAM故障检测;CPU型号;
* 特殊功能XIP核心引导;
工作模式
U-Boot的工作模式有启动载入模式和下载模式。启动载入模式是Bootloader的正常工作模式,嵌入式产品发布时,Bootloader必须工作在这种模式下,Bootloader将嵌入式作业系统从FLASH中载入到SDRAM中运行,整个过程是自动的。下载模式就是Bootloader通过某些通信手段将核心映像或根档案系统映像等从PC机中下载到目标板的FLASH中。用户可以利用Bootloader提供的一些命令接口来完成自己想要的操作。
启动流程
大多数BootLoader都分为stage1和stage2两大部分,U-boot也不例外。依赖于cpu体系结构的代码(如设备初始化代码等)通常都放在stage1且可以用彙编语言来实现,而stage2则通常用C语言来实现,这样可以实现複杂的功能,而且有更好的可读性和移植性。
1、 stage1(start.s代码结构)
U-boot的stage1代码通常放在start.s档案中,它用彙编语言写成,其主要代码部分如下:
(1) 定义入口。由于一个可执行的image必须有一个入口点,并且只能有一个全局入口,通常这个入口放在rom(Flash)的0x0地址,因此,必须通知编译器以使其知道这个入口,该工作可通过修改连线器脚本来完成。
(2)设定异常向量(exception vector)。
(3)设定CPU的速度、时钟频率及中断控制暂存器。
(4)初始化记忆体控制器 。
(5)将rom中的程式複製到ram中。
(6)初始化堆叠 。
(7)转到ram中执行,该工作可使用指令ldrpc来完成。
2、 stage2(C语言代码部分)
lib_arm/board.c中的start armboot是C语言开始的函式,也是整个启动代码中C语言的主函式,同时还是整个u-boot(armboot)的主函式,该函式主要完成如下操作:
(1)调用一系列的初始化函式。
(2)初始化flash设备。
(3)初始化系统记忆体分配函式。
(4)如果目标系统拥有nand设备,则初始化nand设备。
(5)如果目标系统有显示设备,则初始化该类设备。
(6)初始化相关网路设备,填写ip,c地址等。
(7)进入命令循环(即整个boot的工作循环),接受用户从串口输入的命令,然后进行相应的工作。