一、配置介紹 1.1 常用命令 當前 uboot 的配置已經完全變成Linux 內核的配置形式了,完全可以按照Linux 內核的分析方是區分析 uboot。 uboot 和 Linux的代碼配置項由 Kconfig 來完成的,關於 Kconfig 語法,可參見:linux/Documentation ...
一、配置介紹
1.1 常用命令
當前 uboot 的配置已經完全變成Linux 內核的配置形式了,完全可以按照Linux 內核的分析方是區分析 uboot。
uboot 和 Linux的代碼配置項由 Kconfig 來完成的,關於 Kconfig 語法,可參見:linux/Documentation/kbuild/kconfig-language.txt
在編譯時,先進行配置,目的是根據需求選擇功能以及編譯生成方式類型(模式或包含在內核中).
配置項操作可以由如下命令中的其中一條來完成:
make config, make menuconfig, make oldconfig, make xx_defconfig
- make config:這個要求用戶手動選擇所有配置項,配置完成後生成 .config 文件。
- make menuconfig:顯示以curses的圖形配置菜單,當已有.config文件存在時,它會根據 .config 文件設定預設項。若不存在 .config 文件,則根據各級 Kconfig 文件來設定菜單項。完成配置後,生成.config文件。
- make oldconfig:與 make menuconfig 相同,區別在於這個沒有圖形界面,當已有 .config 文件存在時,它根據.config文件設定預設項,若kconfig有新配置項時,會提示你進行選擇;若不存在 .config 文件,則根據各級 Kconfig 文件來設定菜單項。完成配置後,生成 .config 文件。
若已存在 .config 文件,make menuconfig 及 make oldconfig 都會把原 .config 另存為 .config.old。
- make xx_defconfig: 一般源碼中都有不同硬體平臺的預設配置文件,你也可以製做自己的預設配置文件,當這個命令執行時,它會根據 kconfig 及 xx_defconfig 來生成 .config 文件。
在執行完其中一條 config 命令後,會生成 .config 及 autoconf 文件,autoconf 是根據配置項生成的相應巨集定義,供 makefile 使用,當執行 make 命令時,就會根據 autoconf 定義的巨集及 makefile 去編譯源碼。
u-boot的編譯跟kernel編譯一樣,分兩步執行:
- 第一步:配置,執行make xxx_defconfig
進行各項配置,生成.config
文件
- 第二部:編譯,執行make進行編譯,生成可執行的二進位文件u-boot.bin或u-boot.elf
1.2 Linux 內核構建系統所支持的目標
make targets,targets 就是我們前述的那些命令,我們可以通過 make help 列印出來內核構建系統所支持的目標完整列表。
如下所示,是 make help 所列印的所有目標:
- clean 目標
- clean:清除大多數生成的文件,但是保留配置
- mrproper:清除所有生成的文件、配置文件和各種備份文件
- distclean:此項就是 mrproper 的升級版本,多加了清除備份和補丁文件
- 配置項目標:
- config:利用命令行更新當前配置
- nconfig:使用基於ncurses菜單的程式更新當前配置
- menuconfig:利用菜單程式更新當前配置
- xconfig:利用基於Qt的前端更新當前配置
- gconfig:利用基於GTK +的前端更新當前配置
- oldconfig:使用提供的.config作為基礎更新當前配置
- localmodconfig:更新當前配置禁用未載入的模塊
- localyesconfig:更新當前配置將本地mods轉換為core
- silentoldconfig:與oldconfig相同,但是安靜地更新deps
- defconfig:來自ARCH的預設配置提供了defconfig
- savedefconfig:保存當前配置為./defconfig(最小配置)
- allnoconfig:新的配置,所有選項的答案都是no
- allyesconfig:新的配置,所有選項的答案都是yes
- allmodconfig:新的配置,儘可能的選擇模塊
- alldefconfig:將所有符號設置為預設值的新配置
- randconfig:對所有選項進行隨機答案的新配置
- listnewconfig:列出新選項
- olddefconfig:與 silentoldconfig 相同,但是對預設值設置新的符號
- 其他通用目標
- all:根據配置構建所有必要的鏡像
- tests:為 sandbox 構建 U-Boot,並測試
- * u-boot:構建空的 uboot
- dir/ :在dir和子目錄下構建所有文件
- dir/file.[oisS] :僅構建指定的目標
- dir/file.lst :僅構建指定的混合源/彙編目標(需要最新的binutils和最新的版本(System.map))
- tags/ctags:生成 ctags 索引文件
- etags:生成 etags 索引文件
- cscope:生成 cscope 索引
- ubootrelease:輸出發行版本字元串(需要用 make -s)
- ubootversion:輸出保存在 Makefile 中的版本(需要用 make -s)
- cfg:不構建,僅僅只創建 .cfg 文件
- envtools:只構建目標端環境工具
- 靜態分析:
- checkstack:生成堆棧列表
- coccicheck:用Coccinelle執行靜態代碼分析
文件目標 就是 uboot 中所有格式的文件,之後就是構建時候 可以傳入的參數。
最後還由一段話,就是 執行 make 或 make all 的時候,構建所有以 * 開頭的目標,這裡只有 * u-boot ,即使執行此項。
構建系同與 .config 相關的目標,就是上面用配置目標
1.3 構建系統的文件
1.3.1 文件介紹
在 ./Document/kbuild/makefiles.txt 中有詳細介紹
- Makefiles 有 5 個部分:
- Makefile:頂層 Makefile,提供針對各種目標的介面,一般和實現無關。當我們要針對某個目標進行分析時,作為起點,總是嘗試在此文件中找到對應的目標定義,然後沿著該定義深入挖掘。
- .config:uboot 配置文件,如果是內核,就是內核的配置文件,在配置 uboot時候生成,所有的 Makefile 文件(包括頂層目錄及各級子目錄)都是根據 .config 來決定使用哪些文件。
- arch/$(ARCH)/Makefile:平臺相關 Makefile,提供針對不同架構的目標,變數和規則定義。文件位置比較固定
- scripts/Makefile.*:Makefile 共用的通用規則、腳本等
- kbuild Makefiles:各級子目錄下的 Makefile,相對簡單,被上一層 Makefile 調用來編譯當前目錄下的文件。
頂層 Makefiles 讀取從uboot 配置程式中生成的 .config 文件
1.3.2 文件關聯
在上述的所有文件中,除了頂層的 Makefile,其他文件都或直接、或間接的和 它相關聯。這些關聯可以分為兩類:
(1)直接包含
在一個文件中,用 include 來包含另外的文件
(2)間接包含
使用 make -f 來調用,-f 是使用不同的 makefile 文件來進行 make 的選項。
1.4 make xxx_defconfig 命令執行分析
由於 2018.03 的 uboot 版本中已經遺棄了 2440 所以我們選擇一塊其他開發板進行分析。
執行命令:make smdkc100_defconfig V=1
V = 1 的意思是打開編譯過程
過程如下:
1 make -f ./scripts/Makefile.build obj=scripts/basic
2 cc -Wp,-MD,scripts/basic/.fixdep.d -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -o scripts/basic/fixdep scripts/basic/fixdep.c
3 rm -f .tmp_quiet_recordmcount
4 make -f ./scripts/Makefile.build obj=scripts/kconfig smdkc100_defconfig
5 cc -Wp,-MD,scripts/kconfig/.conf.o.d -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -D_GNU_SOURCE -DCURSES_LOC="<ncurses.h>" -DLOCALE -c -o scripts/kconfig/conf.o scripts/kconfig/conf.c
6 cat scripts/kconfig/zconf.tab.c_shipped > scripts/kconfig/zconf.tab.c
7 cat scripts/kconfig/zconf.lex.c_shipped > scripts/kconfig/zconf.lex.c
8 cat scripts/kconfig/zconf.hash.c_shipped > scripts/kconfig/zconf.hash.c
9 cc -Wp,-MD,scripts/kconfig/.zconf.tab.o.d -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -D_GNU_SOURCE -DCURSES_LOC="<ncurses.h>" -DLOCALE -Iscripts/kconfig -c -o scripts/kconfig/zconf.tab.o scripts/kconfig/zconf.tab.c
10 cc -o scripts/kconfig/conf scripts/kconfig/conf.o scripts/kconfig/zconf.tab.o
11 scripts/kconfig/conf --defconfig=arch/../configs/smdkc100_defconfig Kconfig
12 #
13 # configuration written to .config
14 #
這一項是生成了 scripts/basic/fixdep 工具
這一項是生成了 scripts/kconfig/conf 工具
最後執行 scripts/kconfig/conf 工具 生成.config
可以知道 make xxx_defconfig 的執行主要分成三個部分:
- 執行
make -f ./scripts/Makefile.build obj=scripts/basic
,編譯生成scripts/basic/fixdep
工具 - 執行
make -f ./scripts/Makefile.build obj=scripts/kconfig rpi_3_32b_defconfig
編譯生成scripts/kconfig/conf
工具 - 執行
scripts/kconfig/conf --defconfig=arch/../configs/xxx_defconfig Kconfig
生成最終的.config
配置文件