u-boot分析 二 (u-boot目录结构)

时间:2023-01-20 05:23:06

u-boot分析 二


继前一启动篇,此博文目的:

学习u-boot的目录结构,从code架构上对u-boot有一个整体的把握和了解。


一、学习u-boot,得问,什么是u-boot?

u-boot是一段开源的程序。

Universal Boot Loader,普遍的引导程序。是非常常用的一个引导程序,可作为主流系统的引导程序,如OpenBSD, NetBSD, FreeBSD,4.4BSD, Linux, SVR4, Esix, Solaris等等,当然同时也支持多种常见的cpu处理器,如MIPS、 x86、ARM、NIOS、XScale等。

u-boot是一种普遍用于嵌入式系统中的Bootloader,Bootloader是在操作系统运行之前执行的一小段程序,通过它,我们可以初始化硬件设备、建立内存空间的映射表,从而建立适当的软硬件环境,为最终调用操作系统内核做好准备。Boot Loader的主要运行任务就是将内核映象从硬盘(e.g. NAND flash or eMMC)上读到RAM中,然后跳转到内核的入口点去运行,即开始启动操作系统。系统在上电或复位时通常都从地址0x00000000处开始执行,而在这个地址处安排的通常就是系统的Boot Loader程序。


二、u-boot目录结构

u-boot source code,无论是从网络下载(ftp://ftp.denx.de/pub/u-boot/)还是来自上一篇博客分享(http://pan.baidu.com/s/1kUhYmEj) ,第一次映入眼帘的风景基本是这样的:
u-boot分析 二 (u-boot目录结构)

u-boot目录结构,从u-boot-2010.06版本开始,相比老版本

  1. cpu与lib_arch合二为一,命名arch
  2. 增加include folder
  3. 分离出通用库文件夹lib

u-boot-2010.06及以后版本,基本目录结构如下表

Name Description
api 此目录下存放u-boot向外提供的接口函数
arch 与体系结构相关的代码,核心folder。s5p4418是arm体系结构。
board 此folder是根据不同的具体开发板而定制的代码,代码也不少
common 通用代码,涵盖各个方面,以命令行处理为主
disk 磁盘分区相关代码
doc 常见功能和问题的说明文档,一堆README开头的文件
drivers 常用的设备驱动程序,每个类型的设备驱动占用一个子目录
examples 示例程序
fs 文件系统,支持嵌入式开发常见的fs(cramfs,ext2,ext3,jffs2,etc)
include 全局需要的头文件定义在这儿
lib 通用库文件
net 网络相关的代码,小型的协议栈
post Power On Self Test,开店自检
Tools 辅助程序,用于编译和检查uboot目标文件

自问,学习u-boot又是为何?
无可厚非,很大机会是为了移植u-boot到自己的开发板。
如此,我们就不得不再分析/arch,/board两个folder

/arch
u-boot分析 二 (u-boot目录结构)

每一个folder对应一个体系结构,如/arm便是本文涉及到的体系结构。进入/arch/arm
u-boot分析 二 (u-boot目录结构)
注,此图截自博主分享的u-boot source code,该code已经将不相干的arch folder移除,只留下了arm folder,以方便大家更好的学习。

  1. cpu子目录对应一种处理器的不同产品型号或者系列;
  2. include子目录是处理器用到的头文件;
  3. lib目录对应用到处理器公用的代码;

继续展开cpu文件夹,即/arch/arm/cpu/slsiap/s5p4418/
u-boot分析 二 (u-boot目录结构)

其中,start.s文件是整个u-boot代码的入口点。

/board
u-boot分析 二 (u-boot目录结构)

此图截自u-boot官网下载的source code,可见里面有非常多的现成的开发板配置,非常壮观。而我们的示例并不包括在其内,所以,再回看博主在上一篇文章中分享的source code(http://pan.baidu.com/s/1kUhYmEj) 。为方便学习,只留下了相关的文件和文件夹/u-boot/board/s5p4418/…

我们总结一下,从目录结构上看,u-boot包括两个经常需要动到的/arch和/board目录,和另外一些暂不会动到的folders。作为初学,或者还没有涉及到u-boot裁剪的话,我们尽力搞清楚前两个folder的code原理即可搞明白u-boot的工作流程。


最后,u-boot.lds

还有一个文件是必须要知道的,即u-boot/arch/arm/cpu/slsiap/u-boot.lds

u-boot.lds是ld程序也就是连接器的脚本文件,这个文件描述了如何连接目标文件,ld程序会根据这个文件的指示按照需求把不同的目标文件连接在一起生成供烧写到开发板的image。


回溯本文,

  1. 什么是u-boot?
  2. u-boot目录结构?
  3. u-boot.lds是干什么的?