linux-2.6.22.6內核啟動分析之Makefile文件

来源:https://www.cnblogs.com/053179hu/archive/2018/07/08/9279445.html
-Advertisement-
Play Games

學習目標 分析Makefile文件,瞭解內核中的哪些文件被編譯,如何被編譯,連接時順序如何確定! Linux內核源碼中包含很多的Makefile文件,這些Makefile文件又包含其它的一些文件,比如配置信息、通用規則等等。我們可以把內核中的Makefile文件分為5類,如下表所示: 配置文件,在執 ...


學習目標

分析Makefile文件,瞭解內核中的哪些文件被編譯,如何被編譯,連接時順序如何確定!

 


 

Linux內核源碼中包含很多的Makefile文件,這些Makefile文件又包含其它的一些文件,比如配置信息、通用規則等等。我們可以把內核中的Makefile文件分為5類,如下表所示:

頂層Makefile 所有Makefile文件的核心,從總體控制內核的編譯、連接
.config

配置文件,在執行配置命令時生成。所有Makefile文件都根據.config來決定如何使用哪些文件

arch/$(ARCH)/Makefile 對應CPU體繫結構的Makefile文件,用來決定那些體繫結構相關的文件參與內核的生成,並提供一些規則來生成特定格式內核映象
kbuild Makefile 各級子目錄下的Makefile,相對比較簡單,被上一級Makefile調用來編譯當前目錄下的文件
script/Makefile.* Makefile共用規則和腳本

執行make uImage命令時內核最終被編譯,所以要分析內核Makefile文件關係,把目標uImage作為分析的入手點最為合適。打開頂層Makefile文件,在頂層Makefile文件中查找目標uImage的依賴關係,結果發現在頂層Makefile文件中不能直接找到目標uImage的依賴。雖然在頂層Makefile文件中沒有直接找到目標uImage的依賴關係,但我們執行make uImage命令時內核被編譯,所以我們可以推測目標uImage肯定是在其它目錄下的Makefile中定義,並且這個目錄下的Makefile文件被頂層的Makefile文件所包含。查找其它目錄下的Makefile文件,最終在arch/arm目錄下Makefile文件中找到目標uImage的依賴關係,代碼如下:

227 zImage Image xipImage bootpImage uImage: vmlinux                            #來源於arch/arm目錄下的Makefile文件
228     $(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $(boot)/$@

為了驗證上面推測是否正確,我們在頂層Makefile中搜索"include"字元,找到頂層Makefile中所有包含文件。通過篩選後找到下麵所示代碼:

413 include $(srctree)/arch/$(ARCH)/Makefile                                    #來源於頂層Makefile中文件
414 export KBUILD_DEFCONFIG
........
185 #ARCH        ?= $(SUBARCH)
186 ARCH        ?= arm
187 CROSS_COMPILE    ?= arm-linux-

上述代碼$(srctree)=源碼根目錄、$(ARCH)=arminclude $(srctree)/arch/$(ARCH)/Makefile就表示頂層Makefile包含arch/arm目錄下Makefile,由此可見前面我們的推測是正確的。


 從上面227行代碼中可以發現,目標uImage依賴於vmlinux。uImage文件有兩部分組成,頭部和真正內核部分,要獲得uImage文件必須先編譯出內核,也就是先生成vmlinux文件,最後根據vmlinux文件生成uImage文件。下麵我們還要找出vmlinux的依賴關係,在頂層Makefile中找到vmlinux的依賴關係如下代碼:

745 vmlinux: $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) $(kallsyms.o) FORCE                             #來源於頂層的Makefile

可以看出vmlinux生成依賴於$(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) $(kallsyms.o),因此為了進一步分析,我們要分別找出$(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) $(kallsyms.o)變數代表的內容,並對變數所代表內容進行一一展開。

