UBOOT分析

U-Boot是一个通用的Boootloader,它是在系统上电后执行的第一段程序,先初始化硬件设备,再准备软件环境,最后引导系统内核。

一般来说Bootloader的启动过程来说一般分两个阶段:

第一阶段:

- 硬件设备初始化(关闭看门狗,关闭中断,设置CPU的速度,时钟频率,RAM初始化)
- 为加载Bootloader的第二阶段代码准备RAM空间
- 复制Bootloader第二阶段代码到RAM空间中。
- 设置好栈
- 转到第二阶段代码的C语言入口

第二阶段:

- 初始化本阶段要使用到的硬件设备
- 检测系统内存映射
- 将内核映像和根文件系统映像从Flash上读到RAM空间中
- 为内核启动设置启动参数

U-Boot源码结构

我的U-Boot版本是1.1.6
Uboot根文件夹里面共有26个子目录
board       ---------------> 开发板相关(对应不同电路板)
cpu         ---------------> 平台相关(对应不同CPU)
lib_XX      ---------------> 平台相关(某一架构下的通用文件)
include     ---------------> 通用函数(头文件和开发板的配置文件)
lib_generic ---------------> 通用函数库
common      ---------------> 通用函数,多是对下一层驱动程序的进一步封装
disk,drivers,dtt,fs,nand_spl,net,post,rtc通用设备驱动程序
doc         ---------------> 文档
example     ---------------> 实例程序
tools       ---------------> 工具

U-Boot的makefile分析

对一个工程的分析当然是从makefile开始看
对于s3c2410的开发板,执行make smdk2410_config,然后执行make all生成U-Boot.bin
根据第一条指令来看makefile
找到

 smdk2410_config	:	unconfig
        @$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0

@$(MKCONFIG) $(@:_config=)翻译过来就是./mkconfig smdk2410
也就是说该命令是

./mkconfig smdk2410 arm arm920t smdk2410 NULL s3c24x0
#            $1      $2  $3          $4    $5    $6

再看U-Boot根文件的mkconfig

if [ "$SRCTREE" != "$OBJTREE" ] ; then	
	mkdir -p ${OBJTREE}/include
	mkdir -p ${OBJTREE}/include2
	cd ${OBJTREE}/include2
	rm -f asm
	ln -s ${SRCTREE}/include/asm-$2 asm
	LNPREFIX="../../include2/asm/"
	cd ../include
	rm -rf asm-$2
	rm -f asm
	mkdir asm-$2
	ln -s asm-$2 asm
else
	cd ./include		#进入include
	rm -f asm			#删除asm文件夹
	ln -s asm-$2 asm	#再次建立asm文件夹,并链接向asm-arm
fi

rm -f asm-$2/arch		#删除asm-arm/arch文件夹

if [ -z "$6" -o "$6" = "NULL" ] ; then		#如果$6变量是空
	ln -s ${LNPREFIX}arch-$3 asm-$2/arch	#重新建立asm-arm/arch文件夹,并链接向asm-smdk2410/arch
else										#否则
	ln -s ${LNPREFIX}arch-$6 asm-$2/arch	#重新建立asm-arm/arch文件夹,并链接向asm-s3c24x0/arch
fi

if [ "$2" = "arm" ] ; then
	rm -f asm-$2/proc
	ln -s ${LNPREFIX}proc-armv asm-$2/proc
fi

#
# Create include file for Make
#

echo "ARCH   = $2" >  config.mk				#向config.mk写入"ARCH   = $2"
echo "CPU    = $3" >> config.mk				#向config.mk写入"CPU    = $3"
echo "BOARD  = $4" >> config.mk				#向config.mk写入"BOARD  = $4"

[ "$5" ] && [ "$5" != "NULL" ] && echo "VENDOR = $5" >> config.mk		#$5不为空 向config.mk写入"VENDOR = $5"

[ "$6" ] && [ "$6" != "NULL" ] && echo "SOC    = $6" >> config.mk		#$6不为空 向config.mk写入"SOC    = $6"

#
# Create board specific header file
#
if [ "$APPEND" = "yes" ]	# Append to existing config file			
then
	echo >> config.h
else

	> config.h		# Create new config file				#创建一个config.h文件
	
fi

#向config.h写入
echo "/* Automatically generated - do not edit */" >>config.h	
echo "#include <configs/$1.h>" >>config.h

exit 0

可见make smdk2410_config执行后的结果为

1.创建include/asm并链接向asm-arm
2.创建asm-arm/arch文件夹并链接向asm-smdk2410/arch
3.创建config.mk并写入
4.创建config.h并写入


未完....

posted @ 2016-01-17 12:05  zzmx  阅读(223)  评论(0编辑  收藏  举报