配置介紹

1、配置介紹

1.1 經常使用命令  

  當前 uboot 的配置已經徹底變成Linux 內核的配置形式了,徹底能夠按照Linux 內核的分析方是區分析 uboot。html

  uboot 和 Linux的代碼配置項由 Kconfig 來完成的,關於 Kconfig 語法,可參見:linux/Documentation/kbuild/kconfig-language.txt前端

  在編譯時,先進行配置,目的是根據需求選擇功能以及編譯生成方式類型(模式或包含在內核中).linux

  配置項操做能夠由以下命令中的其中一條來完成:架構

   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。post

  • 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.elfui

1.2 Linux 內核構建系統所支持的目標

  make targets,targets 就是咱們前述的那些命令,咱們能夠經過 make help 打印出來內核構建系統所支持的目標完整列表。url

  以下所示,是 make help 所打印的全部目標:spa

  

  • 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 的執行主要分紅三個部分:

  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 配置文件
相關文章
相關標籤/搜索