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.mapuboot镜像的符号表
ubootuboot镜像的ELF格式
uboot.binboot镜像的二进制格式
uboot.srecuboot镜像的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地址updateruboot自动更新升级工具

这些工具都有源代码,可以参考改写它们。其中mkimage是很常用的一个工具,Linux的内核映象和initramfs文件系统映像都可以用该工具转换成u-boot所需的格式。

参考资料:《深度实践嵌入式Linux系统移植 》 范展源 刘韬著

所有资料来源网上,与朋友分享 u-boot-1.1.6之cpu/arm920t/start.s分析 2 u-boot中.lds连接脚本文件的分析 12 分享一篇我总结的uboot学习笔记(转) 15 U-BOOT内存布局及启动过程浅析 22 u-boot中的命令实现 25 U-BOOT环境变量实现 28 1.相关文件 28 2.数据结构 28 3.ENV 的初始化 30 3.1env_init 30 3.2 env_relocate 30 3.3*env_relocate_spec 31 4. ENV 的保存 31 U-Boot环境变量 32 u-boot代码链接的问题 35 ldr和adr在使用标号表达式作为操作数的区别 40 start_armboot浅析 42 1.全局数据结构的初始化 42 2.调用通用初始化函数 43 3.初始化具体设备 44 4.初始化环境变量 44 5.进入主循环 44 u-boot编译过程 44 mkconfig文件的分析 47 从NAND闪存中启动U-BOOT的设计 50 引言 50 NAND闪存工作原理 51 从NAND闪存启动U-BOOT的设计思路 51 具体设计 51 支持NAND闪存的启动程序设计 51 支持U-BOOT命令设计 52 结语 53 参考文献 53 U-boot给kernel传参数和kernel读取参数—struct tag (以及补充) 53 1 、u-boot 给kernel 传RAM 参数 54 2 、Kernel 读取U-boot 传递的相关参数 56 3 、关于U-boot 中的bd 和gd 59 U-BOOT源码分析及移植 60 一、u-boot工程的总体结构: 61 1、源代码组织 61 2.makefile简要分析 61 3、u-boot的通用目录是怎么做到与平台无关的? 63 4、smkd2410其余重要的文件 : 63 二、u-boot的流程、主要的数据结构、内存分配 64 1、u-boot的启动流程: 64 2、u-boot主要的数据结构 66 3、u-boot重定位后的内存分布: 68 三、u-boot的重要细节 。 68 关于U-boot中命令相关的编程 : 73 四、U-boot在ST2410的移植,基于NOR FLASH和NAND FLASH启动。 76 1、从smdk2410到ST2410: 76 2、移植过程: 76 3、移植要考虑的问题: 77 4、SST39VF1601: 77 5、我实现的flash.c主要部分: 78 6、增加从Nand 启动的代码 : 82 7、添加网络命令。 87
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值