makefile结构分析
配置过程
mkconfig 100ask24x0 arm arm920t 100ask24x0 NULL s3c24x0
$0 $1 $2 $3 $4 $5 $6
APPEND=no # Default: Create new config file
BOARD_NAME="" # Name to print in make output
[ "${BOARD_NAME}" ] || BOARD_NAME="$1"
#BOARD_NAME = 100ask24x0
echo "Configuring for ${BOARD_NAME} board..." #打印出来
#
# Create link to architecture specific headers
#
cd ../include
rm -f asm
ln -s asm-$2
asm #ln -s asm-arm
asm 建立链接到arm架构
rm -f asm-$2/arch
if [ -z "$6" -o "$6" = "NULL" ] ; then
ln -s ${LNPREFIX}arch-$3 asm-$2/arch
else
ln -s ${LNPREFIX}arch-$6
asm-$2/arch #ln -s arch-s3c24x0
asm-arm/arch
fi
if [ "$2" = "arm" ] ; then
rm -f asm-$2/proc
ln -s ${LNPREFIX}proc-armv
asm-$2/proc #ln -s proc-armv
asm-arm/proc 建立链接文件
fi
#
# Create include file for Make
#
echo "ARCH = $2"
> config.mk # >
建立新文件
echo "CPU =
$3" >>
config.mk #
>> 将前面的内容加入该文件
echo "BOARD = $4"
>> config.mk
config.mk内容
ARCH =
arm
CPU = arm920t
BOARD = 100ask24x0
SOC = s3c24x0
[ "$5" ] && [ "$5" != "NULL" ]
&& echo "VENDOR = $5"
>> config.mk
[ "$6" ] && [ "$6" != "NULL" ]
&& echo
"SOC = $6"
>> config.mk
#第六个参数存在且第六个参数不等于NULL,将echo
"SOC = $6"
加入config.mk
#
# Create board specific header file
#
if [ "$APPEND" = "yes" ] # Append to existing
config file
then
echo >>
config.h
else
>
config.h # Create new config
file
fi
echo "" >>config.h
echo "#include "
>>config.h
config.h的内容
#include
编译过程
OBJS = cpu/arm920/start.o
LIBS = lib_generic/libgeneric.a
LIBS += board/100ask24x0/lib100ask24x0.a
LIBS += cpu/arm920/libarm920.a
LIBS += net/libnet.a #将net目录下的.a文件打包成一个库
$(obj)u-boot.bin: $(obj)u-boot (elf)
$(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
#make 后从后面看命令
1、第一个文件:cpu/arm920t/start.s
2、链接地址:board/100ask24x0/u-boot.lds
+0x33F80000 #sdram 30000000开始
放在最上面的512k中
u-boot命令
1.cpu/arm920t/start.s
(u-boot第一阶段,汇编实现)
a.设SVC模式
b.关看门狗
c.屏蔽中断
d.初始化SDRAM
e.设置栈
f.时钟
g.代码从FLASH拷到SDRAM
h.清BSS段 #BSS段用来存放一些初值为0的全局变量
(u-boot第二阶段,C实现)
i.调用start_armboot(c函数)
(以上为硬件相关的初始化)
①启动内核
s = getenv("bootcmd")
run_command(s , ..)
②u-boot界面
readline(读入串口的数据)
run_command(s , ..)
u-boot的核心:命令(run_command)
u-boot内核启动
nand read.jffs2 0x30007FC0
;(将内核读到地址0x30007FC0去)
从 NAND读出内核:从哪里读,从kernel分区读
读到那里去
嵌入式Linux:flash没有分区表
bootm 0x30007FC0;(从地址0x30007FC0启动内核)
u-boot:Flash上存的内核:uImage
头部 + 真正的内核
in_load:加载地址
in_ep:入口地址
do_boot_linux
启动内核
1、设置启动参数
2、跳到入口地址去
注:为了以后回顾方便,在此备注。