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格式。