查看: 959|回复: 0

uboot1.3.3分析--编译链接

[复制链接]

该用户从未签到

发表于 2018-6-20 16:50:22 | 显示全部楼层 |阅读模式
分享到:
如果我们想快速的移植uboot,那么我们就要先将我们用到的uboot的功能分析透彻,uboot最终目的就是**引导内核**,但是在实际开发中为了方便开发调试,我们将uboot加入了很多功能,比如tftp下载,nfs启动,串口打印等功能;那么我们先按着执行的顺序来分析代码。
  uboot并没有对2440进行支持,所以我们分析阶段先分析smdk2410的相关代码,分析完成以后我们在根据s3c2440的技术手册在2410的基础上进行移植。
Makefile分析
首先我们根据编译过程进行分析,编译需要执行命令:
make smdk2410_config
我们查看根目录下Makefile文件,搜索smdk2410_config得到如下代码:
smdk2410_config : unconfig
  @$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0在Makefile中;
@表示不打印后面的命令。
$(MKCONFIG)我们通过搜索MKCONFIG得到其定义如下:
MKCONFIG := $(SRCTREE)/mkconfig
SRCTREE定义如下:
  SRCTREE := $(CURDIR)
CURDIR在Makefile中为内嵌变量,自动设置为当前的目录。所以$(MKCONFIG)就等于当前目录下的mkconfig文件;$(@:_config=)表示将目标文件的_config变为空,也就是取消目标文件的_config。
所以命令解析如下
  smdk2410_config : unconfig
  @mkconfig $(@:_config=) arm arm920t smdk2410 NULL s3c24x0
所以当我们执行make smdk2410_config的时候实际是执行的是:
  ./mkconfig smdk2410 arm arm920t smdk2410 NULL s3c24x0
                         $1         $2       $3        $4             $5         $6

分析根目录下mkconfig
  while [ $# -gt 0 ] ; do
  case "$1" in
  --) shift ; break ;;
  -a) shift ; APPEND=yes ;;
  -n) shift ; BOARD_NAME="${1%%_config}" ; shift ;;
  *) break ;;
  esac
  done

$#表示了传递进来的参数的个数;

-gt表示大于(>)的含义;

首先如果传递的参数个数大于0,则执行,然后在判断$1是不是--、-a、-n、*等符号,如果是则执行相应的分支,否则继续向下执行。

  [ "${BOARD_NAME}" ] || BOARD_NAME="$1"

如果没有定义BOARD_NAME,则让BOARD_NAME=$1在这里就是BOARD_NAME=$1=smdk2410

  [ $# -lt 4 ] && exit 1
  [ $# -gt 6 ] && exit 1

-lt是小于(<)的含义;

也就是判断传递进来的个数是否是小于4个或者是大于6个,如果小于4个或者大于6个则退出。

  echo "Configuring for ${BOARD_NAME} board..."

打印信息Configuring for smdk2410 board...

  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

上面代码if [ "$SRCTREE" != "$OBJTREE" ] ; 是判断SRCTREE 是否等于OBJTREE?

如果不等,则执行if 分支,如果相等等执行else分支,在顶层makefile 下查找可知SRCTREE 和OBJTREE 定义如下:

  OBJTREE := $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR))
  SRCTREE := $(CURDIR)
所以:

  OBJTREE := $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR))

含义:如果定义BUILD_DIR 则OBJTREE=BUILD_DIR 否则OBJTREE=CURDIR搜索mkconfig 可知:BUILD_DIR 没有定义,即OBJTREE=CURDIR所以:SRCTREE := $(CURDIR)即SRCTREE=CURDIR,BJTREE=CURDIR 并且SRCTREE=CURDIR 所以SRCTREE=OBJTREE所以执行else 分支;

else 分支作用如下:

执行上面面三句,就相当于建立一个链接文件asm,它指向$2(即arm)。

这样做的原因?

当我们在源码中包含#include<asm-arm/type.h>的时候不需要改动,如果是i386 呢?Avr32
呢?所以建立这个链接是为了不需要我们总是修改代码,则直接写#include<asm/type.h>即可。

  rm -f asm-$2/arch

删除asm-arm/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
  fi

如果$6 为空或者为NULL 则执行ln -s ${LNPREFIX}arch-$3 asm-$2/arch而$6=s3c6410 所以if 分支忽略即执行else 分支ln -s ${LNPREFIX}arch-$6 asm-$2/arch

分析ln -s ${LNPREFIX}arch-$6 asm-$2/arch执行上面语句相当于在asm-arm($2)目录下面建立一个链接文件arch而链接文件arch 的指向是arch-s3c6410($6)。

  if [ "$2" = "arm" ] ; then
  rm -f asm-$2/proc
  ln -s ${LNPREFIX}proc-armv asm-$2/proc
  fi
通过对$2的判断发现执行此分支。

  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

“>”表示新建文件并将内容添加进文件。

“>>”表示只在文件中添加内容。

所以上述的代码含义就是新建config.mk文件并且将下面内容添加进config.mk文件:

  ARCH = arm
  CPU = arm920t
  BOARD = smdk2410
  VENDOR = NULL
  SOC = s3c24x0

  if [ "$APPEND" = "yes" ] # Append to existing config file
  then
  echo >> config.h
  else
  > config.h # Create new config file
  fi
判断APPEND定义是否等于yes开头定义APPEND等于no,所以执行else分支,新建config.h文件

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

在config.h里面追加内容:

  /* Automatically generated - do not edit */
  #include <configs/smdk2410.h>

一直分析到此处我们才将这个过程分析清楚。后面我们分析程序的入口在哪里?
如果发现错误之处请联系email:sj9198@outlook.com

QQ群:150963666
转载请注明出处!!谢谢!!!
2018-06-14-uboot编译链接分析.pdf
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /2 下一条

手机版|小黑屋|与非网

GMT+8, 2024-4-26 04:26 , Processed in 0.121025 second(s), 18 queries , MemCache On.

ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

苏公网安备 32059002001037号

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.