在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完成編譯,最後生成...