欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
U-Boot 之四 構建過(guò)程(Kconfig 配置 + Kbuild 編譯)詳解

??在之前的博文 Linux 之八 完整嵌入式 Linux 環(huán)境介紹及搭建過(guò)程詳解 中我們說(shuō)了要一步步搭建整個(gè)嵌入式 Linux 運行環(huán)境,今天繼續介紹 U-Boot 相關(guān)的內容。我所使用的硬件平臺及整個(gè)要搭建的嵌入式 Linux 環(huán)境見(jiàn)博文 Linux 之八 完整嵌入式 Linux 環(huán)境介紹及搭建過(guò)程詳解,沒(méi)有特殊說(shuō)明都是在以上環(huán)境中進(jìn)行驗證的,就不過(guò)多說(shuō)明了。

??這篇博文我們僅僅關(guān)注 U-Boot 構建過(guò)程本身,想要吃透 U-Boot,有太多東西需要學(xué)習!最開(kāi)始我想放到一篇文章中,寫(xiě)著(zhù)寫(xiě)著(zhù)內容越來(lái)越多,最終超過(guò)了 CSDN 編輯器的限制。。。最終決定把內容拆分成多篇文章。你可能需要:

  1. U-Boot 之一 零基礎編譯 U-Boot 過(guò)程詳解 及 編譯后的使用說(shuō)明
  2. U-Boot 之二 詳解使用 eclipse + J-Link 進(jìn)行編譯及在線(xiàn)調試
  3. U-Boot 之三 U-Boot 源碼文件解析及移植過(guò)程詳解
  4. U-Boot 之五 詳解 U-Boot 及 SPL 的啟動(dòng)流程

Kbuild && Kconfig

??Kbuild && Kconfig 隸屬于 Linux Kernel Build System。在宏觀(guān)上,Kbuild && Kconfig 可以統稱(chēng)為 Kbuild,從微觀(guān)上來(lái)說(shuō),Kbuild 指的是編譯的過(guò)程,而 Kconfig 指的在編譯之前對內核進(jìn)行配置的過(guò)程(該過(guò)程中會(huì )編譯一些工具來(lái)實(shí)現配置過(guò)程)。關(guān)于詳細的可以查看 Linux Kernel 的官方文檔 The Linux Kernel Documentation 中的 Kernel Build System 章節的介紹。

  1. 本文約定俗成的稱(chēng)呼:構建 指的 Kbuild + Kconfig;配置 指的 Kconfig;編譯 指的 Kbuild。
  2. https://www.kernel.org/doc/

