1、BootLoader介绍
对于计算机系统来说,从开机上电到操作系统启动需要一个引导过程。嵌入式Linux系统同样离不开引导程序,这个引导程序就叫作启动加载程序(Bootloader)。
Bootloader是在操作系统运行之前执行的一段小程序。通过这段小程序,可以初始化硬件设备、建立内存空间的映射表,从而建立适当的系统软硬件环境,为最终调用操作系统内核做好准备。对于嵌入式系统,Bootloader是基于特定硬件平台实现的。因此,几乎不可能为所有的嵌入式系统建立一个通用的Bootloader,不同的处理器架构都有不同的Bootloader。Bootloader不但依赖于CPU的体系结构,而且依赖于嵌入式系统板级设备的配置。对于两块不同的嵌入式板而言,即使它们使用同一种处理器,要想让运行在一块板子上的Bootloader程序也能运行在另一块板子上,一般都需要修改Bootloader的源程序。
2、uboot介绍
从上述描述,我们可以知道:
(1)在设备上电运行系统之前,需要先运行BootLoader。BootLoader为系统的运行准备好软硬件环境(软硬件初始化)。
(2)CPU架构、板载硬件资源任意一个不同,BootLoader程序代码都不同
虽然是这样,BootLoader仍然可以通过类似穷举一样,将各个CPU架构源代码都加入进来,使得整个源代码能支持更多的硬件,uboot就是其中做得比较好的,u-boot就同时支持PowerPC、ARM、MIPS和X86等体系结构,支持的板子有上百种。
uboot源码实质就是一个工程,使用Makefile管理,最早是德国的DENX软件公司的CEO:Wolfgang Denk创建,慢慢完善之后,现在u-boot已经支持PowerPC、ARM、X86、MIPS体系结构的上百种开发板,已经成为功能最多、灵活性最强,并且开发最积极的开源Bootloader。目前仍然由DENX的Wolfgang Denk维护。
3、获取uboot源码方式
u-boot的源码包可以从其官方网站下载:DENX的u-boot主页:http://www.denx.de/wiki/u-boot。
git源码库:git://www.denx.de/git/u-boot.git
4、uboot版本号
以前老版本的uboot代码版本号的命名规则是:u-boot-1.3.4.tar(及其以前的版本),之后的命名是以时间为标准:
U-Boot v2009.11 - 2009年11月的版本
U-Boot v2009.11.1 - 2009年11月发布的稳定版本1
U-Boot v2010.09-rc1 - 2010年9月发布的候选版本1
5、源码结构
以最新的u-boot-2018.09-rc2为例:
/arch Architecture specific files
/arc Files generic to ARC architecture
/arm Files generic to ARM architecture
/m68k Files generic to m68k architecture
/microblaze Files generic to microblaze architecture
/mips Files generic to MIPS architecture
/nds32 Files generic to NDS32 architecture
/nios2 Files generic to Altera NIOS2 architecture
/openrisc Files generic to OpenRISC architecture
/powerpc Files generic to PowerPC architecture
/riscv Files generic to RISC-V architecture
/sandbox Files generic to HW-independent "sandbox"
/sh Files generic to SH architecture
/x86 Files generic to x86 architecture
/api Machine/arch independent API for external apps
/board Board dependent files
/cmd U-Boot commands functions
/common Misc architecture independent functions
/configs Board default configuration files
/disk Code for disk drive partition handling
/doc Documentation (don't expect too much)
/drivers Commonly used device drivers
/dts Contains Makefile for building internal U-Boot fdt.
/examples Example code for standalone applications, etc.
/fs Filesystem code (cramfs, ext2, jffs2, etc.)
/include Header Files
/lib Library routines generic to all architectures
/Licenses Various license files
/net Networking code
/post Power On Self Test
/scripts Various build scripts and Makefiles
/test Various unit test files
/tools Tools to build S-Record or U-Boot images, etc.
第1类目录与处理器体系结构或开发板硬件直接相关。
第2类目录是一些通用的函数或驱动程序。
第3类目录是u-boot的应用程序、工具或文档。
6、uboot源码配置
uboot源码配置主要由两种方式:手动Makefile配置和图形化界面配置。其中手动Makefile配置的基本原理就是:执行make 板子名称_defconfig。注意,是否能够执行相关默认配置设置,主要还是看uboot源码是否有支持的配置文件,如果没有,查看源码doc/README.scrapyard文件,看看里面有没有你使用的芯片型号,如果有,那么就是不支持了。
第二种图形化界面配置,就是和内核源码配置一样,使用make menuconfig命令,使用图形化界面去配置。
7、uboot编译配置
u-boot的源码是通过GNU Makefile组织编译的。顶层目录下的Makefile完成对开发板的整体配置,然后递归调用各级子目录下的Makefile,最后把所有编译过的程序链接成u-boot映像。
(1)配置编译流程:
make _deconfig //board_name用具体的开发板SOC名称替换,完成编译配置
make //执行编译uboot流程
(2)顶层Makefile文件
当执行make
ARCH = arm
CPU = arm920t
BOARD = smdk2410
VENDOR = samsung
SOC = s3c24x0
这样硬件平台依赖的目录文件可以根据这些定义来确定。SMDK2410平台相关目录如下:
board/samsung/smdk2410/
cpu/arm920t/
cpu/arm920t/s3c24x0/
lib_arm/
include/asm-arm/
include/configs/smdk2410.h
再回到顶层目录的Makefile文件开始的部分,其中下列几行包含了对前面所述变量的定义。
# load ARCH, BOARD, and CPU configuration
include $(obj)include/config.mk
export ARCH CPU BOARD VENDOR SOC
Makefile的编译选项和规则在顶层目录的config.mk文件中定义。各种体系结构通用的规则直接在该文件中定义。通过ARCH、CPU、BOARD、SOC等变量为不同硬件平台定义不同选项。不同体系结构的规则分别包含在各自的lib_xxx(xxx表示体系架构,如lib_arm)目录下的config.mk文件中。
(3)开发板配置头文件
除了编译顶层Makefile以外,还要在移植时为开发板定义配置选项或参数。这个头文件是include/configs/
这些头文件中定义的选项或参数宏以CONFIG_为前缀,用来选择处理器、设备接口、命令、属性等。例如:
#define CONFIG_ARM920T 1
#define CONFIG_DRIVER_CS8900 1
8、 编译结果
编译完成后,可以得到u-boot各种格式的映像文件和符号表:
文件名称 | 功能说明 |
---|---|
system.map | uboot镜像的符号表 |
uboot | uboot镜像的ELF格式 |
uboot.bin | boot镜像的二进制格式 |
uboot.srec | uboot镜像的S-Record格式 |
u-boot的3种映像格式都可以烧写到Flash中,但需要看加载器能否识别这些格式。一般u-boot.bin最为常用,直接按照二进制格式下载,并且按照绝对地址烧写到Flash中即可。
9、uboot工具
在tools目录下会生成u-boot工具,这些工具有时也经常用到:
工具名称 | 功能说明 | 工具名称 | 功能说明 |
---|---|---|---|
bmp_logo | 制作logo的位图结构体 | img2srec | 转换S_Record格式镜像 |
envcrc | 校验uboot内部的环境变量 | mkiamge | 制作uImage格式镜像 |
get_eth_addr | 生成以太网接口MAC地址 | updater | uboot自动更新升级工具 |
这些工具都有源代码,可以参考改写它们。其中mkimage是很常用的一个工具,Linux的内核映象和initramfs文件系统映像都可以用该工具转换成u-boot所需的格式。
参考资料:《深度实践嵌入式Linux系统移植 》 范展源 刘韬著