MKCONFIG分析
(学习笔记,有错见谅,欢迎指出)
-
配置命令为
make 100ask24x0_config
-
配置文件的代码行为
MKCONFIG := $(SRCTREE)/mkconfig
以上代码所表示的含义为源码所在的目录下的“mkconfig”,在执行以上命令是相当于以下命令行
mkcongfig 100ask24x0 arm arm920t 100ask24x0 NULL s3c24x0 // $0 $1 $2 $3 $4 $5 $6
以下为对该命令行的实际操作进行分析
-
打开根目录下的mkconfig文件,首先分析
while [ $# -gt 0 ] ; do case "$1" in --) shift ; break ;; //分析命令行是否含有--指令 -a) shift ; APPEND=yes ;; //分析命令行是否含有-a指令 -n) shift ; BOARD_NAME="${1%%_config}" ; shift ;; //分析命令行是否含有-n指令 *) break ;; esac done
-
接下来,此时未对设备命名(为什么??),则选取“$1”作为命名,即命令行中的第二个参数"100ask24x0"。
[ "${BOARD_NAME}" ] || BOARD_NAME="$1" //如果传已命名board则不再命名 //此时程序相当于实际执行 BOARD_NAME=100ask24x0
-
接下来对参数的数目进行判断
[ $# -lt 4 ] && exit 1 //命令参数少于4个退出 [ $# -gt 6 ] && exit 1//命令参数多于6个退出
-
通过判断后则打印如下
echo "Configuring for ${BOARD_NAME} board..." //打印‘’的内容
实际输出结果为:
Configuring for 100ask24x0 board...
-
对目录进行判断(为什么????),本例子中只执行else部分
if [ "$SRCTREE" != "$OBJTREE" ] ; then //如果源目录与obj目录相同(本实例中不相同,为什么???) 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 //生成一个指向‘arm’的链接文件 fi
其中最后一行代码相当于,即生成一个arm架构的链接文件,文件夹中还有avr等等。。。
ln -s asm-arm asm
-
删除/arch目录文件
rm -f asm-$2/arch
-
建立一个链接文件,指向arch-s3c24x0(if判断不满足,执行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//相当于ln -s arch-s3c24x0 asm-arm/arch fi
-
满足为arm架构时,再次建立一个链接文件
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
-
echo "ARCH = $2" > config.mk//>表示新建一个config.mk文件,>>表示追加到该文件 echo "CPU = $3" >> config.mk echo "BOARD = $4" >> config.mk
即config的内容为:
ARCH = arm
CPU = arm920t
BOARD = 100ask24x0
SOC = s3c24x0(下一行程序省略,内容与第九点类似) -
最后一部分为创建一个config.h文件,并追加符合条件内容
echo "/* Automatically generated - do not edit */" >>config.h echo "#include <configs/$1.h>" >>config.h
-
Makefile分析
- 配置命令为
make
makefile主要对以下几种参数进行配置
include $(OBJTREE)/include/config.mk//包含前文所制作的根文件夹下config.mk文件
export ARCH CPU BOARD VENDOR SOC //分别为arm arm920t 100ask24x0 s3c24x0
以下为具体分析
-
ARCH
ifeq ($(ARCH),arm) CROSS_COMPILE = arm-linux-//当架构为arm时启用linux交叉编译工具链(??) enif
-
CPU
OBJS = cpu/$(CPU)/start.o //生成的目标目录为cpu/arm920t/start.o
接下来为包含众多lib文件,并打包为.a文件(此步程序未列出)。
在执行make指令时,默认执行make all,此时编译all文件依赖于ALL文件,而ALL中的文件则又依赖于u-boot文件,u-boot文件则依赖以下代码中链接的所有的.o与LIB库的文件。
具体有以下三个文件夹内的文件(实际编译)- lib_generic/libgeneric.a
- board/100ask24x0 /lib100ask24x0 .a
- cpu/arm920t /libarm920t .a
ALL = $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map $(U_BOOT_NAND) all: $(ALL) ... $(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
-
链接脚本,u-boot.lds
通过分析执行make后控制台内的代码可知,主要有.lds链接脚本和众多原材料完成编译,下面我们对链接脚本进行分析。{ . = 0x00000000; . = ALIGN(4); .text : { cpu/arm920t/start.o (.text) board/100ask24x0/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 = .; }
首先将start.o的代码段放在相对的0位置(具体位置由makefile文件的-TEXT指令规定,视频中为-0x33f80000),接下来是boot_init.o的代码段,接下来是所有文件的只读数据段、数据段、u-boot_cmd段(视频中忽略的.got与.bss??)
总结
- u-boot执行的第一个文件 :cpu/arm920t/start.s
- 链接地址如何定义: board/100ask24x0/u-boot.lds;TEXT_BASE定义即u-boot所放位置为board/100ask24x0/config.mk中规定的地址(视频中为SDRAM最上端的内存位置)。