U-boot makefile分析

MKCONFIG分析

(学习笔记,有错见谅,欢迎指出)

  1. 配置命令为

    make 100ask24x0_config
    
  2. 配置文件的代码行为

    MKCONFIG	:= $(SRCTREE)/mkconfig
    

    以上代码所表示的含义为源码所在的目录下的“mkconfig”,在执行以上命令是相当于以下命令行

    	mkcongfig 100ask24x0 arm arm920t 100ask24x0 NULL s3c24x0
    //     $0          $1     $2   $3        $4      $5    $6
    

    以下为对该命令行的实际操作进行分析

    1. 打开根目录下的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
      
    2. 接下来,此时未对设备命名(为什么??),则选取“$1”作为命名,即命令行中的第二个参数"100ask24x0"。

      [ "${BOARD_NAME}" ] || BOARD_NAME="$1"	//如果传已命名board则不再命名
      //此时程序相当于实际执行
      BOARD_NAME=100ask24x0 
      
    3. 接下来对参数的数目进行判断

      [ $# -lt 4 ] && exit 1 //命令参数少于4个退出
      [ $# -gt 6 ] && exit 1//命令参数多于6个退出
      
    4. 通过判断后则打印如下

      echo "Configuring for ${BOARD_NAME} board..." //打印‘’的内容
      

      实际输出结果为:

      Configuring for 100ask24x0 board...
      
    5. 对目录进行判断(为什么????),本例子中只执行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
      
    6. 删除/arch目录文件

      rm -f asm-$2/arch
      
    7. 建立一个链接文件,指向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  
      
    8. 满足为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
      
    9. 创建修改config.mk

      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(下一行程序省略,内容与第九点类似)

    10. 最后一部分为创建一个config.h文件,并追加符合条件内容

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

Makefile分析

  1. 配置命令为
make

makefile主要对以下几种参数进行配置

include $(OBJTREE)/include/config.mk//包含前文所制作的根文件夹下config.mk文件
export ARCH CPU BOARD VENDOR SOC //分别为arm arm920t 100ask24x0 s3c24x0                                 

以下为具体分析

  1. ARCH

    ifeq ($(ARCH),arm)
    CROSS_COMPILE = arm-linux-//当架构为arm时启用linux交叉编译工具链(??)
    enif
    
  2. 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
    
  3. 链接脚本,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??)

总结

  1. u-boot执行的第一个文件 :cpu/arm920t/start.s
  2. 链接地址如何定义: board/100ask24x0/u-boot.lds;TEXT_BASE定义即u-boot所放位置为board/100ask24x0/config.mk中规定的地址(视频中为SDRAM最上端的内存位置)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值