??Kbuild && Kconfig 這套構建系統一個(gè)顯著(zhù)的特點(diǎn)就是每一級目錄都會(huì )有單獨的相關(guān)文件,然后會(huì )被上一級相同的文件引用。這樣就保證了每一級目錄都是相互獨立的。尤其是對于源碼的維護者來(lái)說(shuō),這個(gè)是至關(guān)重要。每個(gè)維護者可以只關(guān)心他所負責的代碼部分,任何更改只需要變更它自己的 Kbuild && Kconfig 相關(guān)文件即可。它本身主要包含以下幾類(lèi)文件:

  • Makefile: Kbuild && Kconfig 這套構建系統本身屬于 make 功能的擴展,因此,整個(gè)工作過(guò)程就是一些列 Makefile 文件的調用。其中入口就是根目錄下的 Makefile 文件,Makefile 中會(huì )調用各種工具以實(shí)現不同的功能。
    ??注意,為了區分不同的功能,在源碼中對于 Makefile 的命名有時(shí)候會(huì )加一個(gè)后綴。例如,config.mk、Makefile.build、Makefile.clean 等這些都屬于 Makefile 文件。
    ??Makefile 文件無(wú)法在線(xiàn)調試,對于理解一個(gè)復雜的 Makefile 很不友好。一般我們可以使用 --debug 參數讓 make 打印詳細的信息來(lái)協(xié)助理解?;蛘呤窃?Makefile 中添加一些打印信息,常用打印方式有兩種:

    1. 使用 $(info, xxxx$(xxx))、$(warning, xxxx$(xxx))、$(error, xxxx$(xxx)),其中,$(xxx) 表示某個(gè)變量。這三個(gè)命令可以加到 Makefile 的任意地方,注意 $(error, xxxx$(xxx)) 會(huì )終止 Make 過(guò)程。
    2. 使用 @echo "xxxx $xx xxxx",其中,$(xxx) 表示某個(gè)變量。這個(gè)命令只能用在目標后邊,且前面是個(gè)TAB。這個(gè)就是標準 Makefile 語(yǔ)法中的一個(gè)命令。

    再順帶說(shuō)一句 make 的工作的一些機制:

    1. 如果給出了參數,則 make 優(yōu)先去找匹配的規則(匹配規則:完整匹配 > 通配符半匹配 > 完全通配符匹配)去執行;如果沒(méi)有給出參數,make 會(huì )自動(dòng)找到 Makefile 中第一個(gè)目標中沒(méi)有通配符的規則執行。
    2. 如果中間遇到 include 其他文件,就會(huì )緊接著(zhù)執行 include 的文件,完成后再繼續執行本文件。
    3. make 總是從 Makefile 的開(kāi)頭開(kāi)始解析,并不是找到匹配目標之后僅執行匹配目標的命令。也就是說(shuō),在匹配之前,Make 可能已經(jīng)解析了很多判斷條件。
    4. 對于匹配的規則如果有依賴(lài),優(yōu)先解析依賴(lài)。注意,依賴(lài)的匹配也符合 1 中所說(shuō)的規則。
    5. 命令前面加了 @ 字符,則不顯示命令本身而只顯示它的結果。命令前面加了 - 號,即使這條命令出錯,make 也會(huì )繼續執行后續命令。
    6. 如果 Makefile 中存在多條同名規則,則 make 程序會(huì )嘗試將他們合并。但是如果這些同名規則都有命令的話(huà),make 會(huì )給出警告,并用后面的命令代替前面的命令。
  • Kconfig 文件: 這個(gè)文件就是 Kconfig 系統的菜單項,當我們使用命令:make menuconfig 時(shí),Kconfig 系統讀取該文件,根據該文件的內容生成各級菜單。U-Boot 源碼根目錄下的 Kconfig 就是頂級的配置菜單,其中會(huì )在引入其他目錄下的 Kconfig 作為二級菜單,依次類(lèi)推。

  • .config 文件: 這個(gè)文件記錄了我們菜單項中的配置的具體值,我們所有對于構建的配置的存放在這個(gè)文件中,我們在,Kconfig 系統菜單中的更改,最終都會(huì )改寫(xiě)該文件。注意:該文件默認是個(gè)隱藏文件,可以使用 ls -al 查看。

  • xxxx_defconfig 文件: xxxx_defconfig 文件就為 Kconfig 系統的菜單項提供一個(gè)默認值。不過(guò),Kconfig 系統不會(huì )直接讀取 xxxx_defconfig 文件,而是需要使用方式是通過(guò) make xxx_deconfig 生成帶默認值的 .config。這樣,在加載 Kconfig 時(shí),就可以同時(shí)加載 .config 以提供默認值。
    ??簡(jiǎn)單來(lái)說(shuō),xxxx_defconfig 就是為了方便支持更多個(gè)性化配置,從而可以盡可能少的改動(dòng)源代碼。

  • Kbuild 文件: 這個(gè)是 Kbuild 系統使用的文件,該文件用于定義一些源碼使用的需要根據編譯環(huán)境產(chǎn)生的中間文件。

  • config.mk 文件: 用來(lái)處理一些編譯過(guò)程中的環(huán)境變量。Linux Kernel 沒(méi)有這個(gè)文件,U-Boot 需要使用它。

??U-Boot 從 v2014.10 版本開(kāi)始也引入 Kbuild && Kconfig 這套構建系統,相比于原來(lái)應該是復雜了不少。但是對于屬性 Linux Kernel 的人來(lái)說(shuō)確實(shí)是一個(gè)好消息!今天我們就來(lái)學(xué)習一下 U-Boot 中這套系統的具體工作流程。

??Kbuild && Kconfig 這套構建系統中定義了很多命令,我們可以使用 make help 來(lái)進(jìn)行查看(就在根目錄的 Makefile 文件中),其中經(jīng)常用到命令如下圖所示:

構建過(guò)程

