uboot配置過程詳解

2021-08-19 13:14:13 字數 4581 閱讀 8643

當我們在編譯uboot的時候,要分為兩個階段,乙個階段是配置,配置用的命令是make x210_sd_config。配置完成後開始正式的編譯,命令為make,當然,編譯命令可以加什麼的引數,比如多執行緒編譯:make -j4,比如靜默編譯:make -s等。在這一篇文章中,我將單獨詳細分析uboot的配置過程。

1、主makefile中配置相關部分

首先,目光轉向主makefile,在2589行有如下程式:

x210_sd_config :    unconfig

@$(mkconfig) $(@:_config=) arm s5pc11x x210 samsung s5pc110

@echo

"text_base = 0xc3e00000" > $(obj)board/samsung/x210/config.mk

顯然,x210_sd_config是makefile的乙個目標。其依賴為unconfig,在主makefile的473行可以看到unconfig的定義如下:

unconfig:

@rm -f $(obj)include/config.h $(obj)include/config.mk \

$(obj)board/*/config.tmp $(obj)board/*/*/config.tmp \

$(obj)include/autoconf.mk $(obj)include/autoconf.mk.dep \

$(obj)board/$(

vendor)/$(

board)/config.mk

這裡插播一句:make中命令列前面加上at符號@,就是在make執行時候,輸出的資訊中,不要顯示此行命令。

可以看出,unconfig其實是執行了乙個刪除命令,將配置過程中生成的檔案全部刪掉,達到未配置的效果。保證重新配置時輸出檔案的純粹性。

而x210_sd_config下面執行了兩句指令,首先看第二條:建立了檔案config.mk,並將字串"text_base = 0xc3e00000"寫入到該檔案中。 text_base 變數實際上指定了鏈結位址,在此不贅述。

mkconfig    := $(srctree)/mkconfig
所以說第一條指令的意思就是執行mkconfig檔案,並且傳進了6個引數,尤其需要分析的是第乙個引數$(@:_config=),其實這裡是用了乙個比較高階的makefile語法,$(a:patterna=patternb),這樣的語法表示把a變數裡的形式為patterna的換成為patternb,然後輸出。那麼在這個例子裡,a變數換成了@,它的意思與shell裡@的意思是一樣的,就是輸入進來的所有的引數。在這裡,@就是x210_sd_config,patterna就是_config,patternb就是空,所以$(@:_config=)的實際表示為x210_sd

傳參含義

x210_sd

target

armarchitecture

s5pc11x

cpux210

board

samsung

vendor

s5pc110

soc

2、mkconfig指令碼檔案

從第一部分可以看出,配置過程其實就是執行了根目錄下的mkconfig檔案,所以,這一小部分詳細分析該shell指令碼。

2.1 前期準備

board_name=""

# name to print in make output

while [ $#

-gt0 ] ; do

case

"$1"

in --) shift ; break ;;

-n) shift ; board_name="$" ; shift ;;

*) break ;;

esac

done

#如果board_name為空,那麼就執行後邊的賦值

[ "$" ] || board_name="$1"

#傳入引數的數量應該在4到6之間,因為[vendor] [soc]這兩個引數可以不傳。

[ $#

-lt4 ] && exit

1[ $#

-gt6 ] && exit

1echo

"configuring for $ board..."

這一部分**主要是對傳入的引數數目進行了校驗,給board_name變數賦值。

2.2 建立符號鏈結檔案

#

# create link to architecture specific headers

##在編譯的時候uboot支援原地編譯(編譯結果跟.c/.s檔案等混在一起)和自己定義輸出資料夾兩種方式

#如果[ "$srctree" != "$objtree" ]成立代表使用的是後者。我們現在暫時考慮原地編譯的這種情況。

if [ "$srctree" != "$objtree" ] ; then

mkdir -p $/include

mkdir -p $/include2

cd$/include2

rm -f asm

ln -s

$/include/asm-$2 asm

lnprefix="../../include2/asm/"

cd ../include

rm -rf asm-$2

rm -f asm

mkdir asm-$2

ln -s asm-$2 asm

else

cd ./include

rm -f asm

ln -s asm-$2 asm

fi# create link for s5pc11x soc

if [ "$3" = "s5pc11x" ] ; then

rm -f regs.h

ln -s

$6.h regs.h

rm -f asm-$2/arch

ln -s arch-$3 asm-$2/arch

fiif [ "$2" = "arm" ] ; then

rm -f asm-$2/proc

ln -s

$proc-armv asm-$2/proc

fi

上面的程式建立了以下符號鏈結檔案:

第乙個:在include目錄下建立asm檔案,指向asm-arm。

第二個:在include目錄下建立regs.h檔案,指向include/s5pc110.h

第三個:在inlcude/asm-arm下建立乙個arch檔案,指向include/arch-s5pc11x

第四個:在include/asm-arm下建立乙個proc檔案,指向include/asm-arm/proc-armv

上面的過程在uboot實現可移植上非常重要,比如在include資料夾下每個soc都會有自己的.h,裡面放置著自己的暫存器的定義,例如s5pc110.h,該標頭檔案會被很多.c檔案所包含。如果我們的soc現在不是s5pc110了,換成別的了,相應的標頭檔案就要乙個個修改,很麻煩且易出錯。

而現在建立乙個符號鏈結檔案regs.h代替這個標頭檔案,那麼在移植的時候就只需要更改下regs.h指向的檔案就好了。這就是uboot實現可移植性的乙個重要手段——建立符號鏈結檔案。

2.3 其他輸出檔案

# create include file for make

echo

"arch = $2" > config.mk

echo

"cpu = $3" >> config.mk

echo

"board = $4" >> config.mk

[ "$5" ] && [ "$5" != "null" ] && echo

"vendor = $5" >> config.mk

[ "$6" ] && [ "$6" != "null" ] && echo

"soc = $6" >> config.mk

## create board specific header file

#then

echo >> config.h

else

> config.h # create new config file

fiecho

"/* automatically generated - do not edit */" >>config.h

echo

"#include $1.h>" >>config.h

上面對兩個檔案進行了操作:include/config.mk和include/config.h。

shell中>表示建立檔案,>>表示在該檔案中追加內容。

uboot配置過程詳解1

1 mkconfig指令碼的6個引數 config arm s5pc11x x210 samsung s5pc110 指的是目標 x210 sd config裡的 config部分用空替換,得到 x210 sd,這就是第乙個引數,所以 1 x210 sd 2 arm 3 s5pc11x 4 sams...

uboot配置過程詳解2

1 建立iinclude config.mk檔案 mkconfig檔案123 129行 2 建立include config.mk檔案是為了讓makefile在133行去包含的 詳解見 3 思考 uboot的配置和編譯過程的配合。編譯的時候需要arch arm cpu xx等這些變數來指導編譯,配置...

u boot的配置過程

1.頂層makefile 這裡我們將以smdk2410為例來介紹,uboot是u boot 2009.03,首先我們應該開啟u boot的頂層makefile,這裡按照人的思維來說,我們應該首先去看看smdk2410的配置項 smdk2410 config 2830 smdk2410 config ...