uboot学习笔记之源码解读(一)

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 <board_name>_deconfig //board_name用具体的开发板SOC名称替换,完成编译配置
make  //执行编译uboot流程

(2)顶层Makefile文件

当执行make <board_name>_defconfig的时候,实际上执行的结果就是在Include目录下生成config.mk的Makefile配置文件,其中的内容就是制定编译uboot时候的信息:ARCH、CPU、BOARD、VENDOR、SOC等,以S3C2410为例:

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/<board_name>.h。<board_name>用相应的BOARD定义代替。

这些头文件中定义的选项或参数宏以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系统移植 》 范展源 刘韬著

猜你喜欢

转载自blog.csdn.net/CSDNmianfeixiazai001/article/details/81777126