??在 Kbuild && Kconfig 這套構建系統中,源碼中使用的有些文件是要靠 Kbuild && Kconfig 這套系統來(lái)生成的,直接在源碼中是找不到。這就要求我們必須要了解 Kbuild && Kconfig 是如何工作的,更重要的是要知道 Kbuild && Kconfig 會(huì )產(chǎn)生哪些源碼使用的文件。

??整個(gè)構建過(guò)程的這個(gè)入口就是源碼根目錄下的 Makefile 文件。下面我們先來(lái)整體看一下這個(gè)文件的總體結構,并且對其中的規則進(jìn)行一下說(shuō)明。其大體可以分為三部分:


整個(gè)文件的前半部分就是定義一堆符號,檢測工作環(huán)境、處理各種參數,基本沒(méi)有實(shí)際與編譯源碼相關(guān)的命令。下面重點(diǎn)介紹一些(注意,由于我在其中添加了一些打印信息,導致行號與原文件有區別):

  • HOST_ARCH 賦值。HOST_ARCH 代表我們當前指定的 主機 的類(lèi)型。當我們沒(méi)有指定的時(shí)候,它就是我們的 PC 架構(例如我的 HOST_ARCH_X86_64),指定 交叉編譯器 后(例如,我們編譯時(shí) CROSS_COMPILE=arm-none-eabi- ARCH=arm make -j4),他就是我們指定的架構(HOST_ARCH_ARM)。
  • 處理 make 參數:make V=1、make -s 等。這里導出了 quiet、Q、KBUILD_VERBOSE,用以指示編譯過(guò)程的顯示方式。
  • 處理編譯的當前目錄以及編譯輸出目錄。其中,我們可以使用環(huán)境變量 KBUILD_OUTPUT 或者 指定 make O=xxx 的方式指定輸出目錄。而編譯的源目錄 KBUILD_SRC 根據注釋僅用于在 OBJ 目錄時(shí),而且一般不給使用者使用。代碼可以簡(jiǎn)化為以下邏輯:
    if `KBUILD_SRC` 為空
    	檢查 O=xxx 參數,如果有指定,則賦值給 `KBUILD_OUTPUT`
    	定義偽目標_all ,且 _all 為空目標,避免后面include其余文件的時(shí)候尋找隱含的第一個(gè)目標。后面肯定還會(huì )定義 _all, 而且肯定不為空
    	if `KBUILD_OUTPUT` 不為空
    		`KBUILD_OUTPUT` = 創(chuàng  )建并指定的目錄
    		到 `KBUILD_OUTPUT` 繼續執行 make (其中需要過(guò)濾掉一些內容,防止無(wú)限嵌套)。因為 在 `KBUILD_OUTPUT` 中執行的 Makefile 就是當前這個(gè) Makefile
    		skip-makefile 賦值為 1
    	endif
    endif
    
    if skip-makefile 為空。不空表示上面已經(jīng)在 `KBUILD_OUTPUT` 中執行過(guò)了
    	執行其他各種操作
    endif
    
    整個(gè)makefie 結束
    
    ??這里需要注意的就是,如果指定了輸出目錄,將轉到 輸出目錄中去執行 Makefile,本 Makefile 的執行就結束了。skip-makefile 被賦值為 1,此后只有在 skip-makefile 不為 1 時(shí)才會(huì )繼續執行。
  • 再接下來(lái)就是判斷 make C=x 參數以及處理是編譯整個(gè) U-Boot 還是編譯的模塊(由環(huán)境變量 SUBDIRSmake M=xxx 執行),如果是模塊,賦值給 KBUILD_EXTMOD(賦值厚就不空)。

    ??前面有說(shuō)過(guò),開(kāi)始定義了一個(gè)空的目標 _all,這里再次定義目標 _all。這里的 _all 根據 KBUILD_EXTMOD 的值依賴(lài)于 all 或者是 modules,但是命令還是為空。這里我們不關(guān)心模塊,重點(diǎn)關(guān)注 all。all 又依賴(lài) .binman_stmpinputs,如下圖所示:

    關(guān)于 all 后文會(huì )有詳細的介紹。
  • 繼續下來(lái)就是檢查編譯工具鏈。并做了一些重命名以統一編譯時(shí)的顯示。
  • 再繼續就是 kconfig 和 kbuild 共用的一些規則 scripts_basic、outputmakefile 的定義。然后檢查要執行的操作是否需要 .config 文件,最終出現以下邏輯:
    if 是多個(gè)目標(mixed-targets=1)
    	一個(gè)一個(gè)處理
    else if 配置(config-targets=1),即我們執行的 make xxxconfig 時(shí)的處理
          config: scripts_basic outputmakefile FORCE
              $(Q)$(MAKE) $(build)=scripts/kconfig $@
          %config: scripts_basic outputmakefile FORCE
              $(Q)$(MAKE) $(build)=scripts/kconfig $@
    else 這里就是 編譯過(guò)程以及 非 config(例如 clean) 的處理了
          scripts: scripts_basic scripts_dtc include/config/auto.conf
              $(Q)$(MAKE) $(build)=$(@)
         if 需要 .confg 
             檢查  .confg 文件
          else
              include/config/auto.conf: ;
         endif
         
         all 的定義(實(shí)際編譯文件等等)
         
         非 config(例如 clean、check)等的定義
    endif
     
     Makefile 結束
    
    也就是在此之前的內容,無(wú)論給出啥命令,都會(huì )被 make 解析,然后從這里開(kāi)始分道揚鑣!

