u boot 1 1 6分析(一)配置過程

2021-10-04 11:26:05 字數 3495 閱讀 9841

在arm板上電時,為了執行操作linux系統,需要先初始化工作,如初始化各種硬體、設定棧指標、載入作業系統等,完成這些任務的程式就是bootloader,它是上電執行的第一段程式。bootloader種類眾多,在arm上用得較多的有u-boot和vivi

不同板子有不同的硬體配置,bootloader一般也不會相同,u-boot為了支援眾多的cpu,為每個支援的cpu都編寫了特定的檔案(位於根目錄的cpu子目錄中)用於描述該cpu,對於不同的硬體也有不同的檔案用於描述它,然後這些同類的檔案中,在編譯時根據makefile,從中只選擇需要的進行編譯鏈結。如果我們u-boot不支援開發板上的某個硬體,則需要我們自己編寫驅動程式,放入u-boot目錄的指定位置,並對應修改子目錄的makefile,將其納入編譯鏈結範圍。

下面以u-boot-1.1.6為例分析

根據頂層目錄下readme檔案的說明,配置、編譯u-boot的命令為:

make _config

make

對於smdk2410開發板,配置命令為make smdk2410_config

開啟頂層目錄makefile檔案,搜尋smdk2410_config,找到

smdk2410_config : unconfig

@$(mkconfig) $(@:_config=) arm arm920t smdk2410 null s3c24x0

搜尋mkconfig可以找到其定義:

mkconfig := $(srctree)/mkconfig

搜尋srctree可以找到其定義:

srctree := $(curdir),其中curdir就是頂層目錄

@$(mkconfig) 等效為頂層目錄/mkconfig

$(@:_config=) 等效為smdk2410

故執行配置命令相當於執行命令:頂層目錄/mkconfig smdk2410 arm arm920t smdk2410 null s3c24x0

分析頂層目錄下mkconfig檔案:

board_name="" #board_name定義為空

while [ $# -gt 0 ] ; do #$#是傳參個數,-gt表示」>」

case "$1" in #$1是第乙個引數,因為$1不是--、-a、-n、*,故該段**不執行

--) shift ; break ;;

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

*) break ;;

esac

done

[ "$" ] || board_name="$1" #因為board_name為空,執行board_name=」$1」,也就是board_name=smdk2410

[ $# -lt 4 ] && exit 1 #lt表示」<」

[ $# -gt 6 ] && exit 1 #兩行用於判斷傳入引數是否小於4個或者大於5個,是則退出指令碼

echo "configuring for $ board..." #在命令列中列印

if [ "$srctree" != "$objtree" ] ; then #從頂層makefile可以知道,二者相等,執行else分支

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 #進入include子目錄

rm -f asm #刪除原有的asm檔案

ln -s asm-$2 asm #建立新的asm檔案指向asm-arm

firm -f asm-$2/arch #刪除 asm-arm/arch

if [ -z "$6" -o "$6" = "null" ] ; then #$6不為空也不等於」null」,故執行else分支

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

else

ln -s $arch-$6 asm-$2/arch #lnprefix為空,即執行ln -s arch-s3c24x0 asm-arm/arch

fiif [ "$2" = "arm" ] ; then #$2=」arm」,執行then分支

rm -f asm-$2/proc #刪除 asm-arm/proc

ln -s $proc-armv asm-$2/proc #ln -s proc-armv asm-arm/proc

fiecho "arch = $2" > config.mk #新建檔案config.mk,追加arch = arm

echo "cpu = $3" >> config.mk #在config.mk新行追加cpu = arm920t

echo "board = $4" >> config.mk #在config.mk新行追加board = smdk2410

[ "$5" ] && [ "$5" != "null" ] && echo "vendor = $5" >> config.mk #$5=null,不執行

[ "$6" ] && [ "$6" != "null" ] && echo "soc = $6" >> config.mk #$6=s3c24x0,在config.mk新行追加soc = s3c24x0

then

echo >> config.h

else

> config.h #建立新檔案config.h

fiecho "/* automatically generated - do not edit */" >>config.h #在config.h新行追加一段注釋

echo "#include " >>config.h #在config.h新行追加#include exit 0 #退出指令碼

配置結果如下:

1、生成include/asm目錄鏈結到include/asm-arm

2、生成include/asm-arm/arch目錄鏈結到include/asm-arm/arch-s3c24x0

3、生成include/asm-arm/proc目錄鏈結到include/asm-arm/proc-armv

4、生成include/config.mk,填充內容為:

arch   = arm

cpu = arm920t

board = smdk2410

soc = s3c24x0

5、生成include/config.h,填充內容為

#include

u boot 1 1 6分析(二)編譯鏈結過程

分析頂層makefile 117行包含了配置過程生成的config.mk檔案 include objtree include config.mk選擇對應的交叉編譯工具鏈 ifndef cross compile ifeq hostarch ppc cross compile else ifeq ar...

U Boot 1 1 6的編譯過程

從頂層makefile說起 92行 mkconfig srctree mkconfig其中的mkconfig是乙個shell指令碼,srctree預設值為u boot的頂層目錄。117行 include objtree include config.mkinclude config.mk由92行的指...

uboot學習 配置過程分析

一 uboot的功能分析 結合uboot 1.1.16版本說明uboot的配置過程。二 uboot的配置 編譯和鏈結過程分析 結合頂層makefile 編譯乙個可用的uboot.bin檔案一般經過以下步驟 首先是配置,make smdk2410 config,然後是make all完成編譯,最後生成...