uboot的编译和链接过程分析(一)

来源:互联网 发布:淘宝内衣店铺名字大全 编辑:程序博客网 时间:2024/05/17 07:22
1.make xc2440_config

2.make all

从这两个步骤来理解,中间好多gcc 参数和shell脚本搞不清楚,先放一放,整个流程搞完了,我还有回头学习shell脚本.

make xc2440_config 执行的结果是:

1.include下面生成了config.mk  config.h. 

2.在include下面建立一个连接asm到arch/arm/include/asm


#!/bin/sh -e##   xc2440_config       #@$(MKCONFIG) $(@:_config=) arm arm920t xc2440 NULL s3c24x0APPEND=no# Default: Create new config fileBOARD_NAME=""# Name to print in make outputTARGETS=""#BOARD_NAME = xc2440[ "${BOARD_NAME}" ] || BOARD_NAME="$1"#s#我们用的是6,这里都不满足条件都可以删除掉.#[ $# -lt 4 ] && exit 1#[ $# -gt 6 ] && exit 1#-a与的意思#没看到,实际应该没有执行.if [ "${ARCH}" -a "${ARCH}" != "$2" ]; thenecho "Failed: \$ARCH=${ARCH}, should be '$2' for ${BOARD_NAME}" 1>&2exit 1fiecho "============================================================"echo "执行./mkconifg $*"echo "Configuring for ${BOARD_NAME} board...by zhangquan\n"echo "ln -s /arch/arm/include/asminclude/asm"echo "ln -s asm/arch-s3c2440incluce/asm/arch"echo "ln -s asm/proc-armv       include/asm/proc"echo "\nIt will create incluce/config.h include/config.mk"echo "ARCH= $2ARCH----->arch/arm"echo "CPU= $3CPU------>arch/arm/cpu/arm920t"echo "BOARD= $4BOARD---->board/xc2440"echo "SOC= $6SOC------>arch/arm/cpu/arm920t/s3c24x0"echo "============================================================"## Create link to architecture specific headers##在Makefile里面我们知道 OBJTREE == OBJTREE #执行else部分if [ "$OBJTREE" != "$OBJTREE" ] ; thenmkdir -p ${OBJTREE}/includemkdir -p ${OBJTREE}/include2cd ${OBJTREE}/include2rm -f asmln -s ${SRCTREE}/arch/$2/include/asm asmLNPREFIX=${SRCTREE}/arch/$2/include/asm/cd ../includerm -f asmln -s ${SRCTREE}/arch/$2/include/asm asmelsecd ./includerm -fr asmln -s ../arch/$2/include/asm asm#ln -s ../arch/arm/include/asm asm  反正在uboot/include下面多了一个asm  fi#删除asm/arch ---->arch/arm/include/arch-$6,#上一步决定的.rm -fr asm/archif [ -z "$6" -o "$6" = "NULL" ] ; thenln -s ${LNPREFIX}arch-$3 asm/arch#arch-arm920t这个不存在,所以$6不能为空,否则编译错误.elseln -s ${LNPREFIX}arch-$6 asm/arch#所以arch-s3c24x0  是asm/arch真实的路径.  在include/asm/arch下面就是arch-s3c24x0的内容.fi#include <asm/arch/s3c2410.h> 我看到这样的一个包含关系,实际还是arch/arm/asm/arch-s3c2410/s3c2410.h    #<asm/arch/s3c2410.h>这样写,少写了好多绝对路径.方便头文件的包含.    #注释到这儿了,我想起了好多头文件的包含,是不是都是在这儿?    #以后的6410相关的头文件,都可以放到include/arch下面.if [ "$2" = "arm" ] ; thenrm -f asm/proc#asm/proc下面的内容是proc-armv的内容.ln -s ${LNPREFIX}proc-armv asm/proc#这个用到哪儿去了,我还没有体会到.fi## Create include file for Make#因为上一步是cd ./include ,所以现在在include路径下.config.mk 也在include这个路径下生成.#echo "ARCH   = $2" >  config.mkecho "CPU    = $3" >> config.mkecho "BOARD  = $4" >> config.mk#我们的$5 = NULL[ "$5" ] && [ "$5" != "NULL" ] && echo "VENDOR = $5" >> config.mk[ "$6" ] && [ "$6" != "NULL" ] && echo "SOC    = $6" >> config.mk# Assign board directory to BOARDIR variableif [ -z "$5" -o "$5" = "NULL" ] ; then    BOARDDIR=$4   #我在这里$5厂商写了NUll 所以BOARDIR = xc2440 如果默认的就是samsung/xc2440else    BOARDDIR=$5/$4fi## Create board specific header file#if [ "$APPEND" = "yes" ]# Append to existing config filethenecho >> config.helse> config.h# Create new config file#在mkconfig的开头,APPEND=no, 所以在这里创建了config.hfiecho "/* Automatically generated - do not edit */" >>config.h#开头可以看见TARGETS为空.这里不执行的.for i in ${TARGETS} ; doecho "#define CONFIG_MK_${i} 1" >>config.h ;done#这里的“cat << EOF >> config.h”表示将输入的内容追加到config.h中,直到出现“EOF”这样的标识为止。 不明白cat << EOF >> config.h#define CONFIG_BOARDDIR board/$BOARDDIR#include <config_defaults.h>#include <configs/$1.h>    #include <asm/config.h>        EOFexit 0#最终的产生的变化就是#1.在uboot/include下面多了一个链接文asm。  #asm下面多了一个链接文件arch 一个链接文件proc ,#arch指向asm-s3c24x0(里面是cpu相关的文件,比如寄存器地址)#proc指向pro-armv(里面很多汇编的东西)#   这个asm是arch/arm/include/asm的链接.##ln -s /arch/arm/include/asm   include/asm#ln -s asm/arch-s3c2440   incluce/asm/arch#ln -s asm/proc-armv   include/asm/proc#在incluce 下面生成config.mk  这个文件然后被Makefile包含进来了了,要用到这些参数。#ARCH   = armARCH----->对应arch/arm目录.#CPU    = arm920t        CPU------>对应arch/arm/cpu/arm920t目录#BOARD  = xc2440BOARD---->对应board/xc2440目录#SOC    = s3c24x0SOC------>对应arch/arm/cpu/arm920t/s3c24x0##在include 下面生成一个config.h/* Automatically generated - do not edit */#define CONFIG_BOARDDIR board/xc2440#所以要在board路径下要创建一个xc2440的文件夹.#include <config_defaults.h>#include <configs/xc2440.h>#这个是配置文件.比如内存的大小, 网卡的ip ,最后make根据这个生成automake.mk.就像<span style="white-space:pre"></span>        #linux根据配置选CONFIG_XXX项生成.config#所以要在include/configs/要创建一个xc2440.h这个配置文件.    #include <asm/config.h>#这个文件里面就一句话,#define CONFIG_RELOC_FIXUP_WORKS 用于代码重定向用的#我要做的就是 #1.在board下面创建xc2440这个文件夹.#   2.在include/configs/下面创建配置文件xc2440.h#3.剩下就是修改2410成2440
能力不够好多东西分析不清楚,先贴个图知道个大概的.细节好多不清楚.