??至此,就開(kāi)始根據給出的目標的不同開(kāi)始區分具體操作類(lèi)型了,后續我們單獨章節來(lái)介紹!***注意,由于我在 Makefile 中添加了一些打印信息,導致行號與原文件有區別!***下面是我大體整理的一個(gè)流程圖:

Kconfig

??在 Kbuild && Kconfig 這套構建系統中,當我們使用 make xxxconfg 類(lèi)似的命令時(shí),就會(huì )執行 Kconfig 流程。例如,當執行 make menuconfig 時(shí)會(huì )出現一個(gè)配置界面,允許開(kāi)發(fā)者通過(guò)類(lèi)似于 UI 的方式來(lái)對內核進(jìn)行配置,之所為我們可以看到這個(gè)類(lèi)似于 UI 的界面,就是因為 Kconfig 從中產(chǎn)生了多個(gè)文件和工具來(lái)實(shí)現的。

Kconfig 語(yǔ)法可以從 https://www.kernel.org/doc/html/latest/kbuild/kconfig-language.html 里來(lái)學(xué)習。

??當我們在 U-Boot 根目錄執行 make menuconfig 或者 make xxx_deconfig 時(shí),make 命令便會(huì )讀取 U-Boot 根目錄下的 Makefile 文件,然后解析并匹配 Makefile 文件中的規則 。而 xxxconfig 就會(huì )匹配根目錄下 Makefile 文件中的如下圖示的規則(% 可以匹配任意非空字符串,所以 menuconfig、xxx_deconfig 都匹配):

  • Q 是否顯示信息信息,在 Makefile 前面有賦值為 @
  • MAKE: 就是指的可執行程序 make
  • $(build): 定義在 ./scripts/Kbuild.include 中:181行

    那么將以上命令展開(kāi)之后就是:make -f $(srctree)/scripts/Makefile.build obj=scripts/kconfig menuconfig 或者 $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.build obj=scripts/kconfig xxx_defconfig
  • $(srctree): 在 Makefile 前面有賦值為 .$(KBUILD_SRC)
  • scripts_basic: 就定義在 U-Boot 根目錄的 Makefile 中

    那么將以上命令第一句規則展開(kāi)之后就是:make -f $(srctree)/scripts/Makefile.build obj=scripts/basic ,第二句規則沒(méi)啥可說(shuō)的,就是移除個(gè)文件。
  • outputmakefile: 就定義在 U-Boot 根目錄的 Makefile 中,如下所示:

    從規則代碼可以看出只有當 KBUILD_SRC 不為空時(shí)才有效,而對于 KBUILD_SRC 一般都是空,非空的情況下一般也不使用。因此,這里的依賴(lài) outputmakefile 這里就是空。對于具體見(jiàn)如下說(shuō)明:
  • FORCE 是沒(méi)有規則和依賴(lài)的,所以每次都會(huì )重新生成 FORCE。當 FORCE 作為其他目標的依賴(lài)時(shí),由于 FORCE 總是被更新過(guò)的,因此依賴(lài)所在的規則總是會(huì )執行的。

