linux配置、編譯核心工具 + 生產力

來源:互聯網
上載者:User

     

配置與編譯核心用到的工具很多,在這裡只對幾個關鍵工具進行介紹,更多的內容請參考相關手冊。

                                          Make
    Make是一種協助大型軟體工程的編譯工作實現自動化的程式設計語言。正確地使用Make可以大大減少因編譯器而花費的時間,因為它可以消除不必要的再編譯。Make的基本設計思想是如果目標檔案是在最近一次對源檔案的修改之後編譯的,它就是“新的”,不需要重新編譯;如果最近一次對源檔案的修改之後沒有及時更新目標檔案,那麼該目標檔案就是“舊的”,需要重新編譯。為了理解Make如何執行一個任務,需要瞭解一些術語:
◆目標 需要執行的一個任務。多數情況下它就是使用者要產生的檔案的名字,但是它也可以僅是個任務的名字。
◆依賴關係 兩個目標之間相互依存的關係。如果修改目標B會造成目標A的修改,那麼就說目標A依賴於目標B,B是A的先決條件。
◆變數 一種儲存臨時資訊的載體。Make中使用的變數應該加上括弧,例如$(TEMP)。
◆命令 執行任務時使用的指令,可以是一條、多條,甚至沒有。
◆規則 一條完整的規則具有以下格式:
目標(target) : 先決條件(prerequisites)
規則(command)
......
    其中只有目標必須要有,其它成分可以沒有。一條完整的規則描述了編譯一個目標的方法和依賴關係,是Makefile中最重要的部分。
◆Makefile檔案 描述如何產生一個或多個目標的檔案。它列出目標依賴的各個檔案,並提供正確編譯這些目標所需要的規則。
    接下來以2.4.23的kbuild為例,簡要介紹一下核心的構建過程。首先,完整的核心構建過程由以下五種Makefile封裝。
   1.根目錄Makefile
    它是最重要的Makefile,定義所有與體繫結構無關的變數和目標。它讀取.config檔案,並根據其資訊最終產生vmlinux和modules。Make通過向下遞迴調用子目錄中的Makefile來編譯這兩個目標。
    2.設定檔.config
    執行“make ”會在根目錄下產生該設定檔,其內容記錄了具體的配置選擇,也可以將舊核心的設定檔放在這裡。
    3.arch/*/Makefile
    這是與特定體繫結構相關的Makefile。它包含在根目錄下的Makefile中,為kbuild提供體繫結構的特定資訊。
    4.子目錄Makefiles
    它們存在於每個子目錄下,大約有幾百個。它們接受來自上層Make傳遞下來的資訊,並根據這些資訊來構造一個需要編譯的檔案清單,並交由Rules.make處理。
    5.Rules.make
    幾乎每個子目錄Makefile都包含該Makefile。根據子目錄Makefiles構建的檔案清單,Make使用Rules.make定義的通用規則來編譯所有來自列表的源檔案。
     kbuild的執行過程是:Make從根目錄Makefile開始執行,從中獲得與體繫結構無關的變數和依賴關係,並同時從arch/*/Makefile中獲得體系特定的變數等資訊,這些資訊擴充了根目錄Makefile提供的變數。此時kbuild已經擁有構建核心需要的所有變數和目標。然後,Make進入子目錄,把部分變數傳遞給子目錄Makefile。子目錄Makefile根據配置資訊決定編譯哪些源檔案,從而構建出一個需要編譯的檔案清單。最後,Rules.make根據其定義的編譯規則決定這些檔案的編譯方式。
    需要注意的是,由於Make的向下遞迴特性和無序性,其執行過程並不完全遵守順序逐行執行的規則,但無論Make的執行有多複雜,也只分為兩個階段。第一個階段Make會讀取所有變數和分析所有目標的依賴關係,並最終建立一棵相依樹狀結構。同時,所有的立即型變數(通過“:=”賦值)在這個過程中被擴充,就像C變數一樣。而在這個階段的最後,所有的延遲型變數才被擴充(通過“=”賦值)。這點需要格外注意。第二個階段Make會根據相依樹狀結構執行命令。
    因此,一個目標和其先決條件的規則定義的順序是無所謂的,很可能一個目標的先決條件的規則定義在百行以後才出現。Make會耐心讀完所有的Makefile後分析得出相依樹狀結構。

                                 GCC
     GCC是GNU的免費編譯器,也是核心惟一指定使用的編譯器。GCC在執行一個完整的編譯任務時會經過以下步驟:
◆預先處理 GCC會調用cpp程式來分析各種巨集指令,如#define、#if、#include等。
◆編譯 這一階段根據輸入檔案產生組合語言指令。由於通常情況下是立即調用組譯工具as,所以輸出一般不儲存在檔案中,可以使用-S選項強制輸出來源程式的彙編版本。
◆彙編 這一階段將組合語言來源程式作為輸入,產生.o目標檔案。
◆連結 這是最後一個階段。該階段中,各個.o模組被連結在一起構成可執行檔。
as
使用者可以明確地要求使用as來直接處理彙編檔案。as產生的目標檔案可以分為文本段(.text)、資料區段(.data)和未初始化資料區段(.bss)。
ld
與as相似,使用者可以明確地要求使用ld連結程式將幾個模組組合成一個單獨的可執行檔。其連結過程通常由一個叫ld連結指令碼的檔案來描述。該指令碼使用Linker Command Language編寫。使用“ld --verose”命令可以看到這個預設使用的ld連結指令碼。
ar
ar是GNU的二進位檔案處理常式,用於建立、修改及從歸檔檔案中抽取檔案。由它產生的.a歸檔檔案實際上是一個包含許多可執行二進位代碼子程式集合的庫檔案。

                              RPMBuild
    使用“make rpm”可以把核心原始碼製作成RPM包。在此之前,kbuild會執行“make spec”產生rpmbuild程式用到的spec檔案,詳見“man rpmbuild”。

中介軟體
根目錄scripts下的各種指令碼和C源檔案都可以稱作中介軟體。它們並不是核心組件的一部分,只是在kbuild執行過程中的輔助程式。以split-include為例,講述設定檔的運作機理。
.config由關鍵字/值對組成,其內容類別似於:
CONFIG_MPENTIUMIII=y

# CONFIG_MPENTIUM4 is not set

CONFIG_REISERFS_FS=m

這些資訊在執行“make ”時自動產生。同時include/linux/autoconf.h依照.config的內容產生。它的格式類似於:
#define CONFIG_MPENTIUMIII 1

#undef CONFIG_MPENTIUM4

#undef  CONFIG_REISERFS_FS

#define CONFIG_REISERFS_FS_MODULE 1

對比一下不難發現,include/linux/autoconf.h明確地洞悉了.config的意圖:哪些組件不編譯,哪些需要編譯進核心,而哪些又要作為模組來編譯?split-include根據include/linux/autoconf.h在include/config/下建立相關的目錄和.h檔案。每個.h檔案只包括include/linux/autoconf.h中的某一行,比如在配置核心選項時支援NTFS檔案系統,並把它編譯進核心,在.config中就會產生“CONFIG_NTFS_FS=y”,相應地在include/linux/autoconf.h中會產生“#define CONFIG_NTFS_FS 1”一項。這樣,所有與NTFS檔案系統相關的C源檔案都會包含include/config/ntfs/fs.h標頭檔。
    如果以前編譯過核心,並且沒有使用過“make mrproper”,.config、include/linux/autoconf.h和include/linux/config/就不會被刪除。這裡涉及到新舊核心的配置問題。一個全新的核心代碼是未經配置的。如果只在原核心的功能基礎上增加對NTFS的支援,那麼從頭開始配置無疑是浪費時間。可以繼續使用原核心的.config檔案,而所有的配置資訊不會有任何更改,並且可以直接在原配置的基礎上增加新功能。
    在複雜的情況下,保留的舊核心配置資訊還要與新的配置資訊進行比較:哪些舊資訊需要覆蓋,哪些需要保留?下面來看一下幾種可能的情況: 

  


    舊值儲存在include/config/下的.h檔案中,新值儲存在新產生的include/linux/autoconf.h檔案中。split-include的代碼不僅描述了如何處理這五種情況,還描述了include/config/下檔案和子目錄的產生過程。

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.