1. 程式人生 > >u-boot學習(二):u-boot簡要分析

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