本文章首发地址:https://www.lgfccl.xyz 随时down 机,转载注明出处谢谢
UBOOT 概述
1 U-Boot简介
U-Boot,全称 Universal Boot Loader,是遵循 GPL 条款的开放源码项目。从 FADSROM、8xxROM、PPCBOOT 逐步发展演化而来。其源码目录、编译形式 与 Linux 内核很相似,事实上,不少 U-Boot 源码就是相应的 Linux 内核源程序的简化,尤其是一些设备的驱动程序,如网络设备、flash、ddr等,这从 U-Boot 源码的注释中能体现这一点。
U-Boot 不仅仅支持嵌入式 Linux 系统的引导,它还支持如NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS 嵌入式OS。硬件支持包括 MIPS、 x86、ARM、Powerpc、Zynq 等诸多常用处理器。 这两个特点正是 U-Boot 项目的开发目标,即支持尽可能多的嵌入式处理器和嵌 入式操作系统。
这个项目起源于 Magnus Damm.[1] 在 8xx PowerPC 架构下写的引导加载程序: 8xxROM。1999 年十月,Wolfgang Denk 将项目移转到 SourceForge.net,但 SourceForge.net 不允许数字开头的项目名称,所以改名为 PPCBoot。PPCBoot 在 2000年 7 月 19 日第一次公开发布 0.4.1 版。也正是因此,U-Boot对PPC支持最为丰富。
- 选择 u-boot 的理由:
开放源码
支持多种嵌入式OS,如 Linux、NetBSD、VxWorks、QNX等
支持多种处理器架构,如PowerPC、ARM、x86、MIPS、XScale、Zynq(ARM);
较高的可靠性和稳定性;
丰富的设备驱动源码,如串口、以太网、SDRAM、FLASH等;
较为丰富的开发调试文档与强大的网络技术支持;
2 目录结构
- 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之后目录结构改变
cpu与lib_arch合二为一,命名arch
增加include folder
分离出通用库文件夹lib
)
3 主要功能
U-Boot 可支持的主要功能如下:
- 系统引导,Linux 支持最为强劲;
- 支持NFS挂载、RAMDISK(压缩或非压缩)形 式的根文件系统;
- 支持NFS挂载、从FLASH中引导压缩或非压缩系统内核;
- 支持目标板环境参数多种存储方式,如FLASH、NVRAM、EEPROM;
- CRC32 校验,可校验 FLASH 中内核、RAMDISK 镜像文件是否完好;
- 设备驱动 串口、SDRAM、FLASH、以太网 、USB、PCMCIA、PCI、RTC 等驱动支持;
- 上电自检功能 SDRAM、FLASH 大小自动检测;SDRAM 故障检测;CPU型号;
- 特殊功能 XIP 内核引导;
二 UBOOT移植分析与流程
大多数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的工作循环),接受用户从串口输入的命令,然后进行相应的工作。
1 获取U-Boot源代码
如下举例,由于此服务器基本处于爹妈不维护状态,所以建议直接浏览器下载压缩包,或者wget下载,如果用git clone下载很慢。