U-Boot,全称为Universal Boot Loader,即通用Bootloader。通用有两层含义:可以引导多种操作系统、支持多种架构的CPU。
 
         根据U-Boot源码文件夹顶层的Readme文件说明,针对使用的开发板 board/<board_name>,执行:
         1、make  <board_name>_config  
         2、make  all
可以生成以下三个文件:
         1、U-Boot.bin:二进制可执行文件,可以直接烧入ROM、NOR Flash;
         2、U-Boot:ELF格式的可执行文件;
         3、U-Boot.srec:Motoroal S-Record格式的可执行文件。
        
         通过分析顶层Makefile和mkconfig两个文件,配置简述过程如下:
         make <board_name>_config 相当于执行 ./mkconfig <board_name> $2 $3 $4 $5 $6
         1、创建到平台/开发板相关的头文件的链接:
                ln -s asm-$2 asm
                ln -s arch-$6 asm-$2/arch
                ln -s proc-armv asm-$2/proc               //如果$2不是arm的话,此行没有
         2、创建顶层Makefile包含的文件include/config.mk:
                ARCH =$2
                CPU = $3
                BOARD = $4
                VENDOR = $5
                SOC = $6
         3、创建开发板相关的头文件include/config.h:
                #include <configs/<board_name>.h>
对于一个拿到手的板子,查看其各个器件型号后,要在board目录下新建一个开发板<board_name>的目录,同时要在include/configs下新建一个头文件<board_name>.h,里面存放的就是开发板的相关配置信息。其中主要包括了一下两类宏:
          1、选项(Options),前缀为"CONFIG_",用于选择CPU、SOC、开发板,设置系统时钟,选择设备驱动等;
          2、参数(Setting),前缀为"CFG_",用于设置malloc缓冲池的大小、U-Boot的提示符、U-Boot下载文件时的默认加载地址、Flash的起始地址等。
         U-Boot在编译、连接过程中,几乎每个文件都被编译和连接了,由宏开关来决定哪些代码是有效的。
 
         总结U-Boot的编译流程如下:
         1、首先,编译cpu/$(CPU)/start.S,对于不同的CPU,还有可能编译cpu/$(CPU)下的其他文件;
         2、然后,对于平台/开发板相关的每个目录,每个通用目录都使用各自的Makefile生成相应的库;
         3、将1、2步骤生成的.o、.a文件按照board/$(BOARDDIR)/config.mk文件中制定的代码起始地址、board/$(BOARDDIR)/U-Boot.lds连接脚本进行连接;
         4、第3步得到的是ELF格式的U-Boot, 之后Makefile还会将它转换为二进制格式、S-Record格式。