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概述
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 <span style="color:#ff6666;">//包含了配置過程中巨集生成的include/config.mk檔案</span>
export ARCH CPU BOARD VENDOR SOC
include $(TOPDIR)/config.mk <span style="color:#ff6666;">//包含了配置過程中生成的頂層的config.mk檔案</span>
- 配置完成後,執行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 $< [email protected]
$(obj)u-boot.srec: $(obj)u-boot
$(OBJCOPY) ${OBJCFLAGS} -O srec $< [email protected]
$(obj)u-boot.bin: $(obj)u-boot
$(OBJCOPY) ${OBJCFLAGS} -O binary $< [email protected]
$(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 $< [email protected]
$(obj)u-boot.dis: $(obj)u-boot
$(OBJDUMP) -d $< > [email protected]
$(obj)u-boot: depend version $(SUBDIRS) $(OBJS) $(LIBS) $(LDSCRIPT)
<span style="color:#ff6666;">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格式。