uboot编译: uboot编译配置和编译过程

jz2440:  

韦东山Linux视频第1期_裸板_UBoot_文件系统_驱动初步\第09课第2节 u-boot分析之Makefile结构分析.WMV

《嵌入式linux完全开发手册》 15.2 U-Boot 分析与移植

 1. uboot make编译过程:

cd u-boot-1.1.6

patch -p1 < ../u-boot-1.1.6_jz2440.patch

make 100ask24x0_config

make all

2. 分析make 100ask24x0_config

 

 

{
    Makefile
    mkconfig
    include/asm
    include/asm/arch
    include/asm/proc    
    include/config.mk
    include/config.h
    include/configs/100ask24x0.h
}

vi Makefile
{
    1886 100ask24x0_config       :       unconfig
    1887         @$(MKCONFIG) $(@:_config=) arm arm920t 100ask24x0 NULL s3c24x0

}
    --> mkconfig 100ask24x0 arm arm920t 100ask24x0 NULL s3c24x0
    
vi mkconfig
{    
    # Parameters:  Target  Architecture  CPU  Board [VENDOR] [SOC]
    确定开发板名称: 
    {
        23            [ "${BOARD_NAME}" ] || BOARD_NAME="$1"
    }
    创建到平台/开发板相关的头文件的链接
    {
        46            cd ./include
        47            rm -f asm
        48            ln -s asm-$2 asm
         
        51            rm -f asm-$2/arch
        56            ln -s ${LNPREFIX}arch-$6 asm-$2/arch
        
        60         rm -f asm-$2/proc
        61         ln -s ${LNPREFIX}proc-armv asm-$2/proc
    }
    为Make创建包含文件include/config.mk
    {
        67             echo "ARCH   = $2" >  config.mk
        68             echo "CPU    = $3" >> config.mk
        69             echo "BOARD  = $4" >> config.mk
        71             [ "$5" ] && [ "$5" != "NULL" ] && echo "VENDOR = $5" >> config.mk
        73             [ "$6" ] && [ "$6" != "NULL" ] && echo "SOC    = $6" >> config.mk
    }
    创建开发板相关的头文件include/config.h
    {
        85             echo "#include <configs/$1.h>" >>config.h
    }
}

    
3. uboot的配置文件: include/configs/100ask24x0.h
修改这个配置文件来达到裁剪和设置uboot,类似于kernel的make menuconfig的效果。

