1. 程式人生 > >從0移植uboot (一) _配置分析

從0移植uboot (一) _配置分析

onf 交叉編譯器 oar gnu boot 定位 nbsp oot rip

來源:Linux社區 作者:xiaojiang1025 :http://www.linuxidc.com/Linux/2017-02/141018.htm

和絕大多數源碼編譯安裝一樣,uboot的編譯流程也類似於"make config->make->make install"**三步,只是由於uboot本身是針對多種平臺的bootloader,軟件的復雜性和通用型決定了編譯uboot需要自行填補很多坑。本文主要討論的就是移植uboot-2013.01的第一個坑——uboot分析。

配置編譯環境

既然要編譯uboot,首先就要有相應的編譯器,我的目標板是三星的exynos4412,就是一個ARM核的SoC,這意味著兩件事,第一,我編譯的時候必須寫明"export ARCH=arm"

來表明我要編譯的目標平臺。第二,必須選擇合適的開發工具,由於各種uboot各種linux都是對編譯器比較敏感的,所以強烈建議使用tar來安裝交叉編譯器而不是apt,這樣可以防止多個編譯工具的沖突,這裏,uboot作為裸板程序,我用的是arm-none-linux-guneabi-xxx的編譯器,所以用來編譯的腳本加了下面兩句:

export ARCH=arm
export CROSS_COMPILE=/opt/arm-cross-compile/arm-none-linux-gnueabi-2014-05/bin/arm-none-linux-gnueabi-
...

config的流程

uboot的頂層配置主要依靠下面的這棵樹

.
├── Makefile
├── mkconfig
├── include
│ ├── config.mk
│ └── config.h
└── boards.cfg

uboot的配置就是通過鍵入相應的命令將相應的Makfile變量賦值,通過你的配置,Makefile相應的變量就知道編譯哪個平臺下的哪個cpu的哪個版本的開發板。註意:不同版本的uboot的配置命令可能是不同的,拿到源碼包看README是個很好的習慣,比如uboot-2013-01的配置命令是下面這個樣子的,但uboot-2016.10的配置命令就不是這個,感興趣的可以查一下。:
技術分享圖片

在uboot-2013-01中,頂層目錄下的boards.cfs文件中查看它支持的開發板和相應的信息,這個文件就像一個全局的"字典",後續的編譯過程需要根據配置名檢索到相應的信息,所以不要隨意修改。下面這個就是字典的樣子

技術分享圖片

了解了這些,手癢的話就可以先執行下面的腳本試一下,但是並不會生成真正適配我們板子的uboot,只是適配參考板

#!/bin/bash

export ARCH=arm
export CROSS_COMPILE=/opt/arm-cross-compile/arm-none-linux-gnueabi-2014-05/bin/arm-none-linux-gnueabi-
make origen_config 
make all

config的分析

首先,當我們"make origen_config"的時候,顯然是打算創建makefile裏面的一個叫origen_config的目標。根據Makefile的語法,我們就可以找到下面這一段(然而並不是想象中的origen_config:)

技術分享圖片

Makefile
--770-->unconfig目標的作用是刪除所有由於配置產生的文件
--775-->%是Makefile中的通配符,表示任意字符串,所以我們的origen_config就會與之相匹配,這個目標的依賴於unconfig,即每次config之前都會刪除之前的配置。如果你鍵入兩次"make xxx_config",那麽它最終只會形成一個相應的配置文件,這種寫法值得借鑒
--776-->"MKCONFIG"就是頂層目錄下的mkconfig腳本,而"$(@:_config=)"就是去除目標中的"_config"串,所以實際上就是去到頂層目錄下執行"$mkconfig -A origen"

我們去到這個mkconfig看看它都做了什麽

技術分享圖片

mkconfig
--22-->我們傳入的參數會導致腳本執行這個if裏面的內容
--23-31-->用擴展正則表達式去頂層目錄下的boads.cfg文件中提取含有origen相應的行到line變量中,並把line設置為新的參數列表。取得了這個參數字符串,mkconfig就可以把相應的頭文件,鏈接和全局變量準備好。

我們來稍微看點細節,首先,line裏應該有的內容是我們在Boards.cfg中搜到的這個:

技術分享圖片

根據boards.cfg,這幾個參數分別是:TARGET,ARCH,CPU,Board name,Vendor,SoC,Options(origen只有6個,加上之前的$1一共7個參數),So執行的代碼是:

技術分享圖片

從中可以看出,這段代碼就是把之前line的內容分段並賦值給開頭的arch、cpu、board等變量,顯然,這些變量對於我們找到相應的目錄,相應的文件進行編譯至關重要。這些信息,會在mkconfig的之後寫入到相應的文件中:

技術分享圖片

此外,還要建立一些硬鏈接:

技術分享圖片

至此,我們需要的"include/config.mk"就配置完成了,這個文件是長成這個樣子的:

技術分享圖片

除了生成"include/config.mk"mkconfig還負責生成"include/config.h"文件,不過有了之前準備好的變量,這部分只不過是將上面的變量和相應的文件夾進行了初步的定位,代碼就是下面這部分:

技術分享圖片

它生成的"include/config.h"最終是長成這個樣子的:

技術分享圖片

有了這兩個文件,當我們再執行"$make"的時候就可以找到相應的文件了。

從0移植uboot (一) _配置分析