608 vmlinux-init := $(head-y) $(init-y)                                           #來源於頂層Makefile文件
94  head-y := arch/arm/kernel/head$(MMUEXT).o arch/arm/kernel/init_task.o         #來源於arch/arm目錄下的Makefile文件
443 init-y := init/ #來源於頂層Makefile文件
573 init-y := $(patsubst %/, %/built-in.o, $(init-y)) #來源於頂層Makefile文件

第94行$(MMUEXT)內容為空,head$(MMUEXT).o就是head.o, head-y := arch/arm/kernel/head.o arch/arm/kernel/init_task.o

第573行$(patsubst <pattern>,<replacement>,<text> ) 是一個Makefile函數,查找<text>中的單詞是否符合模式<pattern>,如果匹配的話,則以<replacement>替換。這裡,<pattern>可以包括通配符“%”,表示任意長度的字串。如果<replacement>中也包含“%”,那麼,<replacement>中的這個“%”將是<pattern>中的那個“%”所代表的字串。init-y :=init/built-in.o

第608行將$(head-y) $(init-y)用94行和573行分析結果替換,可以得到vmlinux-init :=arch/arm/kernel/head.o arch/arm/kernel/init_task.o init/built-in.o

609 vmlinux-main := $(core-y) $(libs-y) $(drivers-y) $(net-y)                     #來源於頂層Makefile文件
438 core-y := usr/ #來源於頂層Makefile文件
562 core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/ #來源於頂層Makefile文件
574 core-y := $(patsubst %/, %/built-in.o, $(core-y)) #來源於頂層Makefile文件

437 libs-y := lib/ #來源於頂層Makefile文件
577 libs-y1 := $(patsubst %/, %/lib.a, $(libs-y)) #來源於頂層Makefile文件
578 libs-y2 := $(patsubst %/, %/built-in.o, $(libs-y)) #來源於頂層Makefile文件
579 libs-y := $(libs-y1) $(libs-y2) #來源於頂層Makefile文件

435 drivers-y := drivers/ sound/ #來源於頂層Makefile文件
575 drivers-y := $(patsubst %/, %/built-in.o, $(drivers-y)) #來源於頂層Makefile文件

436 net-y := net/ #來源於頂層Makefile文件
576 net-y := $(patsubst %/, %/built-in.o, $(net-y)) #來源於頂層Makefile文件

結合438行和562行,574行,第574行core-y := kernel/built-in.o mm/built-in.o fs/built-in.o ipc/built-in.o security/built-in.o crypto/built-in.o block/built-in.o

結合437行、577行和578行,第579行libs-y := lib/lib.a lib/built-in.o

結合435行,第575行drivers-y := drivers/built-in.o sound/built-in.o

結合436行,第576行net-y :=net/built-in.o

第609行將$(core-y) $(libs-y) $(drivers-y) $(net-y)用574行、579行、575行和576分析結果替換,可以得到vmlinux-main :=kernel/built-in.o mm/built-in.o fs/built-in.o ipc/built-in.o security/built-in.o crypto/built-in.o block/built-in.o lib/lib.a lib/built-in.o drivers/built-in.o sound/built-in.o net/built-in.o

610 vmlinux-all  := $(vmlinux-init) $(vmlinux-main)

結合608行和609行分析結果,將610行$(vmlinux-init) $(vmlinux-main)替換,可以得到vmlinux-all :=arch/arm/kernel/head.o arch/arm/kernel/init_task.o init/built-in.o kernel/built-in.o mm/built-in.o fs/built-in.o ipc/built-in.o security/built-in.o crypto/built-in.o block/built-in.o lib/lib.a lib/built-in.o drivers/built-in.o sound/built-in.o net/built-in.o


以上介紹了構成內核的原材料,但它們怎樣組合編譯、連接成為內核,我們還要去看vmlinux依賴文件下執行的命令

745 vmlinux: $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) $(kallsyms.o) FORCE           #頂層Makefile文件
746 ifdef CONFIG_HEADERS_CHECK
747     $(Q)$(MAKE) -f $(srctree)/Makefile headers_check
748 endif
749    $(call if_changed_rule,vmlinux__)
759    $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost $@
751    $(Q)rm -f .old_version

