U-BOOT
详解
U
-
BOOT
是一个
LINUX
下的工程,在编译之前必须已经安装对应体系结构的交叉编译环境,这里只针对
ARM
,编译器系列软件为
arm-linux-*
。
U
-
BOOT
的下载地址:
http://sourceforge.net/projects/u-boot
我下载的是 1.1.6 版本,一开始在 FTP 上下载了一个次新版,结果编译失败。 1.1.6 是没问题的。
我下载的是 1.1.6 版本,一开始在 FTP 上下载了一个次新版,结果编译失败。 1.1.6 是没问题的。
u-boot
源码结构
解压就可以得到全部 u-boot 源程序。在顶层目录下有 18 个子目录,分别存放和管理不同的源程序。这些目录中所要存放的文件有其规则,可以分为 3 类。
第 1 类目录与处理器体系结构或者开发板硬件直接相关;
第 2 类目录是一些通用的函数或者驱动程序;
第 3 类目录是 u-boot 的应用程序、工具或者文档。
u-boot 的源码顶层目录说明
目 录 特 性 解 释 说 明
board 平台依赖 存放电路板相关的目录文件,
例如: RPXlite(mpc8xx) 、
smdk2410(arm920t) 、
sc520_cdp(x86) 等目录
cpu 平台依赖 存放 CPU 相关的目录文件
例如: mpc8xx 、 ppc4xx 、
arm720t 、 arm920t 、 xscale 、 i386 等目录
lib_ppc 平台依赖 存放对 PowerPC 体系结构通用的文件,
主要用于实现 PowerPC 平台通用的函数
lib_arm 平台依赖 存放对 ARM 体系结构通用的文件,
主要用于实现 ARM 平台通用的函数
lib_i386 平台依赖 存放对 X86 体系结构通用的文件,
主要用于实现 X86 平台通用的函数
include 通用 头文件和开发板配置文件,
所有开发板的配置文件都在 configs 目录下
common 通用 通用的多功能函数实现
lib_generic 通用 通用库函数的实现
net 通用 存放网络的程序
fs 通用 存放文件系统的程序
post 通用 存放上电自检程序
drivers 通用 通用的设备驱动程序,主要有以太网接口的驱动
disk 通用 硬盘接口程序
rtc 通用 RTC 的驱动程序
dtt 通用 数字温度测量器或者传感器的驱动
examples 应用例程 一些独立运行的应用程序的例子,例如 helloworld
tools 工具 存放制作 S-Record 或者 u-boot 格式的映像等工具,
例如 mkimage
doc 文档 开发使用文档
u-boot 的源代码包含对几十种处理器、数百种开发板的支持。可是对于特定的开发板,配置编译过程只需要其中部分程序。这里具体以 S3C2410 & arm920t 处理器为例,具体分析 S3C2410 处理器和开发板所依赖的程序,以及 u-boot 的通用函数和工具。
解压就可以得到全部 u-boot 源程序。在顶层目录下有 18 个子目录,分别存放和管理不同的源程序。这些目录中所要存放的文件有其规则,可以分为 3 类。
第 1 类目录与处理器体系结构或者开发板硬件直接相关;
第 2 类目录是一些通用的函数或者驱动程序;
第 3 类目录是 u-boot 的应用程序、工具或者文档。
u-boot 的源码顶层目录说明
目 录 特 性 解 释 说 明
board 平台依赖 存放电路板相关的目录文件,
例如: RPXlite(mpc8xx) 、
smdk2410(arm920t) 、
sc520_cdp(x86) 等目录
cpu 平台依赖 存放 CPU 相关的目录文件
例如: mpc8xx 、 ppc4xx 、
arm720t 、 arm920t 、 xscale 、 i386 等目录
lib_ppc 平台依赖 存放对 PowerPC 体系结构通用的文件,
主要用于实现 PowerPC 平台通用的函数
lib_arm 平台依赖 存放对 ARM 体系结构通用的文件,
主要用于实现 ARM 平台通用的函数
lib_i386 平台依赖 存放对 X86 体系结构通用的文件,
主要用于实现 X86 平台通用的函数
include 通用 头文件和开发板配置文件,
所有开发板的配置文件都在 configs 目录下
common 通用 通用的多功能函数实现
lib_generic 通用 通用库函数的实现
net 通用 存放网络的程序
fs 通用 存放文件系统的程序
post 通用 存放上电自检程序
drivers 通用 通用的设备驱动程序,主要有以太网接口的驱动
disk 通用 硬盘接口程序
rtc 通用 RTC 的驱动程序
dtt 通用 数字温度测量器或者传感器的驱动
examples 应用例程 一些独立运行的应用程序的例子,例如 helloworld
tools 工具 存放制作 S-Record 或者 u-boot 格式的映像等工具,
例如 mkimage
doc 文档 开发使用文档
u-boot 的源代码包含对几十种处理器、数百种开发板的支持。可是对于特定的开发板,配置编译过程只需要其中部分程序。这里具体以 S3C2410 & arm920t 处理器为例,具体分析 S3C2410 处理器和开发板所依赖的程序,以及 u-boot 的通用函数和工具。
编译
以
smdk_2410
板为例,编译的过程分两部:
# make smdk2410_config
# make
# make
顶层
Makefile
分析
要了解一个
LINUX
工程的结构必须看懂
Makefile
,尤其是顶层的,没办法,
UNIX
世界就是这么无奈,什么东西都用文档去管理、配置。首先在这方面我是个新手,时间所限只粗浅地看了一些
Makefile
规则。
以
smdk_2410
为例,顺序分析
Makefile
大致的流程及结构如下:
1)
Makefile
中定义了源码及生成的目标文件存放的目录
,
目标文件存放目录
BUILD
_
DIR
可以通过
make O=dir
指定。如果没有指定,则设定为源码顶层目录。一般编译的时候不指定输出目录,则
BUILD
_
DIR
为空。其它目录变量定义如下:
#OBJTREE
和
LNDIR
为存放生成文件的目录,
TOPDIR
与
SRCTREE
为源码所在目录
OBJTREE := $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR))
SRCTREE := $(CURDIR)
TOPDIR := $(SRCTREE)
LNDIR := $(OBJTREE)
export TOPDIR SRCTREE OBJTREE
OBJTREE := $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR))
SRCTREE := $(CURDIR)
TOPDIR := $(SRCTREE)
LNDIR := $(OBJTREE)
export TOPDIR SRCTREE OBJTREE
2
)
定义变量
MKCONFIG
:这个变量指向一个脚本,即顶层目录的
mkconfig
。
Mkconfig
源码详解见
http://student.csdn.net/space.php?uid=91306&do=blog&id=6389
MKCONFIG := $(SRCTREE)/mkconfig
export MKCONFIG
export MKCONFIG
在编译
U
-
BOOT
之前,先要执行
# make smdk2410_config
smdk2410_config
是
Makefile
的一个目标,定义如下:
smdk2410_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0
@$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0
unconfig::
@rm -f $(obj)include/config.h $(obj)include/config.mk /
$(obj)board/*/config.tmp $(obj)board/*/*/config.tmp
@rm -f $(obj)include/config.h $(obj)include/config.mk /
$(obj)board/*/config.tmp $(obj)board/*/*/config.tmp
显然,执行
# make smdk2410_config
时,先执行
unconfig
目标,注意不指定输出目标时,
obj
,
src
变量均为空,
unconfig
下面的命令清理上一次执行
make *_config
时生成的头文件和
makefile
的包含文件。主要是
include/config.h
和
include/config.mk
文件。
然后才执行命令
@$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0
MKCONFIG 是顶层目录下的 mkcofig 脚本文件,后面五个是传入的参数。
MKCONFIG 是顶层目录下的 mkcofig 脚本文件,后面五个是传入的参数。
对于
smdk2410_config
而言,
mkconfig
主要做三件事:
在
include
文件夹下建立相应的文件(夹)
软连接,
#
如果是
ARM
体系将执行以下操作:
#ln -s asm-arm asm
#ln -s asm-arm asm
#ln -s arch-s3c24x0 asm-arm/arch
#ln -s proc-armv asm-arm/proc
#ln -s proc-armv asm-arm/proc
生成
Makefile
包含文件
include/config.mk
,内容很简单,定义了四个变量:
ARCH = arm
CPU = arm920t
BOARD = smdk2410
SOC = s3c24x0
CPU = arm920t
BOARD = smdk2410
SOC = s3c24x0
生成
include/config.h
头文件,只有一行:
/* Automatically generated - do not edit */
#include "config/smdk2410.h"
#include "config/smdk2410.h"
mkconfig
脚本文件的执行至此结束,继续分析
Makefile
剩下部分。