主要有3类宏:
    CONFIG_ 主要用来设置功能、使用文件中的哪一块这样的参数;    CFG_ 主要用来设置一些更细节的参数;    另外还有些其他的定义。
    原则上是这样的,实际上主要还是看代码。
    
    {
        36 #define CONFIG_ARM920T          1       /* This is an ARM920T Core      */
        45 #define USE_920T_MMU            1    
        56 #define MTDIDS_DEFAULT "nand0=nandflash0"
        57 #define MTDPARTS_DEFAULT "mtdparts=nandflash0:256k@0(bootloader)," \
        58                             "128k(params)," \
        59                             "2m(kernel)," \
        60                             "-(root)"    
        
        152 #define CFG_MEMTEST_START       0x30000000      /* memtest works on     */
        153 #define CFG_MEMTEST_END         0x33F00000      /* 63 MB in DRAM        */4. 分析make all
vi Makefile
{
    116 # load ARCH, BOARD, and CPU configuration
    117 include $(OBJTREE)/include/config.mk
    118 export  ARCH CPU BOARD VENDOR SOC

    127 ifeq ($(ARCH),arm)
    128 CROSS_COMPILE = arm-linux-
    129 endif

    163 # load other configuration
    164 include $(TOPDIR)/config.mk
    
    166 #########################################################################
    167 # U-Boot objects....order is important (i.e. start must be first)
    168 
    169 OBJS  = cpu/$(CPU)/start.o          //cpu/arm920t/start.o是第一个obj文件,先后顺序很重要

    199 LIBS += lib_$(ARCH)/lib$(ARCH).a
    200 LIBS += fs/cramfs/libcramfs.a fs/fat/libfat.a fs/fdos/libfdos.a fs/jffs2/libjffs2.a \
    201         fs/reiserfs/libreiserfs.a fs/ext2/libext2fs.a
    202 LIBS += net/libnet.a
    203 LIBS += disk/libdisk.a
    204 LIBS += rtc/librtc.a
    205 LIBS += dtt/libdtt.a
    206 LIBS += drivers/libdrivers.a
    207 LIBS += drivers/nand/libnand.a
    208 LIBS += drivers/nand_legacy/libnand_legacy.a
    209 LIBS += drivers/usb/libusb.a
    210 LIBS += drivers/sk98lin/libsk98lin.a
    211 LIBS += common/libcommon.a

    
    239 ALL = $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map $(U_BOOT_NAND)
    240 
    241 all:            $(ALL)
    242 
    243 $(obj)u-boot.hex:       $(obj)u-boot
    244                 $(OBJCOPY) ${OBJCFLAGS} -O ihex $< $@
    245 
    246 $(obj)u-boot.srec:      $(obj)u-boot
    247                 $(OBJCOPY) ${OBJCFLAGS} -O srec $< $@
    248 
    249 $(obj)u-boot.bin:       $(obj)u-boot
    250                 $(OBJCOPY) ${OBJCFLAGS} -O binary $< $@
    251 
    252 $(obj)u-boot.img:       $(obj)u-boot.bin
    253                 ./tools/mkimage -A $(ARCH) -T firmware -C none \
    254                 -a $(TEXT_BASE) -e 0 \
    255                 -n $(shell sed -n -e 's/.*U_BOOT_VERSION//p' $(VERSION_FILE) | \
    256                         sed -e 's/"[     ]*$$/ for $(BOARD) board"/') \
    257                 -d $< $@
    258 
    259 $(obj)u-boot.dis:       $(obj)u-boot
    260                 $(OBJDUMP) -d $< > $@
    261 
    
    262 $(obj)u-boot:           depend version $(SUBDIRS) $(OBJS) $(LIBS) $(LDSCRIPT)
    263                 UNDEF_SYM=`$(OBJDUMP) -x $(LIBS) |sed  -n -e 's/.*\(__u_boot_cmd_.*\)/-u\1/p'|sort|uniq`;\
    264                 cd $(LNDIR) && $(LD) $(LDFLAGS) $$UNDEF_SYM $(__OBJS) \
    265                         --start-group $(__LIBS) --end-group $(PLATFORM_LIBS) \
    266                         -Map u-boot.map -o u-boot
    
    
    268 $(OBJS):
    269         echo $(OBJS)    
    270                 $(MAKE) -C cpu/$(CPU) $(if $(REMOTE_BUILD),$@,$(notdir $@))
    271 
    272 $(LIBS):
    273                 $(MAKE) -C $(dir $(subst $(obj),,$@))
    
    278 $(SUBDIRS):
    279                 $(MAKE) -C $@ all
}

分析  “ 164 include $(TOPDIR)/config.mk ” 相关文件
{
    arm_config.mk 
    cpu/arm920t/config.mk 
    cpu/arm920t/s3c24x0/config.mk 没有这个文件,忽略 
    board/100ask24x0/config.mk  //TEXT_BASE = 0x33F80000 
}
    vi config.mk
    {
         77 sinclude $(TOPDIR)/$(ARCH)_config.mk    # include architecture dependend rules
         78 endif
         79 ifdef   CPU
         80 sinclude $(TOPDIR)/cpu/$(CPU)/config.mk # include  CPU  specific rules
         81 endif
         82 ifdef   SOC
         83 sinclude $(TOPDIR)/cpu/$(CPU)/$(SOC)/config.mk  # include  SoC  specific rules
         84 endif
         85 ifdef   VENDOR
         86 BOARDDIR = $(VENDOR)/$(BOARD)
         87 else
         88 BOARDDIR = $(BOARD)
         89 endif
         90 ifdef   BOARD
         91 sinclude $(TOPDIR)/board/$(BOARDDIR)/config.mk  # include board specific rules
         92 endif
     
     
        117 # Include the make variables (CC, etc...)
        118 #
        119 AS      = $(CROSS_COMPILE)as
        120 LD      = $(CROSS_COMPILE)ld
        121 CC      = $(CROSS_COMPILE)gcc
        ..........
        

    }

继续分析Makefile
从199-211这些位置指定了生成LIBS变量就是平台、libasm、cpu、通用目录等下面的库。
OBJS和LIBS就是uboot的组成,它们再通过268-279这些代码生成。
声称以后,就剩下链接了。这由 262 - 266这些代码完成,其中,LDFLAGS指定了程序的布局和地址。
LDFLAGS += -Bstatic -T $(LDSCRIPT) -Ttext $(TEXT_BASE) $(PLATFORM_LDFLAGS)
                    -T board/100ask24x0/u-boot.lds  -Ttext 0x33F80000 
                    
                    
5.总结编译流程,对于100ask24x0.
(1)先编译cpu/arm920t/start.S
(2)对于平台、开发板、公共目录等各自调用他们的Makefile生成相应的库;
(3)将1,2两步生成的.o, .a文件按照-T board/100ask24x0/u-boot.lds  -Ttext 0x33F80000 的布局链接起来。
(4)将第三步得到的uboot文件转换为二进制格式、s-record等格式。
   同时也可以根据需要,得到uboot.dis反汇编文件。arm-linux-objdump -d u-boot > u-boot.dis

 

posted @ 2016-06-01 13:57  oucaijun  阅读(13011)  评论(0编辑  收藏  举报
下载TeamViewer完整版 下载TeamViewer