歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

uboot的配置流程分析

簡單介紹一下uboot的基本配置流程。和絕大多數源碼編譯安裝一樣,uboot在執行make之前需要執行make XXXconfig來配置相關信息,而且uboot本身是針對多種平台的bootloader,所以編譯的過程也會有一點小麻煩,需要對它的源碼結構有一點了解。移植uboot,大體上的流程是:配置uboot->編譯->配置相關平台的啟動程序->燒錄

選平台&工具鏈

平台就是CPU的架構,即exynos4412的平台就是arm,所以ARCH=arm,交叉編譯工具鏈我這裡用的是arm-none-linux-gnueabi-,因為我的電腦中有很多工具鏈,而很多工具鏈的工具名字還有所重疊,所以最好只有一個是apt-get安裝的,其他的都通過tar包安裝,這樣可以避免多個工具鏈都去修改環境變量,一旦我用的工具在多個工具鏈中都存在,就很可能導致我實際用的工具不是我想用的,因為系統會匹配它第一個在PATH中尋找到的工具。解決這個問題的一個方法就是每次使用工具的時候都指定相應的路徑,比如我這裡就應該是CROSS_COMPILE=/opt/arm-cross-compile/arm-none-linux-gnueabi-2014-05/bin/arm-none-linux-gnueabi-,如果覺得每次都要修改uboot的頂層Makefile或者傳入這麼長的一個變量很麻煩,可以寫一個shell腳本。我這裡就使用shell腳本的方式配置相應的環境變量

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

配置流程

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

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

uboot的配置就是通過鍵入相應的命令將相應的Makfile變量賦值,通過你的配置,Makefile相應的變量就知道編譯哪個平台下的哪個cpu的哪個版本的開發板。通過頂層的README我們可以看到:

注意:不同版本的uboot的配置命令可能是不同的,拿到源碼包看README是個很好的習慣,比如uboot-2016-07的配置命令是這個樣子的:

在uboot-2013-01中,我們去到頂層目錄下的boards.cfs文件中查看它支持的開發板和相應的信息,需要注意的是這個文件可不是README,後續的編譯過程需要讀取文件中的信息,所以不要隨意修改,同理,如果我們需要配置我們自己的開發板,也就需要對其中的信息進行相應的修改

了解了這些,手癢的話就可以先執行下面的腳本試一下,但是並不會生成真正適配我們板子的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

編譯流程簡析

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

根據Makefile語法,%是Makefile中的通配符,表示任意字符串,所以我們的origen_config就會與之相匹配,這個目標的依賴於unconfig,就是說如果你鍵入兩次make origen_config,那麼它最終只會形成一個相應的配置文件,這種寫法在Makefile中很常見,可以學習。這個目標的生成方法是執行$(MKCONFIG) -A $(@:_config=),查看Makefile開頭可以知道這個MKCONFIG就是頂層目錄下的mkconfig腳本,而$(@:_config=)就是去除目標中的_config串,所以實際上就是去到頂層目錄下執行$mkconfig -A origen這個命令。我們去裡面看看它都做了什麼

一上來我們就知道,我們傳入的參數會導致腳本執行這個if裡面的內容,即使用擴展正則表達式去頂層目錄下的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.mkmkconfig還負責生成include/config.h文件,不過有了之前准備好的變量,這部分只不過是將上面的變量和相應的文件夾進行了初步的定位,代碼就是下面這部分:

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

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

Copyright © Linux教程網 All Rights Reserved