??經(jīng)過(guò)上面的分析,最終由兩條語(yǔ)句 make -f $(srctree)/scripts/Makefile.build obj=scripts/basicmake -f $(srctree)/scripts/Makefile.build obj=scripts/kconfig menuconfig 或者 make -f $(srctree)/scripts/Makefile.build obj=scripts/kconfig xxx_defconfig 是我們需要進(jìn)一步來(lái)解析的。接下來(lái)就要進(jìn)入 /scripts/Makefile.build 這個(gè)文件了。

Makefile.build

??對于 Makefile.build 文件,目前我們只需要關(guān)注下圖所示的兩部分(說(shuō)明見(jiàn)注釋?zhuān)?br>


接下就是進(jìn)一步處理 scripts/basic/Makefile 或者 scripts/kconfig/Makefile 了。

make xxx_deconfig

??經(jīng)過(guò)上面的分析,當我執行 make xxx_defconfig 時(shí)(例如,我這里的 make stm32f769-disco_defconfig),最終會(huì )執行以下兩句:make -f $(srctree)/scripts/Makefile.build obj=scripts/basicmake -f $(srctree)/scripts/Makefile.build obj=scripts/kconfig xxx_defconfig 。

  • make -f $(srctree)/scripts/Makefile.build obj=scripts/basic 展開(kāi)后是 cc -Wp,-MD,scripts/basic/.fixdep.d -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -std=gnu11 -o scripts/basic/fixdep scripts/basic/fixdep.c 最終在 scripts/basic/ 目錄下生成了可執行工具 fixdep。
  • make -f $(srctree)/scripts/Makefile.build obj=scripts/kconfig xxx_defconfig 展開(kāi)后是:
     cc -Wp,-MD,scripts/kconfig/.conf.o.d -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer   -std=gnu11     -c -o scripts/kconfig/conf.o scripts/kconfig/conf.c
      bison -oscripts/kconfig/zconf.tab.c -t -l scripts/kconfig/zconf.y
      flex -oscripts/kconfig/zconf.lex.c -L scripts/kconfig/zconf.l
      cc -Wp,-MD,scripts/kconfig/.zconf.tab.o.d -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer   -std=gnu11    -Iscripts/kconfig -c -o scripts/kconfig/zconf.tab.o scripts/kconfig/zconf.tab.c
      cc   -o scripts/kconfig/conf scripts/kconfig/conf.o scripts/kconfig/zconf.tab.o   
    scripts/kconfig/conf  --defconfig=arch/../configs/stm32f769-eval_defconfig Kconfig
    
    最終在 scripts/kconfig/ 目錄下生成了可執行工具 conf,緊接著(zhù)使用剛生成的 scripts/kconfig/conf 工具根據我們指定的 stm32f769-eval_defconfig 生成 .config 文件。

make menuconfig

