一、uboot介绍
uboot是一个板级程序,作用为引导内核。
二、uboot的Makefile结构分析
1、编译uboot流程
1、配置
make mini2440_config
2、编译
make
2、文件分布介绍
(1)arch:与 体系架构相关
(2)cpu:与cpu相关
(3)broad:与板子相关
(4)common:共用部分,与指令相关
(5)driver:与驱动相关,网卡驱动,串口驱动等
3、Makefile结构分析
(1)配置:make
mini2440_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t mini2440 NULL s3c24x0
等价于:
mkconfig mini2440 arm arm920t mini2440 NULL s3c24x0
(2)分析mkconfig配置
mkconfig mini2440 arm arm920t mini2440 NULL s3c24x0
1、板子名称
[ "${BOARD_NAME}" ] || BOARD_NAME="$1"
=》 BOARD_NAME=mini2440
2、文件目录配置(执行else内容)
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
rm -f asm
ln -s asm-$2 asm
fi
=》 cd ./include
rm -f asm
ln -s asm-arm asm
3、删除asm-arm/arch(与配置项无关)
rm -f asm-$2/arch
4、链接arch目录(执行else内容)
if [ -z "$6" -o "$6" = "NULL" ] ; then
ln -s ${LNPREFIX}arch-$3 asm-$2/arch
else
ln -s ${LNPREFIX}arch-$6 asm-$2/arch
fi
=》 ln -s arch-s3c24x0 asm-arm/arch
5、创建proc链接文件(条件成立)
if [ "$2" = "arm" ] ; then
rm -f asm-$2/proc
ln -s ${LNPREFIX}proc-armv asm-$2/proc
fi
=》 rm -f asm-arm/proc
ln -s proc-armv asm-arm/proc
6、填充config.mk
echo "ARCH = $2" > config.mk
echo "CPU = $3" >> config.mk
echo "BOARD = $4" >> config.mk
[ "$5" ] && [ "$5" != "NULL" ] && echo "VENDOR = $5" >> config.mk
[ "$6" ] && [ "$6" != "NULL" ] && echo "SOC = $6" >> config.mk
文件内容为:
ARCH = arm
CPU = arm920t
BOARD = mini2440
SOC = s3c24x0
7、创建配置头文件(config.h)
if [ "$APPEND" = "yes" ] # Append to existing config file
then
echo >> config.h
else
> config.h # Create new config file
fi
echo "/* Automatically generated - do not edit */" >>config.h
echo "#include <configs/$1.h>" >>config.h
《config.h》
/* Automatically generated - do not edit */
#include <configs/mini2440.h>
(3)编译流程(Makefile)
1、Makefile会包含config.mk(由make xxx_config生成)文件
ARCH = arm
CPU = arm920t
BOARD = mini2440
SOC = s3c24x0
2、源码加载
OBJS = cpu/$(CPU)/start.o
LIBS = lib_generic/libgeneric.a
LIBS += board/$(BOARDDIR)/lib$(BOARD).a
LIBS += cpu/$(CPU)/lib$(CPU).a
=》
OBJS = cpu/arm920t/start.o
LIBS = lib_generic/libgeneric.a
LIBS += board/mini2440/libmini2440.a
LIBS += cpu/arm920t/libarm920t.a
...
3、uboot生成
$(obj)u-boot.bin: $(obj)u-boot
$(OBJCOPY) ${OBJCFLAGS} -O binary $< $@
$(obj)u-boot: depend version $(SUBDIRS) $(OBJS) $(LIBS) $(LDSCRIPT)
UNDEF_SYM=`$(OBJDUMP) -x $(LIBS) |sed -n -e 's/.*\(__u_boot_cmd_.*\)/-u\1/p'|sort|uniq`;\
cd $(LNDIR) && $(LD) $(LDFLAGS) $$UNDEF_SYM $(__OBJS) \
--start-group $(__LIBS) --end-group $(PLATFORM_LIBS) \
-Map u-boot.map -o u-boot
4、链接地址(LDFLAGS)
(1)链接配置(config.mk)
LDFLAGS += -Bstatic -T $(LDSCRIPT) -Ttext $(TEXT_BASE) $(PLATFORM_LDFLAGS)
(2)Bstatic在(/board/mini2440/config.mk)配置文件中
TEXT_BASE = 0x33F80000
(4)链接脚本
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
/*OUTPUT_FORMAT("elf32-arm", "elf32-arm", "elf32-arm")*/
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
. = 0x00000000;
. = ALIGN(4);
.text :
{
cpu/arm920t/start.o (.text)
board/mini2440/boot_init.o (.text)
*(.text)
}
. = ALIGN(4);
.rodata : { *(.rodata) }
. = ALIGN(4);
.data : { *(.data) }
. = ALIGN(4);
.got : { *(.got) }
. = .;
__u_boot_cmd_start = .;
.u_boot_cmd : { *(.u_boot_cmd) }
__u_boot_cmd_end = .;
. = ALIGN(4);
__bss_start = .;
.bss : { *(.bss) }
_end = .;
}