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格式。
本文出自 “stay hangry,stay foolish” 博客,请务必保留此出处http://hjctty.blog.51cto.com/1031616/240447