现在简单的理解大致编译过程.

1.进入totls  example/standalone  example/api     arch/arm/cpu/arm920t(CPUDIR)   链接脚本的路径下执行  make _depend  ,  看了下makefile编译的打印,没做什么.

     然后进入tool  example/standalon  example/api 执行  make all   。 tool下面都是生成一些.o    example/standalone下面生成.a 文件   example/api  没做什么.

     具体里面makefiel没有看,根据结果就是这个样子的.

2.进入arch/arm/cpu/arm920t  下面执行   make start.o 。 由start.S 变成start.o, 原来最先编译的是这个文件.

3.根据LIB这个变量,决定进入那些目录下面编译成静态库*.a   .

   默认是:   lib下面的lib**.a    

     arch/arm/cpu/libarm920t.a   (这个是cpu.a  下面是 soc.a 再接着就是 arch.a, 后面还有个个board.a      前面三个都arch/arm目录下面.  后面在board目录下)

                      arch/arm/cpu/arm920t/libs3c24x0.a (这里有个疑惑,我们@$(MKCONFIG) $(@:_config=) arm arm920t xc2440 NULL s3c24x0   这里s3c24x0的s小写,而                                                                                                   arm920t下面的只有S3c24x0,难道这里大小写不区分)

                     arch/arm/lib/libarm.a     arch/arm/下面只有3个目录:cpu  lib  include   

                                                                cpu下面有好多架构arm920t  arm926e等. 每个架构下面又有对应的soc.  arm920t下面有s3c24x0  at91   arm1176下面有s3c64xx

                                                                lib下可能都是公用的库.

                                                                asm下面都是素有架构的相关的代码,比如这个架构的处理器的寄存器定义.

    接着 fs.net  .disk.drivers  drives下面的东西最多,什么i2c  input misc mtd(nand   onenand  spi)   net  pci  rtc  serial  usb  video

                    接着common   api  post

4.编译单板 相关的  board/xc2440/libxc2440.a

    反正到这里感觉主要的还是arch/arm/cpu/arm920t/start.S uboot.lds (start.o)    arm020t/s3c24x0 (libs3c24x0.a)     board/xc2440/libxc2440.a   drivers/lib***.a   这几个                才是主要 要关心的.

5.链接脚本本来在arch/arm/arm920t/下面,编译完后再根目录, 不是拷贝过去的,而已一些其他的操作在顶层生成的.

6.剩下的操作就是根据链接脚本把生成的start.o  *.a  根据链接脚本变成uboot.bin

   根据编译后-Ttext 后面的第一个文件确实是  start.o,但后面其他的都是*.a  这个样子搞的话,那么我们之前改变链接脚本把 lowlevel_init.o  clock.o nand_read.o放在前面起作      用 么

7.到这一步就生成了uboot.现在用objdcopy  把uboot变成了uboot.bin文件.

8.为什么要包lowleve_init.o  clock.o  nand_read.o要放到前面,因为bootloader的前4k上电被拷贝到内部的sram中执行,然后再拷贝剩下的在外置sdram中执行.

   在前面的4k里面,我们肯定要配置时钟clock.c,第二部要用sdram,时钟时序图时间要精确.   还要从nand里面拷贝剩下的代码到sdram。

   这些和时钟.sdram  .nand的代码都必须在前4k里面,不然如如果前4k不包含这些代码的,第二部就做有可能不能成功的执行. 所以要放到前面。

0 0
原创粉丝点击