??經(jīng)過(guò)上面的分析,當我執行 make menuconfig 時(shí),最終會(huì )執行以下兩句:make -f $(srctree)/scripts/Makefile.build obj=scripts/basicmake -f $(srctree)/scripts/Makefile.build obj=scripts/kconfig menuconfig 。

  • make -f $(srctree)/scripts/Makefile.build obj=scripts/basicmake xxx_deconfig 時(shí)的語(yǔ)句是一樣的。如果在執行 make menuconfig 之前沒(méi)有使用 make xxx_deconfig,那么這句就會(huì )和 make xxx_deconfig 時(shí)一樣去執行來(lái)生成 scripts/basic/fixdep。
  • make -f $(srctree)/scripts/Makefile.build obj=scripts/kconfig menuconfig 展開(kāi)后是:
    make -f ./scripts/Makefile.build obj=scripts/basic
    rm -f .tmp_quiet_recordmcount
    make -f ./scripts/Makefile.build obj=scripts/kconfig menuconfig
    set -e; mkdir -p scripts/kconfig/;      /bin/bash scripts/kconfig/mconf-cfg.sh < scripts/kconfig/mconf-cfg.sh > scripts/kconfig/.mconf-cfg.tmp; if [ -r scripts/kconfig/.mconf-cfg ] && cmp -s scripts/kconfig/.mconf-cfg scripts/kconfig/.mconf-cfg.tmp; then rm -f scripts/kconfig/.mconf-cfg.tmp; else : '  UPD     scripts/kconfig/.mconf-cfg'; mv -f scripts/kconfig/.mconf-cfg.tmp scripts/kconfig/.mconf-cfg; fi
      cc -Wp,-MD,scripts/kconfig/.mconf.o.d -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer   -std=gnu11    -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=600 -c -o scripts/kconfig/mconf.o scripts/kconfig/mconf.c
      cc -Wp,-MD,scripts/kconfig/lxdialog/.checklist.o.d -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer   -std=gnu11    -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=600 -c -o scripts/kconfig/lxdialog/checklist.o scripts/kconfig/lxdialog/checklist.c
      cc -Wp,-MD,scripts/kconfig/lxdialog/.inputbox.o.d -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer   -std=gnu11    -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=600 -c -o scripts/kconfig/lxdialog/inputbox.o scripts/kconfig/lxdialog/inputbox.c
      cc -Wp,-MD,scripts/kconfig/lxdialog/.menubox.o.d -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer   -std=gnu11    -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=600 -c -o scripts/kconfig/lxdialog/menubox.o scripts/kconfig/lxdialog/menubox.c
      cc -Wp,-MD,scripts/kconfig/lxdialog/.textbox.o.d -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer   -std=gnu11    -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=600 -c -o scripts/kconfig/lxdialog/textbox.o scripts/kconfig/lxdialog/textbox.c
      cc -Wp,-MD,scripts/kconfig/lxdialog/.util.o.d -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer   -std=gnu11    -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=600 -c -o scripts/kconfig/lxdialog/util.o scripts/kconfig/lxdialog/util.c
      cc -Wp,-MD,scripts/kconfig/lxdialog/.yesno.o.d -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer   -std=gnu11    -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=600 -c -o scripts/kconfig/lxdialog/yesno.o scripts/kconfig/lxdialog/yesno.c
      cc   -o scripts/kconfig/mconf scripts/kconfig/mconf.o scripts/kconfig/zconf.tab.o scripts/kconfig/lxdialog/checklist.o scripts/kconfig/lxdialog/inputbox.o scripts/kconfig/lxdialog/menubox.o scripts/kconfig/lxdialog/textbox.o scripts/kconfig/lxdialog/util.o scripts/kconfig/lxdialog/yesno.o   -Wl,-Bsymbolic-functions -lncursesw -ltinfo
    scripts/kconfig/mconf  Kconfig
    
    最終生成 scripts/kconfig/mconf,緊接著(zhù)使用剛生成的 scripts/kconfig/mconf 工具讀取根目錄的 Kconfig 文件,隨之出現配置界面。

??make xxx_deconfig之后,Kconfig 系統會(huì )在 U-Boot 源碼根目錄下生成 .config 文件,當我們使用 make menuconfig 修改了相關(guān)配置之后,Kconfig 系統最終也是修改根目錄下的 .config 文件(注意,該文件默認是個(gè)隱藏文件,可使用 ls -al 查看),而 .config 文件就記錄了我們當前對于 U-Boot 的配置,后續構建時(shí)便會(huì )讀取該文件。

Kbuild

??這里說(shuō)的 Kbuild 是微觀(guān)上的 Kbuild,指的是編譯的過(guò)程。在經(jīng)過(guò)上面 Kconfig 之后,接下來(lái)就是真正的編譯過(guò)程,這個(gè)過(guò)程采用的就是 Kbuild 系統。Linux 官方文檔地址:https://www.kernel.org/doc/html/latest/kbuild/index.html。

??編譯使用的命令是 CROSS_COMPILE=arm-none-eabi- ARCH=arm make -j8,當我們使用該命令之后,make 程序就會(huì )讀取 U-Boot 根目錄的 Makefile 文件,然后解析并匹配 Makefile 文件中的規則。由于這里沒(méi)有指明目標,Make 會(huì )自動(dòng)找到 makefile 中第一個(gè)目標中沒(méi)有通配符的規則執行,這里就是 _all。


??注意,這里的 _all 并不是第一個(gè)定義的 _all。第一個(gè)定義的 _all 是個(gè)空命令目標,空命令行可以防止 make 在執行時(shí)試圖為重建這個(gè)目標去查找隱含命令(包括了使用隱含規則中的命令和“ .DEFAULT”指定的命令)。后面重新定義的 _all 才是最終生效的 _all