我們可以通過分析上面命令得到編譯過程以及生成的一些文件,但上面命令涉及很多函數、腳本,實在太過龐大,沒有那麼多精力去這樣做。這時可以通過另一種方法直接編譯內核,先通過rm vmlinux命令刪去之前執行make uImage生成的vmlinux,再執行make uImage V=1查看更加詳細編譯過程,連接命令如下圖所示:

 圖中vmlinux為連接輸出結果,arch/arm/kernel/vmlinux.lds為連接腳本,後面的一些內容為連接的原材料,這些原材料和我們上面分析的原材料也基本一一對應。

 

總結:

1、頂層Makefile和arch/$(ARCH)/Makefile決定根目錄下哪些子目錄、arch/$(ARCH)目錄下哪些文件和目錄被編進內核,最後,各級子目錄下的Makefile決定所在目錄下哪些文件將被編進內核,哪些文件被編成模塊,進入哪些子目錄繼續調用它們的Makefile。

2、通過分析得到了編譯內核的連接腳本是arch/arm/kernel/vmlinux.lds,第一個文件是arch/arm/kernel/head.S,後續分析內核啟動時,第一個文件arch/arm/kernel/head.S將是分析入手點。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前幾天做項目用到了動軟代碼生成器 對剛出社會的我來說可以說什麼都不知道,對此趕緊學習了一下才發現這是李天平老師開發的軟體膜拜一下! 以此總結一下 1.軟體基本使用 我在百度下載的是V2.78版的 添加伺服器 選擇要連接的資料庫 點擊連接/測試 看是否成功,同時選擇要連接的資料庫,不然載入全部庫要等好 ...
  • 在學完了C#的方法和數據類型之後,寫了一個簡易的計算器的界面。本次界面具備加減乘除求餘等五項運算。不過存在一點缺陷就是無法判斷輸入數據的類型,是整數還是小數,由於目前所學知識有限,等學到以後再進行完善。 本設計源代碼如下: using System; using System.Collections ...
  • 這個系列文章介紹的是Identity Server 4 的 Hybrid Flow, 前兩篇文章介紹瞭如何保護MVC客戶端, 本文介紹如何保護API資源. 保護MVC客戶端的文章: https://www.cnblogs.com/cgzl/p/9253667.html, https://www.cn ...
  • 前言 距離上一篇文章《基於EF Core的Code First模式的DotNetCore快速開發框架》已過去大半個年頭,時光荏苒,歲月如梭。。。比較尷尬的是,在這大半個年頭裡,除了日常帶娃溜娃做飯,偶爾接幾個私單外,個人開源項目幾乎沒啥動靜。那麼日常工作幹些什麼呢?肯定是堅守Nfx啊。。。為什麼呢? ...
  • 參考 https://blog.csdn.net/lki_suidongdong/article/details/20942977 重點: 實現多級子目錄的壓縮,類似winrar,可以選擇是否排除基準目錄 1 public void ZipDirectoryTest() ... ...
  • [譯]ASP.NET Core Web API 中使用Oracle資料庫和Dapper看這篇就夠了 本文首發自:博客園 文章地址: https://www.cnblogs.com/yilezhu/p/9276565.html 園子里關於ASP.NET Core Web API的教程很多,但大多都是使 ...
  • 1、簡介 有個叫A.J.Bauer 的大神在System.Windows.Forms.Control類的基礎上建立了一個顯示各種儀錶盤的類。 英文版簡介:C# Tutorial, A gauge control with all source code, .net 2.0 http://ucanco ...
  • 下麵就開始:1.開機後按下WIN鍵 加 R鍵2.輸入 msconfig3.如圖中所示進行點擊。1 引導界面 2安全引導打鉤 、最小打鉤 3 下麵的確定。4.點擊重新啟動5.在重啟時連續按 F2 進入BOIS 依次找到 Advanced頁面, SATA operation (在此處按回車) 如圖所示6 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...