解壓u-boot-2010.03.tar.bz2就可以得到全部u-boot源程式。在頂層目錄下有29個子目錄,分別存放和管理不同的源程式。這些目錄中所要存放的檔案有其規則,可以分為3類。
● 與處理器體系結構或者開發板硬體直接相關。
● 一些通用的函式或者驅動程式。
● u-boot的應用程式、工具或者檔案。
表1.5列出了u-boot頂層目錄下各級目錄的存放原則。
表1.5 u-boot的原始碼頂層目錄說明
u-boot的源**包含對幾十種處理器、數百種開發板的支援。可是對於特定的開發板,配置編譯過程只需其中部分程式。這裡以s3c2410處理器為例,具體分析s3c2410處理器和開發板所依賴的程式,以及u-boot的通用函式和工具。
u-boot的原始碼是通過gcc和makefile組織編譯的。頂層目錄下的makefile可以設定開發板的定義,然後遞迴地呼叫各級子目錄下的makefile,最後把編譯過的程式鏈結成u-boot映像。
1)頂層目錄下的makefile
makefile負責u-boot整體配置編譯,按照配置的順序
閱讀其中關鍵的幾行。
每一種開發板在makefile下都需要有主機板配置的定義。例如,smdk2410開發板的定義如下:
smdk2410_config : unconfig
$(mkconfig) $(:_config=) arm arm920t smdk2410 samsung s3c24x0
執行配置u-boot的命令make smdk2410_config,通過mkconfig指令碼生成include/config.mk的配置檔案,檔案內容正是根據makefile對開發板的配置生成的。
arch = arm
cpu = arm920t
board = smdk2410
vendor = samsung
soc = s3c24x0
上面的include/config.mk檔案定義了arch、cpu、board、vendor、soc這些變數,這樣,硬體平台依賴的目錄檔案可以根據這些定義來確定。smdk2410平台相關目錄如下:
board/samsung/smdk2410
cpu/arm920t/
cpu/arm920t/s3c24x0/
lib_arm/
include/configs/smdk2410.h
再回到頂層目錄的makefile檔案開始的部分,其中,下列幾行包含了這些變數的定義:
# load arch, board, and cpu configuration
include $(obj)include/config.mk
export arch cpu board vendor soc
makefile的編譯選項和規則在頂層目錄的config.mk檔案中定義,各種體系結構通用的規則直接在這個檔案中定義。通過arch、cpu、board、vendor、soc等變數為不同硬體平台定義不同選項。不同體系結構的規則分別包含在ppc_config.mk、arm_config.mk、mips_config.mk等檔案中。
頂層目錄的makefile中還要定義交叉編譯器,以及編譯u-boot所依賴的目標檔案
ifeq (arm,$(arch))
cross_compile ?=arm-none-linux-gnueabi-
# 交叉編譯器的字首
endif
# load other configuration
include $(topdir)/config.mk
# u-boot objects....order is important (i.e. start must be first)
objs = cpu/$(cpu)/start.o # 處理器相關的目標檔案
…
#定義依賴的目錄,每個目錄下先把目標檔案連線成*.a檔案
libs = lib_generic/libgeneric.a
libs += lib_generic/lzma/liblzma.a
libs += lib_generic/lzo/liblzo.a
libs += $(shell if [ -f board/$(vendor)/common/makefile ];
then echo "board/$(vendor)/common/lib$(vendor).a"; fi)
libs += cpu/$(cpu)/lib$(cpu).a
ifdef soc
libs += cpu/$(cpu)/$(soc)/lib$(soc).a
endif
ifeq ($(cpu),ixp)
libs += cpu/ixp/npe/libnpe.a
endif
libs += lib_$(arch)/lib$(arch).a
… 還有u-boot映象編譯的依賴關係如下:
all += $(obj)u-boot.srec $(obj)u-boot.bin $(obj)system.map $(u_boot_nand)
$(u_boot_onenand)
all: $(all)
$(obj)u-boot.hex: $(obj)u-boot
$(objcopy) $ -o ihex $< $
$(obj)u-boot.srec: $(obj)u-boot
$(objcopy) -o srec $< $
$(obj)u-boot.bin: $(obj)u-boot
$(objcopy) $ -o binary $< $
$(obj)u-boot.ldr: $(obj)u-boot
$(create_ldr_env)
$(ldr) -t $(config_bfin_cpu) -c $ $< $(ldr_flags)
$(obj)u-boot.ldr.hex: $(obj)u-boot.ldr
$(objcopy) $ -o ihex $< $ -i binary
$(obj)u-boot.ldr.srec: $(obj)u-boot.ldr
$(objcopy) $ -o srec $< $ -i binary
$(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 $< $
$(obj)u-boot.imx: $(obj)u-boot.bin
$(obj)tools/mkimage -n $(imx_config) -t imximage \
-e $(text_base) -d $< $
$(obj)u-boot.kwb: $(obj)u-boot.bin
$(obj)tools/mkimage -n $(kwd_config) -t kwbimage \
-a $(text_base) -e $(text_base) -d $< $
$(obj)u-boot.sha1: $(obj)u-boot.bin
$(obj)tools/ubsha1 $(obj)u-boot.bin
$(obj)u-boot.dis: $(obj)u-boot
$(objdump) -d $< > $
makefile預設的編譯目標為all,包括u-boot.srec、u-boot.bin和system.map。u-boot.srec和u-boot.bin就是通過ld命令按照u-boot.map位址表把目標檔案組裝成u-boot的。其他makefile內容就不再詳細分析了,通過上述**分析應該可以為讀者
閱讀**提供一些線索。
2)開發板配置標頭檔案
除了編譯過程makefile以外,還要在程式中為開發板定義配置選項或者引數。這個標頭檔案是include/configs/.h。用相應的board定義代替
這個標頭檔案中主要定義了兩類形式的引數。
一類形式的引數用來選擇處理器、裝置介面、命令、屬性等,以及定義匯流排頻率、串列埠波特率、flash位址等引數。
大部分引數字首是config_,例如:
#define config_arm920t 1
#define config_kgdb_baudrate 115200
#define config_cs8900
#define config_kgdb_baudrate 115200
另一類形式的引數為:
#define phys_flash_size 0x00100000
#define use_920t_mmu 1
根據對makefile的分析,編譯分為兩步。第1步是配置,如make smdk2410_config;第2步是編譯,執行make就可以了
編譯完成後,可以得到u-boot各種格式的映像檔案和符號表,如表1.6所示。
表1.6 u-boot編譯生成的映像檔案
UBOOT的編譯過程三
繼續上 objs cpudir start.o ifeq cpu i386 objs cpudir start16.o objs cpudir resetvec.o endif ifeq cpu ppc4xx objs cpudir resetvec.o endif ifeq cpu mpc85xx...
Uboot學習筆記(三)Uboot編譯過程分析
mkconfig分析 makefile分析 通過閱讀訊為提供的使用手冊,我們可以知道三星exynos4412的uboot的編譯是通過呼叫build uboot.sh來實現的,這個指令碼檔案通過傳入引數的不同來生成不同記憶體大小 emmc大小的核心板的uboot.bin二進位制檔案,例如 scp封裝2...
U Boot 1 1 6的編譯過程
從頂層makefile說起 92行 mkconfig srctree mkconfig其中的mkconfig是乙個shell指令碼,srctree預設值為u boot的頂層目錄。117行 include objtree include config.mkinclude config.mk由92行的指...