linux系统bootloader移植
bootloader基本概念
- Bootloader是硬件启动的引导程序,是运行操作系统的前提;
- 在操作系统内核或用户应用程序运行之前运行的一小段代码。对软硬件进行相应的初始化和设定,为最终运行操作系统准备好环境;
- 在嵌入式系统中,整个系统的启动加载任务通常由Bootloader来完成。
X86架构中叫BOIS程序,ARM架构中叫bootloader。
bootloader特点
- Bootloader不属于操作系统,一般采用汇编语言和C语言开发。需要针对特定的硬件平台编写。
- 在移植系统时,首先为开发板移植Bootloader。
- Bootloader不但依赖于CPU的体系结构,而且依赖于嵌入式系统板级设备的配置。
bootloader的操作模式
- 自启动模式:在这种模式下, Bootloader从目标机上的某个固态存储设备
上将操作系统加载到RAM中运行,整个过程并没有用户的介入。 - 交互模式:在这种模式下, 目标机上的Bootloader将通过串口或网络等通信手段从开发主机(Host)上下载内核映像和根文件系统映像等到RAM中。可以被Bootloader写到目标机上的固态存储媒质中,或者直接进行系统的引导。也可以通过串口接收用户的命令。
- 现在大多数ARM、X86、PowerPC架构都是用的U-boot通用引导程序。
1.在上电进入倒数的时候,按任意按键进入交互模式,按pri可以显示环境变量,也是是bootloader的配置信息,否则进入自启动模式。
2.U-boot属于bootloader里面的其中一种
u-boot介绍
- u-boot (Universal Boot Loader)是德国DENX小组开发的用于多种嵌入式CPU的
bootloader程序。遵循GPL条款。 - 从FADSROM, 8xxROM、PPCBOOT, Armboot逐步发展演化而来;
- 当前版本号:参考Makefile.
- http://www. denx. de/wiki/U-Boot/WebHome
- U-boot的特点:
-代码结构清晰、易于移植(见目录结构)
-支持多种处理器体系结构(见arch目录)
-支持众多开发板(目前官方包中有200多种,见board目录)
-命令丰富、有监控功能
-支持网络协议、USB,SD等多种协议和设备
-支持文件系统
-更新较活跃,使用者多,有助于解决问题
免费开源可深度定制
U-boot命令
- 命令分类:环境设置、数据传输、存储器访问、加载运行
1 | 1.显示所有环境变量 |
nor flash: 按字节读写,按块擦1->0,字节读程序可以直接执行不用读入内存,eeprom:按字节读写、擦除,nand falsh:按块擦除、读写
U-boot的编译
整个工程通过Makefile来组织编译。顶层目录下的Makefile中包含了开发板的配置信息。从顶层目录开始递归地调用各级子目录下的Makefile,最后链接成u-boot映像。
顶层目录下的Makefile:
它负责u-boot整体配置和编译。
在Makefile中指定使用的交叉工具链。
配置u-boot: make origen _config
编译: make
make -j2: 双核编译,u-boot可以使用脚本编译更方便
E4412这款芯片:三星芯片厂商把初始化时钟、中断等相关代码剥离出去了不开放源码,需要在u-boot.bin之前添加这部分代码。脚本图示:
- u-boot编译后的文件
u-boot.map U-boot映像的符号表(方便源码跟踪)
u-boot U-Boot映像的ELF格式
u-boot.bin U-Boot映像原始的二进制格式(烧录用),注意exynos4412需加入BLI
u-boot.srec U-Boot映像的S-Record格式
u-boot.lds U-Boot映像的链接文件,代码重定位
- 制作SD卡启动盘
1 | cp u-boot.bin ..../sdfuse_q |
- u-boot镜像下载
烧录编译产生的镜像u-boot.bin
1.初次或开发板代码损坏不能正常启动时,可采用JTAG工具烧录
2.专用的烧录工具如h-jtag或DNW等
3.在u-boot已经能工作,升级或修正U-boot时,可用U-boot中的命令来烧录
4.其它方式如SD卡 , Fastboot命令
镜像固化位置
1..ROM, NOR FLASH, NAND FLASH EMMC等
u-boot目录结构
- 平台相关:arch, board, include..
arch : cpu所在目录,按cpu架构区分。
board:单板(底板)外设目录,配置芯片、芯片管脚等。
- 平台无关:common, net, fs, drivers…
common:共同的部分,例如:各种命令pri、setenv
net:网络相关,例如:TCP/IP协议
fs: 文件系统
drivers: 驱动
- 工具和文档:tools, doc


U-BOOT启动流程
第一条指令如何执行?性能提升?
- 初始化哪些硬件,先后顺序如何(汇编)
1.设置为SVC模式获取最高权限、关闭看门狗、中断、MMU、Cache,保证稳定性。
2.时钟、串口、flash、内存,基本硬件初始化。
3.自搬移u-boot到内存。
4.设置栈,跳转第二阶段C代码。
- 如何加载内核(uImage)(C语言)
1.从flash或SD卡本地可以永久保存的地方读取。
2.将内核拷贝到内存运行。
3.内核接管启动。
u-boot启动过程中3个2:2种语言(汇编、C语言),2次搬移(u-boot、内核),2次初始化(基本芯片内部硬件、外设board板载硬件)
U-BOOT移植方法
1.善用对比软件Beyond
2.选择官方源码版本下载,配置编译
a,指定交叉编译工具链
b.指定cpu和board(参考最类似配置如origen)
c.编译
3.实现串口信息输出
a.跟踪运行路径(led点灯法)
b.串口输出(检查uart初始化相关部分代码见1owlevel init.s)
4.网卡移植(实现能用tftp nfs方便开发调试)
a.寄存器地址
b.参数设置
5.FLASH移植(实现能下载软件到FLASH,产品能离线运行)