??如果 KBUILD_EXTMOD 為空的話(huà) _all 依賴(lài)于 all。我們不編譯模塊(沒(méi)有指定 KBUILD_EXTMOD),所以 KBUILD_EXTMOD 就是空 ,_all 依賴(lài)于 all 的。 all 又依賴(lài) .binman_stmpinputs,如下圖所示:


注意,如果使用的命令是 CROSS_COMPILE=arm-none-eabi- ARCH=arm make all -j8,則直接就會(huì )匹配到 all 這條規則,就不會(huì )有 _all 啥事了!

??.binman_stamp這個(gè)比較簡(jiǎn)單,就是通過(guò)使用 touch 命令更新 .binman_stamp 文件(不存在時(shí)會(huì )新建)的時(shí)間戳保證 binman 總是會(huì )被執行。然后檢查一些定義,給出提示。


??重點(diǎn)就在 inputs,而 inputs 又是依賴(lài)于 $(INPUTS-y)。通過(guò)將 $(INPUTS-y) 展開(kāi)后就是 checkarmreloc u-boot.srec u-boot.bin u-boot.sym System.map binary_size_check spl/u-boot-spl.bin u-boot.img u-boot.dtb u-boot-dtb.img 再進(jìn)一步就是展開(kāi)及處理各個(gè)依賴(lài)項了,下面我們重點(diǎn)來(lái)介紹一下 checkarmrelocu-boot.srec,其他的大家自行解析。

  • checkarmreloc


    將 u-boot 的各項依賴(lài)展開(kāi)就是:u-boot: arch/arm/cpu/armv7m/start.o arch/arm/cpu/built-in.o arch/arm/cpu/armv7m/built-in.o arch/arm/lib/built-in.o arch/arm/mach-stm32/built-in.o board/st/common/built-in.o board/st/stm32f769-eval/built-in.o cmd/built-in.o common/built-in.o disk/built-in.o drivers/built-in.o drivers/dma/built-in.o drivers/gpio/built-in.o drivers/net/built-in.o drivers/net/phy/built-in.o drivers/power/built-in.o drivers/power/battery/built-in.o drivers/power/domain/built-in.o drivers/power/fuel_gauge/built-in.o drivers/power/mfd/built-in.o drivers/power/pmic/built-in.o drivers/power/regulator/built-in.o drivers/serial/built-in.o drivers/spi/built-in.o drivers/usb/cdns3/built-in.o drivers/usb/common/built-in.o drivers/usb/dwc3/built-in.o drivers/usb/emul/built-in.o drivers/usb/eth/built-in.o drivers/usb/host/built-in.o drivers/usb/mtu3/built-in.o drivers/usb/musb-new/built-in.o drivers/usb/musb/built-in.o drivers/usb/phy/built-in.o drivers/usb/ulpi/built-in.o env/built-in.o fs/built-in.o lib/built-in.o net/built-in.o u-boot.lds FORCE,其中:

    • $(u-boot-init):arch/arm/cpu/armv7m/start.o
    • $(u-boot-main):后面一大串 built-in.o
    • $(u-boot-keep-syms-lto):空,不包含任何內容

    因此,我們需要重點(diǎn)來(lái)關(guān)注 u-boot.lds 這個(gè)依賴(lài):


    其中,$(LDSCRIPT) 就是我們使用的鏈接腳本文件,這里就是 ./arch/arm/cpu/u-boot.lds。而 prepare 的內容就比價(jià)多了,如下圖所示:

    中間各種依賴(lài),最終會(huì )到 include/config/%.conf: 這條規則。

  • u-boot.srec 這個(gè)比較簡(jiǎn)單,至于它依賴(lài)的 u-boot 在上面已經(jīng)說(shuō)了。

其實(shí)到這里基本就可以了,解析來(lái)就不繼續深入了!下面來(lái)一張圖:

clean、mrproper、distclean

??介紹了以上的工作過(guò)程之后,我們再介紹一下三個(gè)與清理相關(guān)的命令:clean、mrproper、distclean。至于支持的其他命令基本都差不多,大家感興趣可以自己分析即可。這三個(gè)命令的清理程度是逐漸增加,后者包含前者,如下圖所示:


