二、配置介紹


2.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

2.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 相關的目標,就是上面用配置目標  

2.3 構建系統的文件

2.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 文件  

2.3.2 文件關聯

  在上述的所有文件中,除了頂層的  Makefile,其他文件都或直接、或間接的和 它相關聯。這些關聯可以分為兩類:

(1)直接包含

  在一個文件中,用  include 來包含另外的文件

(2)間接包含

  使用 make -f 來調用,-f 是使用不同的  makefile 文件來進行 make 的選項。

2.4 make xxx_defconfig 命令執行分析

  由於 2017.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 的執行主要分成三個部分:

  1. 執行 make -f ./scripts/Makefile.build obj=scripts/basic,編譯生成 scripts/basic/fixdep 工具
  2. 執行 make -f ./scripts/Makefile.build obj=scripts/kconfig rpi_3_32b_defconfig 編譯生成 scripts/kconfig/conf 工具
  3. 執行 scripts/kconfig/conf --defconfig=arch/../configs/xxx_defconfig Kconfig生成最終的 .config 配置文件 

     

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM