Linux內(nèi)核編譯_第1頁
Linux內(nèi)核編譯_第2頁
Linux內(nèi)核編譯_第3頁
Linux內(nèi)核編譯_第4頁
Linux內(nèi)核編譯_第5頁
已閱讀5頁,還剩48頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、Version 1.0Linux內(nèi)核編譯內(nèi)核編譯本地開發(fā)本地開發(fā):一般軟件的開發(fā)屬于本地開發(fā),也就是說開發(fā)軟一般軟件的開發(fā)屬于本地開發(fā),也就是說開發(fā)軟件的系統(tǒng)與運行軟件的系統(tǒng)是相同的。件的系統(tǒng)與運行軟件的系統(tǒng)是相同的。交叉平臺開發(fā)交叉平臺開發(fā):嵌入式系統(tǒng)開發(fā)屬于交叉平臺開發(fā),也就是說開嵌入式系統(tǒng)開發(fā)屬于交叉平臺開發(fā),也就是說開發(fā)軟件的系統(tǒng)與運行軟件的系統(tǒng)不同。發(fā)軟件的系統(tǒng)與運行軟件的系統(tǒng)不同。p 宿主機宿主機:開發(fā)軟件的平臺,稱為宿主機,往往是通用電腦p目標機目標機:運行軟件的平臺,稱為目標機,在這里是嵌入式系統(tǒng)。掌握嵌入式開發(fā)工具鏈的使用是進行嵌入式開發(fā)掌握嵌入式開發(fā)工具鏈的使用是進行嵌入式

2、開發(fā)的前提條件之一的前提條件之一與主流開發(fā)工具類似,嵌入式交叉開發(fā)工具也包與主流開發(fā)工具類似,嵌入式交叉開發(fā)工具也包括括1. 交叉編譯器,編譯器能夠把一個源程序編譯生成一個由機器語言構(gòu)成的可執(zhí)行程序。雖然交叉編譯器本身也在主機上運行,但編譯生成的不是主機認識的機器語言,而是目標機能夠識別的機器語言。2. 調(diào)試工具,即能夠?qū)?zhí)行程序進行源碼或匯編級調(diào)試的軟件3. 軟件工程工具,用于協(xié)助多人開發(fā)或大型軟件項目的管理的軟件GNU tools和其他一些優(yōu)秀的開源軟件可以完和其他一些優(yōu)秀的開源軟件可以完全覆蓋上述類型的軟件開發(fā)工具。為了更全覆蓋上述類型的軟件開發(fā)工具。為了更好的開發(fā)嵌入式系統(tǒng),需要熟悉如

3、下一些好的開發(fā)嵌入式系統(tǒng),需要熟悉如下一些軟件軟件 GCC Gdb Make Binutils輔助GCC的主要軟件 cvs很多人認為很多人認為GCC只是一個只是一個C編譯器,編譯器,其實其實GCC = GNU Compiler Collection目前,目前,GCC可以支持多種高級語言,如可以支持多種高級語言,如 C、C+ ADA Object C JAVA Fortran PASCALgcc 符合符合ISO等標準的等標準的C編譯器編譯器g+ 基本符合基本符合ISO標準的標準的C+編譯器編譯器gcj GCC的的java前端前端gnat GCC的的GNU ADA 95前端前端 gcc是一個強大的

4、工具集合,它包含了預(yù)處理器、編譯器、匯編器、鏈接器等組件。它會在需要的時候調(diào)用其他組件。輸入文件的類型和傳遞給gcc的參數(shù)決定了gcc調(diào)用具體的哪些組件。 對于開發(fā)者,它提供的足夠多的參數(shù),可以讓開發(fā)者全面控制代碼的生成,這對嵌入式系統(tǒng)級的軟件開發(fā)非常重要。-E只預(yù)處理,不編譯匯編和連接只預(yù)處理,不編譯匯編和連接-S只編譯,不匯編和連接只編譯,不匯編和連接-c只編譯和匯編,不連接只編譯和匯編,不連接-o指定輸出文件指定輸出文件-e指定程序入口指定程序入口-I指定頭文件路徑指定頭文件路徑-L指定鏈接時的指定鏈接時的函數(shù)庫的函數(shù)庫的查找路徑查找路徑-w關(guān)閉顯示警告關(guān)閉顯示警告-Wall 啟動所有編

5、譯警告啟動所有編譯警告-g編譯時加入調(diào)試參數(shù)(編譯時加入調(diào)試參數(shù)(-ggdb)-pg產(chǎn)生產(chǎn)生gprof所用的信息所用的信息-On優(yōu)化優(yōu)化-ansi-std=c89c99gnu89gnu99 編譯和運行編譯和運行編譯運行 一般情況下,一般情況下,c程序的編譯過程為程序的編譯過程為1、預(yù)處理2、編譯成匯編代碼3、匯編成目標代碼4、鏈接 預(yù)處理:使用預(yù)處理:使用-E參數(shù)參數(shù)輸出文件的后綴為輸出文件的后綴為“.cpp”gcc E o gcctest.cpp gcctest.c 預(yù)處理文件預(yù)處理文件匯編代碼匯編代碼1)使用)使用-x參數(shù)說明根據(jù)指定的步驟進行工參數(shù)說明根據(jù)指定的步驟進行工作,作,cpp-

6、output指明從預(yù)處理得到的文件開指明從預(yù)處理得到的文件開始編譯始編譯2)使用)使用-S說明生成匯編代碼后停止工作說明生成匯編代碼后停止工作gcc x cpp-output S o gcctest.s gcctest.cpp 也可以也可以直接編譯到匯編代碼直接編譯到匯編代碼gcc S gcctest.c 匯編代碼匯編代碼目標代碼目標代碼gcc x assembler c gcctest.s 直接編譯成目標代碼直接編譯成目標代碼gcc c gcctest.c 使用匯編器生成目標代碼使用匯編器生成目標代碼as o gcctest.o gcctest.s 目標代碼目標代碼執(zhí)行代碼執(zhí)行代碼gcc o

7、 gcctest gcctest.o 直接生成執(zhí)行代碼直接生成執(zhí)行代碼gcc o gcctest gcctest.c 優(yōu)化編譯選項有:優(yōu)化編譯選項有: -O0缺省情況,不優(yōu)化 -O1 -O2 -O3 等等不同程度的優(yōu)化基于arm9的Linux OS不同的優(yōu)化編譯選項 Gdb調(diào)試器調(diào)試器 GNU make軟件工程工具軟件工程工具 diff,patch補丁工具補丁工具 CVS版本控制系統(tǒng)版本控制系統(tǒng)Gdb = GNU debuger功能:功能:斷點斷點更改程序流向更改程序流向監(jiān)視程序運行時數(shù)據(jù)監(jiān)視程序運行時數(shù)據(jù)監(jiān)視其他信息監(jiān)視其他信息程序運行時動態(tài)修改數(shù)據(jù)程序運行時動態(tài)修改數(shù)據(jù)break brea

8、k break +offset break -offsetbreak filename:linenumbreak filename:functionbreak *addressbreakbreak . if tbreak 臨時斷點臨時斷點condition 斷點附加條斷點附加條件件watch rwatch awatch cleardeletedisableenablestep/stepinext/nexticontinue/continue finishjump /jump call return / return print /fmt display /fmt display /fmt ex

9、amine /n/f/u backtraceinfo registersinfo frameinfo argsinfo localsset val list / list / list 列出源程序列出源程序disas / disas 反匯編反匯編forward-search reverse-search GNU make是一種代碼維護工具,在使用是一種代碼維護工具,在使用GNU編譯器編譯器開發(fā)大型應(yīng)用時開發(fā)大型應(yīng)用時,往往要使用,往往要使用make管理項目管理項目。 如果不使用make管理項目,就必須重復使用多個復雜的命令行維護項目和生成目標代碼。 Make通過將命令行保存到通過將命令行保存到

10、makefile中簡化了中簡化了編譯工作。編譯工作。 Make的的主要任務(wù)主要任務(wù)是根據(jù)是根據(jù)makefile中定義的規(guī)中定義的規(guī)則和步驟,根據(jù)各個模塊的更新情況,自則和步驟,根據(jù)各個模塊的更新情況,自動完成整個軟件項目的維護和代碼生成工動完成整個軟件項目的維護和代碼生成工作。作。 Make可以識別出可以識別出makefile中包含的哪些文件中包含的哪些文件已經(jīng)被修改,并且在再次編譯的時候只編已經(jīng)被修改,并且在再次編譯的時候只編譯這些文件,從而提高編譯的效率譯這些文件,從而提高編譯的效率 Make會檢查文件的修改和生成時間戳,如果目標文件的修改或者生成時間戳比它的任意一個依賴文件舊,則make

11、就執(zhí)行makefile文件中描述的相應(yīng)命令,以便更新目的文件 只更新那些需要更新的文件,而不重新處理那些并不過時的文件 特點特點: 適合于支持多文件構(gòu)成的大中型軟件項目的編譯,鏈接,清除中間文件等管理工作 支持對多目錄的軟件項目進行遞歸管理 對軟件項目具有很好的可維護性和擴展性 Makefile告訴告訴make該做什么、怎么做該做什么、怎么做 makefile主要定義了主要定義了1)依賴關(guān)系即有關(guān)哪些文件的最新版本是依賴于哪些別的文件產(chǎn)生或者組成的2)需要用什么命令來產(chǎn)生目標文件的最新版本3)以及一些其他的功能 規(guī)則規(guī)則一條規(guī)則包含一條規(guī)則包含3個方面的內(nèi)容,個方面的內(nèi)容,1)要創(chuàng)建的目標(文

12、件),2)創(chuàng)建目標(文件)所依賴的文件列表;3)通過依賴文件創(chuàng)建目標文件的命令組基于arm9的Linux OS 規(guī)則一般形式規(guī)則一般形式target . : prerequisites . command . . 例如例如test:test.cgcc O o test test.cedit : main.o kbd.o command.o display.o insert.o search.o files.o utils.occ -o edit main.o kbd.o command.o display.o insert.o search.o files.o utils.omain.o :

13、main.c defs.hcc -c main.ckbd.o : kbd.c defs.h command.hcc -c kbd.ccommand.o : command.c defs.h command.hcc -c command.cdisplay.o : display.c defs.h buffer.hcc -c display.cinsert.o : insert.c defs.h buffer.hcc -c insert.csearch.o : search.c defs.h buffer.hcc -c search.cfiles.o : files.c defs.h buffer

14、.h command.hcc -c files.cutils.o : utils.c defs.hcc -c utils.cclean : rm edit main.o kbd.o command.o display.o insert.o search.o files.o utils.o 基于arm9的Linux OS 使用變量可以使用變量可以 降低錯誤風險 簡化makefile 例:例:objects變量(變量($(objects))objects = main.o kbd.o command.o display.o insert.o search.o files.o utils.oedit

15、 : $(objects)cc -o edit $(objects) 基于arm9的Linux OS 有點像環(huán)境變量有點像環(huán)境變量 環(huán)境變量在make 過程中被解釋成make的變量 可以被用來可以被用來 貯存一個文件名列表。 貯存可執(zhí)行文件名。如用變量代替編譯器名。 貯存編譯器FLAG目錄目錄描述描述arch特定體系結(jié)構(gòu)的源碼特定體系結(jié)構(gòu)的源碼cryto常用的加密算法常用的加密算法Documentation內(nèi)核源碼文檔內(nèi)核源碼文檔Drivers設(shè)備驅(qū)動程序設(shè)備驅(qū)動程序fsVFS和各種文件系統(tǒng)和各種文件系統(tǒng)include內(nèi)核頭文件內(nèi)核頭文件init內(nèi)核引導和初始化內(nèi)核引導和初始化ipc進程間通信

16、代碼進程間通信代碼kernel調(diào)度子系統(tǒng)這樣的核心子系統(tǒng)調(diào)度子系統(tǒng)這樣的核心子系統(tǒng)lib通用內(nèi)核函數(shù)通用內(nèi)核函數(shù)mm內(nèi)存管理子系統(tǒng)與虛擬內(nèi)存內(nèi)存管理子系統(tǒng)與虛擬內(nèi)存net網(wǎng)絡(luò)子系統(tǒng)網(wǎng)絡(luò)子系統(tǒng)scripts編譯內(nèi)核所用的腳本編譯內(nèi)核所用的腳本securityLinux的安全模塊的安全模塊sound語音子系統(tǒng)語音子系統(tǒng)usr早期用戶代碼早期用戶代碼(initramfs)硬件平臺相關(guān)硬件平臺相關(guān)的引導過程的引導過程平臺無關(guān)的平臺無關(guān)的通用引導過程通用引導過程arch/arm/kernel/head.Sinit/main.cstart_kernel() 1. 正在使用的內(nèi)核版本過舊、或是發(fā)行商提供的非

17、標正在使用的內(nèi)核版本過舊、或是發(fā)行商提供的非標準內(nèi)核;準內(nèi)核;2. 正在使用的內(nèi)核過于臃腫,需要進行裁剪;正在使用的內(nèi)核過于臃腫,需要進行裁剪;3. 需要在一個新的嵌入式目標機上移植需要在一個新的嵌入式目標機上移植Linux(需要(需要交叉編譯);交叉編譯);4. 開發(fā)嵌入式開發(fā)嵌入式Linux驅(qū)動時,必須首先在開發(fā)用宿主驅(qū)動時,必須首先在開發(fā)用宿主機上交叉編譯出目標機上的機上交叉編譯出目標機上的Linux內(nèi)核。(編譯驅(qū)內(nèi)核。(編譯驅(qū)動時會用到編譯目標內(nèi)核時生成的動時會用到編譯目標內(nèi)核時生成的makefile文件、文件、頭文件和符號表文件)頭文件和符號表文件)生成生成 .configer文件文

18、件內(nèi)核映像內(nèi)核映像vmlinux符號表符號表System.map壓縮映像壓縮映像zImage可加載內(nèi)核模塊可加載內(nèi)核模塊*.ko1.內(nèi)核源碼目錄樹的很多目錄下都有一個內(nèi)核源碼目錄樹的很多目錄下都有一個Kconfig文件和一個文件和一個Makefile文件;文件;2.從內(nèi)核源碼樹的根目錄開始遞歸地進入到各級子目錄,依從內(nèi)核源碼樹的根目錄開始遞歸地進入到各級子目錄,依次搜索各個目錄下的次搜索各個目錄下的Kconig文件;文件;3.根據(jù)這些根據(jù)這些Kconfig文件生成相應(yīng)的菜單選項,供用戶選擇;文件生成相應(yīng)的菜單選項,供用戶選擇;配置界面以樹狀的菜單形式組織,主菜單下有若干個子菜配置界面以樹狀的菜

19、單形式組織,主菜單下有若干個子菜單,子菜單下又有子菜單,子菜單下又有子菜 單或配置選項。每個子菜單或選項單或配置選項。每個子菜單或選項可以有依賴關(guān)系,只有被依賴項的父項已經(jīng)被選中,子項可以有依賴關(guān)系,只有被依賴項的父項已經(jīng)被選中,子項才會顯示。才會顯示。4.對于各個選項,用戶一般可以選擇對于各個選項,用戶一般可以選擇“Y”(包含該選項包含該選項),“N”(不包含該選項),(不包含該選項),“M”(將該選項編譯為可加載(將該選項編譯為可加載內(nèi)核模塊)內(nèi)核模塊)5.將用戶的選擇保存在將用戶的選擇保存在.config文件中文件中1. CPU類型和特性配置類型和特性配置2. 電源管理配置電源管理配置3

20、. 總線配置總線配置4. 網(wǎng)絡(luò)配置網(wǎng)絡(luò)配置5. 設(shè)備驅(qū)動配置設(shè)備驅(qū)動配置6. 文件系統(tǒng)配置文件系統(tǒng)配置7. 塊設(shè)備層配置塊設(shè)備層配置8. 可加載內(nèi)核模塊配置可加載內(nèi)核模塊配置9. 1. Make工具從內(nèi)核源碼樹的根目錄開始,根工具從內(nèi)核源碼樹的根目錄開始,根據(jù)據(jù).configer的設(shè)置,依次進入被用戶選中的各個目的設(shè)置,依次進入被用戶選中的各個目錄,并根據(jù)該目錄下的錄,并根據(jù)該目錄下的Makefile文件的指示進行編文件的指示進行編譯。譯。2. 編譯完成之后,一般會在根目錄下找到未壓縮的內(nèi)編譯完成之后,一般會在根目錄下找到未壓縮的內(nèi)核映像核映像vmlinux和內(nèi)核符號表文件和內(nèi)核符號表文件Sy

21、stem.map,在,在arch/arm/boot下找到壓縮的內(nèi)核映像下找到壓縮的內(nèi)核映像zImage。1. 將編寫的源碼考入將編寫的源碼考入Linux內(nèi)核源代碼的相應(yīng)目錄。內(nèi)核源代碼的相應(yīng)目錄。2. 在該目錄的在該目錄的Kconfig中增加關(guān)于新源碼對應(yīng)項目的中增加關(guān)于新源碼對應(yīng)項目的配置選項。配置選項。3. 在該目錄的在該目錄的Makefile文件中增加對新源代碼的編譯文件中增加對新源代碼的編譯條目。條目。1. 構(gòu)造交叉編譯環(huán)境;構(gòu)造交叉編譯環(huán)境;2. 構(gòu)造構(gòu)造Bootloader;3. 裁剪并編譯裁剪并編譯Linux內(nèi)核;內(nèi)核;4. 構(gòu)造根文件系統(tǒng);構(gòu)造根文件系統(tǒng);5. 加入應(yīng)用軟件;加入應(yīng)用軟件;1. 下載下載gcc源碼,用宿主機上的源碼,用宿主機上的gcc(host-gcc)將其編譯,將其編譯,生成針對目標機的生成針對目標機的gcc(target-gcc);2. 用用target-gcc生成生成target-glibc庫;庫;1. 下載下載uboot源碼,進行定制或移植;源碼,進行定制或移植;2. 在宿主機上用在宿主機上用target-gcc將將uboot編譯成能夠在目標編譯成能夠在目標機上運行的機上運行的bootloader映像文件;映像文件;3. 系統(tǒng)加電或復位后,所有系統(tǒng)加電或復位后,所有CPU都會從某個地址開都會從某個地址開始執(zhí)行,這是由處理器設(shè)計決

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論