我們就以 distclean 為例來(lái)說(shuō)明。當我們執行 make distclean 這條命令時(shí),make 讀取根目錄的 Makefile,然后開(kāi)始解析,最終匹配到規則 distclean: mrproper,如下所示:

  • 命令部分:第一個(gè) find 命令查找上面指定的文件并刪除。其中的 “|” 表示管道,即左邊的輸出作為右邊的輸入。rm 命令刪除 boards.cfg 和 CHANGELOG。

    關(guān)于 find 命令:https://www.cnblogs.com/shenqidu/p/10615593.html
    關(guān)于 xargs 命令:https://www.runoob.com/linux/linux-comm-xargs.html

  • 依賴(lài) mrproper:接下來(lái)重點(diǎn)看他的依賴(lài) mrproper,由于 mrproper 也有依賴(lài),我把它們整理到一個(gè)圖中,如下所示:


    從中可以看出,mrproper 先執行了 clean,然后執行 $(mrproper-dirs)。綜合來(lái)看,cleanmrproper 結構基本一致,我們將里面各變量展開(kāi),其中:

  • 先看 clean

    • 依賴(lài) rm-dirs:展開(kāi)后就是 .tmp_versions、spl/*
    • 依賴(lài) rm-files:展開(kāi)后就是include/bmp_logo.h include/bmp_logo_data.h tools/version.h boot* u-boot* MLO* SPL System.map fit-dtb.blob* u-boot-ivt.img.log u-boot-dtb.imx.log SPL.log u-boot.imx.log lpc32xx-* bl31.c bl31.elf bl31_*.bin image.map tispl.bin* idbloader.img flash.bin flash.log defconfig keep-syms-lto.c
    • 依賴(lài) $(clean-dirs)
      • $(clean):定義在 Kbuild.include 文件中: clean := -f $(srctree)/scripts/Makefile.clean obj
      • cmd:定義在 Kbuild.include 文件中: cmd = @$(echo-cmd) $(cmd_$(1)),進(jìn)一步 $(echo-cmd)就在之上:echo-cmd = $(if $($(quiet)cmd_$(1)),echo ' $(call escsq,$($(quiet)cmd_$(1)))$(echo-why)';)
    • 命令部分:
      • $(call cmd,rmdirs)
      • $(call cmd,rmfiles)
      • find xxx | xargs rm -f:在以上清理的基礎上再清理一些符號文件,臨時(shí)文件、腳本文件等
  • mrproper

    • 依賴(lài) rm-dirsinclude/config、include/generated spl
    • 依賴(lài) rm-files.config、.config.old、include/autoconf.mk、include/autoconf.mk.dep、include/config.h
    • 依賴(lài) clean:就是上面的 clean
    • 依賴(lài) $(mrproper-dirs)
    • 命令部分:
      • $(clean):同上
      • cmd:同上

參考

  1. https://loee.xyz/2021/04/27/uboot-%E6%B5%81%E7%A8%8B%E5%88%86%E6%9E%90/
  2. https://www.cnblogs.com/humaoxiao/p/4189411.html
  3. https://github.com/zhaojh329/U-boot-1/blob/master/%E7%AC%AC9%E7%AB%A0-U-boot%E7%BC%96%E8%AF%91%E4%B9%8B%E4%B8%80%E9%85%8D%E7%BD%AE%E8%BF%87%E7%A8%8B.md
  4. https://blog.csdn.net/guyongqiangx/article/details/52558087
  5. https://yunyanan.github.io/exploring_kbuild/
  6. https://opensource.com/article/18/10/kbuild-and-kconfig
  7. https://www.cnblogs.com/syyxy/p/9350999.html
  8. https://blog.csdn.net/q_z_r_s/article/details/80783631
  9. https://blog.csdn.net/linuxweiyh/article/details/100528718

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Linux內核構建系統之三
linux make menuconfig 執行流程小結,Linux應用技巧,Linux系列教程,Linux
Linux內核構建系統
也談Linux Kernel Hacking – Kconfig與Kbuild | Tony Bai
Arm Linux交叉編譯和連接過(guò)程分析(2) - Linux - Linux My world
make menuconfig/.config/Kconfig解析
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久