u-boot源碼配置原理分析
作者:楊碩,華清遠(yuǎn)見嵌入式學(xué)院講師。
u-boot的源代碼默認(rèn)是不針對(duì)任何目標(biāo)平臺(tái)的,當(dāng)我們要移植u-boot到一個(gè)特定的目標(biāo)平臺(tái)時(shí),需要生成針對(duì)目標(biāo)平臺(tái)的配置文件。u-boot目前已經(jīng)支持的芯片可以在include/configs/下面找到。比如我們要編譯針對(duì)s3c2410芯片的u-boot.bin,那么我們就需要在u-boot源碼根路徑下執(zhí)行:
make smdk2410_config
這樣我們的u-boot源碼就是針對(duì)smdk2410平臺(tái)了。(注:smdk2410是三星專門為 其arm9芯片s3c2410做的reference board,即參考板,國內(nèi)大部分基于s3c2410的開發(fā)板都是參考smdk2410來做的)
那么,make smdk2410_config背后到底了做了什么工作呢?u-boot是如何生成針對(duì)smdk2410平臺(tái)的配置的?下面我們就來分析這一過程。由于make命令會(huì)調(diào)用Makefile,所以我們要分析這個(gè)Makefile里面相關(guān)的部分。
smdk2410_config是u-boot源碼根路徑下的Makefile的一個(gè)目標(biāo),相關(guān)的代碼如下:
smdk2410_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0
unconfig:
@rm -f $(obj)include/config.h $(obj)include/config.mk \
$(obj)board/*/config.tmp $(obj)board/*/*/config.tmp
在執(zhí)行make smdk2410_config的時(shí)候會(huì)先執(zhí)行unconfig目標(biāo),負(fù)責(zé)清理掉以前的配置信息。然后就會(huì)執(zhí)行@$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0,MKCONFIG是Makefile的一個(gè)變量,定義如下:
MKCONFIG := $(SRCTREE)/mkconfig
可見,MKCONFIG就是源碼頂級(jí)目錄下的mkconfig文件,這個(gè)文件是一個(gè)shell腳本程序,所以在執(zhí)行make smdk2410_config的時(shí)候,系統(tǒng)就會(huì)執(zhí)行mkconfig這個(gè)腳本,arm arm920t smdk2410 NULL s3c24x0則是傳遞個(gè)這個(gè)腳本的五個(gè)參數(shù)。
mkconfig這個(gè)腳本程序?qū)嶋H上就為我們生成了兩個(gè)文件,一個(gè)是include/config.h,另一個(gè)是include/config.mk。我們可以在make smdk2410_config之前看一下include下面是沒有這兩個(gè)文件的。config.h里面只有一句話:
/* Automatically generated - do not edit */
#include <config/smdk2410.h>
其實(shí)就是為我們包含了目標(biāo)平臺(tái)的配置頭文件。另一個(gè)文件config.mk里面則有如下內(nèi)容:
ARCH = arm
CPU = arm920t
BOARD = smdk2410
SOC = s3c24x0
其實(shí)這里面定義了四個(gè)變量,分別是體系結(jié)構(gòu)(arm)、處理器核(arm920t)、目標(biāo)板(smdk2410)、片上系統(tǒng)(s3c24x0)。
上面的這個(gè)include/config.mk文件會(huì)在Makefile里面被包含,對(duì)應(yīng)的代碼如下:
ifeq ($(OBJTREE)/include/config.mk,$(wildcard $(OBJTREE)/include/config.mk))
# load ARCH, BOARD, and CPU configuration
include $(OBJTREE)/include/config.mk
export ARCH CPU BOARD VENDOR SOC
也就是說,Makefile會(huì)判斷include下面有沒有config.mk這個(gè)文件,如果有就包含這個(gè)文件,這就相當(dāng)于在Makefile里面定義了ARCH、CPU、BOARD和SOC這四個(gè)變量。這樣u-boot就知道自己是針對(duì)哪個(gè)目標(biāo)平臺(tái)的了。
在u-boot頂層目錄下面也有一個(gè)config.mk文件,這個(gè)文件里面主要定義了交叉編譯器選項(xiàng)及編譯規(guī)則:
# load other configuration
include $(TOPDIR)/config.mk
那么這個(gè)config.mk和include下的config.mk就包含了我們編譯u-boot時(shí)的所有信息。其實(shí)關(guān)鍵就是include下的config.mk文件,Makefile包含這個(gè)文件以后就知道目標(biāo)平臺(tái)的信息了。
聯(lián)系客服