U Boot 編譯過程解析

2021-09-22 08:41:14 字數 4546 閱讀 4851

解壓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行的指...