u-boot学习(二):u-boot简要分析

(一)

以u-boot-1.1.6为例分析目录结构如下:

1、平台相关的或开发板相关的目录:board、cpu、lib_i386类似

2、通用函数的目录:include、lib_generic、common

3、通用的设备驱动程序:disk、drivers、dtt、fs、nand_spl、net、post、rtc

4、u-boot工具、示例程序、文档:doc、example、tools

u-boot顶层目录说明

目录                     特性                                                          解释说明
board              开发板相关                           对应不同配置的电路板(即使CPU相同),比如smdk2410等
cpu                  平台相关                               对应不同的CPU,如arm920t、i386等。
lib_i386          平台相关                               某一架构下通用的文件
include           通用函数                               头文件和开发板配置文件,开发板的配置文件都放在include/configs目录下
lib_generic    通用函数                               需要通用的库函数,比如printf等
common         通用函数                               通用函数,多是对下一层驱动程序的进一步封装
disk                 通用设备驱动程序               硬盘接口程序 
drivers            通用设备驱动程序               各类具体设备的驱动程序
dtt                    通用设备驱动程序               数字温度测量或者传感器的驱动
fs                     通用设备驱动程序               文件系统
nand_spl        通用设备驱动程序               u-boot一般从ROM、NORFLASH等设备启动,现在开始支持NAND Flash启动
net                   通用设备驱动程序               各种网络协议
post                 通用设备驱动程序               上电自检程序
rtc                    通用设备驱动程序               实时时钟的驱动
doc                  文档                                       开发、使用文档
example         示例程序                               一些测试程序,可以使用u-boot下载后运行
tools                工具                                       制作S-Record、u-boot格式映像的工具,如mkimage


从上表中u-boot目录的分析可以看出u-boot的一些特性:支持多种嵌入式操作系统内核,如Linux、Vxworks等;支持多个处理器系列,如PowerPC、ARM、x86等;丰富的设备驱动源码,如串口、SDRAM、Flash、以太网等;支持NFS挂载、RAMDISK形式的根文件系统、从Flash中引导压缩或非压缩系统内核;支持目标板环境变量多种存储方式,如Flash等。CRC32校验、上电自检功能等。


u-boot中各目录间也是层次结构的,这有助于在移植过程中为我们需要修改哪些文件提供信息,由下图可以知道,只需修改board、cpu、lib_xxx目录下的文件,即可完成移植过程,如果想要添加其他的命令等,则需要修改其他文件。

lib_generic    common
post    net    fs   disk
dtt      nand_spl   rtc   drivers
board   cpu  lib_xxx

(二)配置

上一篇的u-boot概述中配置u-boot时使用了命令:make 100ask24x0_config命令


100ask24x0_config    :    unconfig
    @$(MKCONFIG) $(@:_config=) arm arm920t 100ask24x0 NULL s3c24x0
该规则解释为:
100ask24x0_config    :    unconfig
    mkconfig 100ask24x0 arm arm920t 100ask24x0 NULL s3c24x0

因此配置过程,我们可以分析根目录下的mkconfig文件,从而了解配置过程,做了哪些工作
 

总结配置的作用有以下4点:
1、开发板名称BOARD_NAME等于$1

2、创建到平台/开发板相关的头文件的链接,如下所示
    ln -s asm-$2 asm
    ln -s arch-$6 asm-$2/arch
    ln -s proc-armv asm-$2/proc
3、创建顶层Makefile包含的文件include/config.mk
4、创建开发板相关的头文件include/config.h

 

(三)编译、链接

既然在编译之前必须经过上面的配置过程,那么配置过程一定为编译过程提供了某些东西,否则的话,我们直接编译就可以了。那么,上面配置过程生成的文件、修改的地方是如何在编译过程中体现的呢。其实,这在Makefile文件中有所体现。如:

include $(OBJTREE)/include/config.mk  //包含了配置过程中宏生成的include/config.mk文件
export	ARCH CPU BOARD VENDOR SOC
include $(TOPDIR)/config.mk  //包含了配置过程中生成的顶层的config.mk文件
  1. 配置完成后,执行make命令即可链接。执行make,我们执行的是Makefile里的make all语句,它的命令如下:
ALL = $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map $(U_BOOT_NAND)
 
all:		$(ALL)
 
$(obj)u-boot.hex:	$(obj)u-boot
		$(OBJCOPY) ${OBJCFLAGS} -O ihex $< $@
 
$(obj)u-boot.srec:	$(obj)u-boot
		$(OBJCOPY) ${OBJCFLAGS} -O srec $< $@
 
$(obj)u-boot.bin:	$(obj)u-boot
		$(OBJCOPY) ${OBJCFLAGS} -O binary $< $@
 
$(obj)u-boot.img:	$(obj)u-boot.bin
		./tools/mkimage -A $(ARCH) -T firmware -C none \
		-a $(TEXT_BASE) -e 0 \
		-n $(shell sed -n -e 's/.*U_BOOT_VERSION//p' $(VERSION_FILE) | \
			sed -e 's/"[	 ]*$$/ for $(BOARD) board"/') \
		-d $< $@
 
$(obj)u-boot.dis:	$(obj)u-boot
		$(OBJDUMP) -d $< > $@
 
$(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

总结编译流程:
1、编译cpu/$(CPU)/start.S。

2、然后,对于平台/开发板相关的每个目录、每个通用目录都使用它们各自的Makefile生成相应的库。

3、将1、2步骤生成的.o、.a文件按照board/$(BOARDDIR)/config.mk文件中指定的代码段起始地址、board/$(BOARDDIR)/U-Boot.lds链接脚本进行链接。

4、第3步得到的ELF格式的U-Boot,后面Makefile还会将它转换为二进制格式S-Record格式。
 

你可能感兴趣的:(uboot学习)