UBoot启动分析Word下载.docx
- 文档编号:22110571
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:22
- 大小:153.94KB
UBoot启动分析Word下载.docx
《UBoot启动分析Word下载.docx》由会员分享,可在线阅读,更多相关《UBoot启动分析Word下载.docx(22页珍藏版)》请在冰豆网上搜索。
它完成一些依赖于CPU体系结构的初始化,并调用第二阶段的代码,第二阶段则通常使用C语言来实现,这样可以实现更复杂的功能,而且代码会有更好的可读性和可移植性。
(1)Bootloader第一阶段的功能
1)硬件设备初始化
2)为加载Bootloader的第二阶段准备RAM空间。
3)复制Bootloader的第二阶段代码到RAM空间中。
4)设置好栈
5)跳转到第二阶段代码的C入口点。
在第一阶段进行的硬件初始化一般包括:
关闭WATCHDOG,关中断,设置CPU的速度和时钟频率RAM初始化等。
这些不都是必需的。
(2)Bootloader第二阶段的功能
1)初始化本阶段要使用的硬件设备
2)检测系统内存映射
3)将内核映像和根文件系映象从Flash望到RAM空间中
4)为内核设置启动参数
5)调用内核
将内核存放在适当的位置后,直接跳到它的入口点即可调用内核,调用内核之前,下列条件要满足
(1)CPU寄存器的设置
R0=0.
R1=机器类型ID;
对于ARM结构的CPU,其机器类型ID在linux/arch/arm/tools/mach-types
R2=启动参数标记列表在RAM中起始基地址
(2)CPU工作模式
必须禁止中断(IRQs和FIQs)
CPU必须为SVC模式
(3)Cach和MMU的设置
MMU必须关闭
指令Cach可以打开也可以关闭
数据Cach必须关闭
U-Boot启动流程(Linux内核)的分析
(二)
这一篇主要就是U-Boot的config.mk进行了分析。
如果要使用开发板board/<
board_name>
就先执行“make<
_config”命令进行配置,然后执行”makeall“,就可以生成如下3个文件。
U-boot.bin:
二进制可执行文件,它就是可以直接烧入ROM,NORFlash的文件
u-Boot:
ELF格式的可执行文件,
U-Boot.srec:
MotorlaS-Record格式的可执行文件
对于S3C2410的开发板,执行”makesmdk2410_config“."
makeall"
后生成的U-Boot.bin可以烧入NORFlash中运行,启动后可以看到串口输出一些信息后进行控制界面。
1。
U-boot的配置过程
在顶层Makefile中可以看到如下代码:
...........
MKCONFIG
:
=$(SRCTREE)/mkconfig
........
smdk2410_config
unconfig
@$(MKCONFIG)$(@:
_config=)armarm920tsmdk2410samsungs3c24x0
这是在根目录下的MAKEFILE文件中的两个语句,其中的MKCONFIG就是根目录下的mkconfi文件。
$(@:
_config=)的结果就是将”smdk2410_config“中的_config去掉,结果为“smdk2410”.所以“makesmdk2410_config”实际上就是执行如下命令:
./mkconfigsmdk2410armarm920tsmdk2410NULLs3c24x0
mkconfig的作用,在mkconfig文件开头第6行给出了它的用法
#Parameters:
TargetArchitectureCPUBoard[VENDOR][SOC]
对于S3C2410S3C2440,它们被称为Soc(systmeonchip),上面除CPU外,还集成了包括UART,USB控制器,NANDFlash控制器等设备,称为片上外设。
下面看一下makeconfig的作用。
(1)确定开发板名称BOARD_NAME,相关代码如下:
APPEND=no
#Default:
Createnewconfigfile
BOARD_NAME="
"
#Nametoprintinmakeoutput
while[$#-gt0];
do
case"
$1"
in
--)shift;
break;
;
-a)shift;
APPEND=yes;
-n)shift;
BOARD_NAME="
${1%%_config}"
;
shift;
*)break;
esac
done
对于./mkconfigsmdk2410armarm920tsmdk2410NULLs3c24x0命令,其中没有"
--"
"
-a"
-n"
等符号,所以上面几行不会执行。
["
${BOARD_NAME}"
]||BOARD_NAME="
执行完上面的这句后,BOADR_NAME的值等于第1个参数,即"
s3ck2410"
(2)创建到平台开发板相关折头文件的链接
if["
$SRCTREE"
!
="
$OBJTREE"
];
then//判断源代码目录和目标文件目录是否是一样
mkdir-p${OBJTREE}/include
mkdir-p${OBJTREE}/include2
cd${OBJTREE}/include2
rm-fasm
ln-s${SRCTREE}/include/asm-$2asm
LNPREFIX="
../../include2/asm/"
cd../include
rm-rfasm-$2
mkdirasm-$2
ln-sasm-$2asm
else
cd./include
fi
直接在源代码目录下编译时,条件不满足,将执行else分支的代码,在else分支中,进入include目录,删除asm文件,然后再次建立asm文件,并令它链接向asm-$2目录,即asm-arm。
rm-fasm-$2/arch//删除asm-$2/arch目录,即asm-arm/arch
if[-z"
$6"
-o"
="
NULL"
then//$6="
s3c24x0"
不为空,也不为NULL,执行else分支
ln-s${LNPREFIX}arch-$3asm-$2/arch//LNPREFIX为空,这个命令实际上等同于"
ln-sarch-s3c24x0asm-arm/arch"
ln-s${LNPREFIX}arch-$6asm-$2/arch
$2"
arm"
then//重新建立/asm-arm/proc文件,并让它链接向proc-armv目录
rm-fasm-$2/proc
ln-s${LNPREFIX}proc-armvasm-$2/proc
(3)创建顶层MAKEFILE包含的文件include/config.mk
#
#CreateincludefileforMake
echo"
ARCH=$2"
>
config.mk
CPU=$3"
>
BOARD=$4"
$5"
]&
&
["
echo"
VENDOR=$5"
SOC=$6"
对于./mkconfigsmdk2410armarm920tsmdk2410NULLs3c24x0命令,上面几行创建的config.mk文件的内容如下:
ARCH=arm
CPU=arm920t
BOARD=smdk2410
SOC =s3c24x0
(4)创建开发板相关的头文件include/config.h
#Createboardspecificheaderfile
$APPEND"
yes"
]
#Appendtoexistingconfigfile
then
echo>
config.h
config.h
#Createnewconfigfile
/*Automaticallygenerated-donotedit*/"
config.h
#include<
configs/$1.h>
asm/config.h>
exit0
APPEND维持原值"
NO"
,所以config.h被重新建立,也就是执行echo"
configs/smdk2410.h>
总之,当你执行makesmdk2410_config,实际的作用就是执行./mkconfigsmdk2410armarm920tsmdk2410NULLs3c24x0,它将产生如下的
几种作用
(1)开发板的名称BOARD_NAME等于$1
(2)创建到平台,开发板相关的头文件的链接,如下所示
ln-sarch-$6asm-S2/arch
ln-sproc-armvasmn-$2/proc如果$2不是arm的话,此行没有
(3)创建顶层Makefile包含的incldue/config.mk,如下所示
ARCH=$2
CPU=$3
BOARD=$4
VENDOR=$$5
为空,或者NULL的话,些行没有
SOC=$6
(4)创建开发板相关的头文件include/config.h,如下所示
config.h/$1.h>
从上面执行完命令后的结果,可以看出来,如果要在board目录下新建一个开发板<
的目录,则在include/configs目录下也要建立一个文件<
.h,里面存放的就是开发板<
的配置信息。
3.U-Boot的编译,连接过程
#loadARCH,BOARD,andCPUconfiguration
include$(obj)include/config.mk
export
ARCHCPUBOARDVENDORSOC
#setdefaulttonothingfornativebuilds
ifeq($(HOSTARCH),$(ARCH))
CROSS_COMPILE?
=
endif
#loadotherconfiguration
include$(TOPDIR)/config.mk
这是根目录下的Makefile中与ARM相关的代码。
第一行中包含的config.mk文件,就是在第一开始配置过程中制作出来的include/conifg.mk文件,我们在一开始配置U-boot时执行过mkconfig。
mini2440时生成的文件,其中定义了ARCH,CPU,BOARD,SOC等。
4个变量的值为arm,arm920t,smdk2410,s3c24x0.我们在执行mkconfig。
mini2440时,其实执行的是如下的命令:
最后一句话include$(TOPDIR)/config.mk包含顶层目录的config.mk文件。
它根据上面4个变量的值确定了编译器。
编译选项等。
在顶层的config.mk中可以看到:
fdef
VENDOR
BOARDDIR=$(VENDOR)/$(BOARD)
BOARDDIR=$(BOARD)
ifdef
BOARD
sinclude$(TOPDIR)/board/$(BOARDDIR)/config.mk
#includeboardspecificrules
LDSCRIPT:
=$(TOPDIR)/board/$(BOARDDIR)/u-boot.lds
LDFLAGS+=-Bstatic-T$(obj)u-boot.lds$(PLATFORM_LDFLAGS)
ifneq($(TEXT_BASE),)
LDFLAGS+=-Ttext$(TEXT_BASE)
在u-boot-2009.08\board\samsung\smdk2410\config.mk中定义了“TEXT_BASE=0x33F80000”.所以最终结果是:
BOARDDIR为smdk2410;
LDFLAGS中有“-T\cpu\arm920t\u-boot.lds-Ttext0x33f80000”.其中的-Ttext$(TEXT_BASE),这句指明了代码段的起始地址。
为什么是0x33F80000呢?
这是将NAND中Uboot拷贝到RAM中的起始地址,所以在代码拷贝到RAM之前不能使用绝对地址来寻址数据,只能用相对地址,在以下将用虚拟地址来指Uboot在RAM中的地址,也就是0x33F80000
继续分析MAKEFIle文件:
OBJS=cpu/$(CPU)/start.o
LIBS=lib_generic/libgeneric.a
LIBS+=lib_generic/lzma/liblzma.a
LIBS+=lib_generic/lzo/liblzo.a
LIBS+=$(shellif[-fboard/$(VENDOR)/common/Makefile];
thenecho\
board/$(VENDOR)/common/lib$(VENDOR).a"
fi)
LIBS+=cpu/$(CPU)/lib$(CPU).a
从上面的第一行我们可以看到OBJS的第一个值为"
cpu/$(CPU)/start.o"
,即"
cpu/arm920t/start.o"
。
下面的几行指定了LIBS变量,也就是平台,开发板相关的各个目录,通用目录下相应的库。
OBJSLIBS所代表的.o,.a文件构成了U-Boot,它们通过下面相应的源文件编译得到。
$(OBJS):
depend
$(MAKE)-Ccpu/$(CPU)$(if$(REMOTE_BUILD),$@,$(notdir$@))
$(LIBS):
depend$(SUBDIRS)
$(MAKE)-C$(dir$(subst$(obj),,$@))
对于OBJS中的每个成员,都将进入cpu/$(CPU)目录编译它们,现在的OBJS为cpu/arm920t/start.o。
它由cpu/arm920t/start.S编译得到。
对于LIBS中的每个成员,都将进入相应的子目录执行"
make命令"
当所有的OBJS,LIBS所表示的.o.a文件都生成后,就剩最后的连接了,这对应MAKEFILE中的下面几行:
$(obj)u-boot.srec:
$(obj)u-boot
$(OBJCOPY)-Osrec$<
$@
$(obj)u-boot.bin:
$(OBJCOPY)${OBJCFLAGS}-Obinary$<
$(obj)u-boot.ldr:
$(obj)tools/envcrc--binary>
$(obj)env-ldr.o
$(LDR)-T$(CONFIG_BFIN_CPU)-c$@$<
$(LDR_FLAGS)
$(obj)u-boot.ldr.hex:
$(obj)u-boot.ldr
$(OBJCOPY)${OBJCFLAGS}-Oihex$<
$@-Ibinary
$(obj)u-boot.ldr.srec:
$(OBJCOPY)${OBJCFLAGS}-Osrec$<
$(obj)u-boot.img:
$(obj)u-boot.bin
./tools/mkimage-A$(ARCH)-Tfirmware-Cnone\
-a$(TEXT_BASE)-e0\
-n$(shellsed-n-e'
s/.*U_BOOT_VERSION//p'
$(VERSION_FILE)|\
sed-e'
s/"
[
]*$$/for$(BOARD)board"
/'
)\
-d$<
................
GEN_UBOOT=\
UNDEF_SYM=`$(OBJDUMP)-x$(LIBBOARD)$(LIBS)|\
sed-n-e'
s/.*\($(SYM_PREFIX)__u_boot_cmd_.*\)/-u\1/p'
|sort|uniq`;
\
cd$(LNDIR)&
$(LD)$(LDFLAGS)$$UNDEF_SYM$(__OBJS)\
--start-group$(__LIBS)--end-group$(PLATFORM_LIBS)\
-Mapu-boot.map-ou-boot
$(obj)u-boot:
depend$(SUBDIRS)$(OBJS)$(LIBBOARD)$(LIBS)$(LDSCRIPT)$(obj)u-boot.lds
$(GEN_UBOOT)
先使用$(obj)u-boot:
规则连接得到ELF格式的U-Boot,最后转换为二进制格式u-boot.bin.S-Record格式u-Boot.srec.其中LDFLAGS确定了连接方式,也就是-T\cpu\arm920t\u-boot.lds-Ttext0x33f80000指定了程序的布局地址,\cpu\arm920t\U-Boot.lds文件如下:
UTPUT_FORMAT("
elf32-littlearm"
"
)
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
.=0x00000000;
.=ALIGN(4);
.text:
cpu/arm920t/start.o
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- UBoot 启动 分析