版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
嵌入式系統(tǒng)(xìtǒng)設(shè)計(jì)主講(zhǔjiǎng)教師:張錯(cuò)玲計(jì)算機(jī)工程學(xué)院安徽三聯(lián)學(xué)院ANHUISANLIANUNIVERSITY共八十頁(yè)第6章嵌入式Linux開(kāi)發(fā)(kāifā)環(huán)境及其在ARM上的移植主講(zhǔjiǎng)教師:張老師嵌入式系統(tǒng)安徽三聯(lián)學(xué)院計(jì)算機(jī)工程學(xué)院共八十頁(yè)本章(běnzhānɡ)目錄6.1嵌入式Linux開(kāi)發(fā)環(huán)境
6.1.1交叉編譯工具介紹6.1.2交叉編譯環(huán)境的建立6.2嵌入式Linux在ARM平臺(tái)上的移植
6.2.1Linux內(nèi)核源代碼的組織(zǔzhī)6.2.2嵌入式Linux內(nèi)核裁剪方法6.2.3嵌入式Linux內(nèi)核定制過(guò)程6.2.4內(nèi)核編譯及裝載6.2.5文件系統(tǒng)及其實(shí)現(xiàn)
共八十頁(yè)教學(xué)(jiāoxué)目標(biāo)了解交叉編譯(biānyì)工具;掌握gcc編譯器和gdb調(diào)試工具;理解和使用make命令和makefile文件;掌握交叉編譯環(huán)境的建立;了解嵌入式linux系統(tǒng)的移植過(guò)程,linux內(nèi)核裁剪方法、定制過(guò)程、內(nèi)核編譯及裝載;掌握常用的嵌入式文件系統(tǒng)種類;了解文件系統(tǒng)的構(gòu)建方法。共八十頁(yè)Linux系統(tǒng)(xìtǒng)移植1.開(kāi)發(fā)環(huán)境的搭建2.系統(tǒng)引導(dǎo)-bootloader引導(dǎo)(1)bootloader概念:
bootloader就是在操作系統(tǒng)內(nèi)核運(yùn)行前運(yùn)行的一段小程序。通過(guò)這段小程序,完成了對(duì)硬件的基本初始化,并將內(nèi)核映像文件和文件系統(tǒng)復(fù)制到RAM中,然后為內(nèi)核啟動(dòng)設(shè)置基本的運(yùn)行環(huán)境,之后就跳轉(zhuǎn)到內(nèi)核映像的首地址處,將CPU運(yùn)行權(quán)交給內(nèi)核,起到引導(dǎo)和加載內(nèi)核鏡像的作用。(2)位置:BootLoader是系統(tǒng)復(fù)位(fùwèi)或上電后首先運(yùn)行的代碼,一般應(yīng)寫(xiě)在起始物理地址0x0開(kāi)始。共八十頁(yè)Linux系統(tǒng)(xìtǒng)移植Bootloader的類型:(1)Redboot是Redhat公司隨eCos發(fā)布的一個(gè)BOOT方案,是一個(gè)開(kāi)源項(xiàng)目。(2)ARMboot是一個(gè)ARM平臺(tái)的開(kāi)源固件項(xiàng)目,基于(jīyú)PPCBoot,鑒于對(duì)PPCBoot的嚴(yán)重依賴性,已經(jīng)與PPCBoot項(xiàng)目合并,新的項(xiàng)目為U-Boot。(3)U-Boot是由開(kāi)源項(xiàng)目PPCBoot發(fā)展起來(lái)的,ARMboot并入了PPCBoot。共八十頁(yè)Linux系統(tǒng)(xìtǒng)移植Bootloader的類型:(4)Blob(BootLoaderObject)是由Jan-DerkBakkerandErikMouw發(fā)布的,是專門為StrongARM構(gòu)架下的LART設(shè)計(jì)(shèjì)的BootLoader。(5)Bios-lt是專門支持三星(Samsung)公司ARM構(gòu)架處理器S3C4510B的Loader,可以設(shè)置CPU/ROM/SDRAM/EXTIO,管理并燒寫(xiě)FLASH,裝載引導(dǎo)uClinux內(nèi)核。共八十頁(yè)Linux系統(tǒng)(xìtǒng)移植Bootloader的類型:(6)Bootldr是康柏(Compaq)公司(ɡōnɡsī)發(fā)布的,類似于compaqiPAQPocketPC,支持SA1100芯片。它被推薦用來(lái)引導(dǎo)Llinux,支持串口Y-modem協(xié)議以及jffs文件系統(tǒng)。(7)vivi是韓國(guó)mizi公司開(kāi)發(fā)的bootloader,適用于ARM9處理器。共八十頁(yè)Linux系統(tǒng)(xìtǒng)移植3.內(nèi)核引導(dǎo)內(nèi)核啟動(dòng)進(jìn)一步對(duì)硬件進(jìn)行初始化,對(duì)設(shè)備驅(qū)動(dòng)程序進(jìn)行加載,文件系統(tǒng)的掛載及應(yīng)用程序的執(zhí)行(zhíxíng)。在執(zhí)行(zhíxíng)前,處理器CPU應(yīng)滿足以下?tīng)顟B(tài):
R0=0R1=機(jī)器類型R2=參數(shù)標(biāo)記列表在RAM中的起始地址MMU-off
I-cache-onoroff
D-cache–off
共八十頁(yè)Linux系統(tǒng)(xìtǒng)移植
CPU寄存器的設(shè)置:
R0=0;R1=機(jī)器類型;R2=啟動(dòng)參數(shù)標(biāo)記列表(lièbiǎo)在RAM中的起始地址;這三個(gè)寄存器的設(shè)置是在最后啟動(dòng)內(nèi)核時(shí)通過(guò)啟動(dòng)參數(shù)來(lái)傳遞完成的。CPU模式:關(guān)閉中斷;屬于SVC模式;Bootloader中沒(méi)有必要支持中斷的實(shí)現(xiàn),這屬于內(nèi)核機(jī)制以及設(shè)備驅(qū)動(dòng)管理的管理范疇;SVC模式是系統(tǒng)的一種保護(hù)模式,這樣就可以進(jìn)行一些只能在SVC模式下的操作,例如一些特定寄存器訪問(wèn)操作。共八十頁(yè)Linux系統(tǒng)(xìtǒng)移植
Cache和MMU的設(shè)置:
MMU必須關(guān)閉;數(shù)據(jù)cache必須關(guān)閉;指令cache可以關(guān)閉也可以開(kāi)啟;Bootloader中所有對(duì)地址的操作都是使用物理地址,是實(shí)在(shízài)的實(shí)地址,不存在虛擬地址,因此MMU必須關(guān)閉。Bootloader主要是裝載內(nèi)核鏡像,鏡像數(shù)據(jù)必須真實(shí)寫(xiě)回SDRAM中,所以數(shù)據(jù)cache必須關(guān)閉;而對(duì)于指令cache,不存在強(qiáng)制性的規(guī)定,但是一般情況下,推薦關(guān)閉指令cache。共八十頁(yè)Linux系統(tǒng)(xìtǒng)移植4.設(shè)備驅(qū)動(dòng)程序的移植——如LCD、網(wǎng)卡、觸摸屏等設(shè)備驅(qū)動(dòng)程序的移植,主要是相近源碼的移植修改。5.文件系統(tǒng)的掛載——在內(nèi)核(nèihé)啟動(dòng)的最后階段,進(jìn)行文件系統(tǒng)的加載。共八十頁(yè)本章(běnzhānɡ)目錄6.1嵌入式Linux開(kāi)發(fā)(kāifā)環(huán)境
6.1.1交叉編譯工具介紹6.1.2交叉編譯環(huán)境的建立6.2嵌入式Linux在ARM平臺(tái)上的移植
6.2.1Linux內(nèi)核源代碼的組織6.2.2嵌入式Linux內(nèi)核裁剪方法6.2.3嵌入式Linux內(nèi)核定制過(guò)程6.2.4內(nèi)核編譯及裝載6.2.5文件系統(tǒng)及其實(shí)現(xiàn)
共八十頁(yè)6.1嵌入式Linux開(kāi)發(fā)(kāifā)環(huán)境
采用交叉編譯開(kāi)發(fā)方式的目的:由于嵌入式系統(tǒng)(xìtǒng)的硬件平臺(tái)沒(méi)有足夠的資源在本機(jī)上運(yùn)行開(kāi)發(fā)工具和調(diào)試工具,所以采用交叉編譯的方式進(jìn)行軟件開(kāi)發(fā)。所謂交叉編譯就是在一個(gè)平臺(tái)上生成可以在另一個(gè)平臺(tái)上執(zhí)行的代碼。宿主機(jī)交叉編譯共八十頁(yè)6.1嵌入式Linux開(kāi)發(fā)(kāifā)環(huán)境宿主機(jī)通過(guò)(tōngguò)串口與開(kāi)發(fā)板連接共八十頁(yè)6.1嵌入式Linux開(kāi)發(fā)(kāifā)環(huán)境開(kāi)發(fā)板與主機(jī)(zhǔjī)網(wǎng)線連接共八十頁(yè)6.1嵌入式Linux開(kāi)發(fā)(kāifā)環(huán)境6.1.1交叉編譯(biānyì)工具介紹非洲牛羚技術(shù)、法律以及財(cái)政支持共八十頁(yè)6.1嵌入式Linux開(kāi)發(fā)(kāifā)環(huán)境6.1.1交叉編譯工具(gōngjù)介紹1.GNUbinutils是一組二進(jìn)制工具集。包括:addr2line、ar、gprof、nm、objcopy、objdump、ranlib、size、strings、strip等程序。(1)GNU匯編器as——用來(lái)將匯編語(yǔ)言編寫(xiě)的源程序轉(zhuǎn)換成二進(jìn)制形式的目標(biāo)代碼,形式.o文件。(2)GNU鏈接器ld——(3)GNU庫(kù)管理器ar共八十頁(yè)6.1嵌入式Linux開(kāi)發(fā)(kāifā)環(huán)境6.1.1交叉編譯工具介紹(jièshào)2.gcc編譯器(1)gcc編譯器是基于命令行的。(2)gcc基本用法gcc[options][filenames](3)gcc選項(xiàng)共八十頁(yè)6.1嵌入式Linux開(kāi)發(fā)(kāifā)環(huán)境gcc編譯器常用的命令行參數(shù)(cānshù)一覽序號(hào)gcc命令參數(shù)作用1gcc-Esource_file.c-E,只執(zhí)行到預(yù)編譯。直接輸出預(yù)編譯結(jié)果。2gcc-Ssource_file.c-S,只執(zhí)行到源代碼到匯編代碼的轉(zhuǎn)換,輸出匯編代碼。3gcc-csource_file.c-c,只執(zhí)行到編譯,輸出目標(biāo)文件。4gcc-gsource_file.c
生成供調(diào)試用的可執(zhí)行文件,可以在gdb中運(yùn)行。5
gcc-Osource_file.c-O(大寫(xiě)的字母O),編譯器對(duì)代碼進(jìn)行自動(dòng)優(yōu)化編譯,輸出效率更高的可執(zhí)行文件。6
gcc-Wallsource_file.c-W,在編譯中開(kāi)啟一些額外的警告(warning)信息。-Wall,將所有的警告信息全開(kāi)。共八十頁(yè)6.1嵌入式Linux開(kāi)發(fā)(kāifā)環(huán)境(4)函數(shù)庫(kù)和包含文件如果需要鏈接不在標(biāo)準(zhǔn)目錄下的函數(shù)庫(kù)或包含文件,可以使用(shǐyòng)-L{dirname}和-I{dirname}選項(xiàng)指定文件所在的目錄,來(lái)確保該目錄的搜索順序在標(biāo)準(zhǔn)目錄之前。(5)gcc執(zhí)行過(guò)程用GCC編譯程序生成可執(zhí)行文件有時(shí)候看起來(lái)似乎僅通過(guò)編譯一步就完成了,但事實(shí)上要經(jīng)過(guò)下面的幾個(gè)過(guò)程:共八十頁(yè)6.1嵌入式Linux開(kāi)發(fā)(kāifā)環(huán)境預(yù)處理(Pre-Processing)——GCC首先調(diào)用cpp命令進(jìn)行預(yù)處理,主要實(shí)現(xiàn)對(duì)源代碼編譯前的預(yù)處理,比如將源代碼中指定(zhǐdìng)的頭文件包含進(jìn)來(lái)。編譯(Compiling)——接著調(diào)用cc1命令進(jìn)行編譯,作為整個(gè)編譯過(guò)程的一個(gè)中間步驟,該過(guò)程會(huì)將源代碼翻譯生成匯編代碼。匯編(Assembling)——匯編過(guò)程是針對(duì)匯編語(yǔ)言的步驟,調(diào)用as命令進(jìn)行工作,生成擴(kuò)展名為.o的目標(biāo)文件。鏈接(Linking)——最后調(diào)用鏈接器ld來(lái)完成鏈接。共八十頁(yè)6.1嵌入式Linux開(kāi)發(fā)(kāifā)環(huán)境案例(ànlì)分析(P147)程序清單6.1hello.c#include<stdio.h>intmain(){printf(“helloworld!\n”);}#gcc–ohellohello.c#./hello輸出:helloworld!共八十頁(yè)6.1嵌入式Linux開(kāi)發(fā)(kāifā)環(huán)境3.make命令和Makefile文件(1)make存在的原因:都是源文件太多惹得禍。(2)解決問(wèn)題:可以將大型的開(kāi)發(fā)項(xiàng)目分解成為多個(gè)更易于管理的模塊,對(duì)于(duìyú)一個(gè)包括幾百個(gè)源文件的應(yīng)用程序,使用make工具和makefile文件就可以簡(jiǎn)潔明快地理順各個(gè)源文件之間紛繁復(fù)雜的相互關(guān)系。如此多的源文件,如果每次都要鍵入gcc命令進(jìn)行編譯的話,那對(duì)程序員來(lái)說(shuō)簡(jiǎn)直就是一場(chǎng)災(zāi)難。而make工具則可自動(dòng)完成編譯工作,并且可以只對(duì)程序員在上次編譯后修改過(guò)的部分進(jìn)行編譯。共八十頁(yè)6.1嵌入式Linux開(kāi)發(fā)(kāifā)環(huán)境(3)make參數(shù)–k:
如果使用該選項(xiàng),即使make程序遇到(yùdào)錯(cuò)誤也會(huì)繼續(xù)向下運(yùn)行;如果沒(méi)有該選項(xiàng),在遇到(yùdào)第一個(gè)錯(cuò)誤時(shí)make程序馬上就會(huì)停止,那么后面的錯(cuò)誤情況就不得而知了。我們可以利用這個(gè)選項(xiàng)來(lái)查出所有有編譯問(wèn)題的源文件。–f
:
指定作為makefile的文件的名稱。共八十頁(yè)6.1嵌入式Linux開(kāi)發(fā)(kāifā)環(huán)境(3)Makefile文件語(yǔ)法規(guī)則:文件中需要說(shuō)明如何編譯各個(gè)源文件并連接(liánjiē)生成可執(zhí)行文件,并要求定義源文件之間的依賴關(guān)系。命名規(guī)則:Makefile或者makefile或者make–ffilename基本結(jié)構(gòu):target:dependenciescommandtarget是目標(biāo)文件,可以是ObjectFile,也可以是執(zhí)行文件。dependencies:規(guī)定了最終得到的應(yīng)用程序跟生成它的各個(gè)源文件之間的關(guān)系。command也就是make需要執(zhí)行的命令。說(shuō)明:command必須以Tab鍵開(kāi)頭。共八十頁(yè)6.1嵌入式Linux開(kāi)發(fā)(kāifā)環(huán)境案例(ànlì)分析6-2:main:main.of1.of2.o
main.o:main.cdef1.h
f1.o:f1.cdef1.hdef2.h
f2.o:f2.cdef2.hdef3.h上面的各個(gè)源文件跟各模塊之間的關(guān)系具有一個(gè)明顯的層次結(jié)構(gòu),如果def2.h發(fā)生了變化,那么就需要更新f1.o和f2.o,而f1.o和f2.o發(fā)生了變化的話,那么main也需要隨之重新構(gòu)建。共八十頁(yè)6.1嵌入式Linux開(kāi)發(fā)(kāifā)環(huán)境main:main.of1.of2.o
gcc-omainmain.of1.of2.o
main.o:main.cdef1.h
gcc-cmain.c
f1.o:f1.cdef1.hdef2.h
gcc-cf1.c
f2.o:f2.cdef2.hdef3.h
gcc-cf2.cclean: -rm–fmain.of1.of2.o#include<STDLIDEF2.H>
#include“def1.h”
externvoidfunction2();
externvoidfunction3();
intmain()
{
function2();
function3();
exit(EXIT_SUCCESS);
}
/*f1.c*/
#include“def1.h”
#include“def2.h”
voidfunction2(){
}
/*f2.c*/
#include“def2.h”
#include“def3.h”
voidfunction3()共八十頁(yè)6.1嵌入式Linux開(kāi)發(fā)(kāifā)環(huán)境默認(rèn)時(shí),make程序只更新makefile中的第一個(gè)目標(biāo),如果希望更新多個(gè)目標(biāo)文件的話,可以使用一個(gè)特殊的目標(biāo)all,假如我們(wǒmen)想在一個(gè)makefile中更新main和hello這兩個(gè)程序文件的話,可以加入下列語(yǔ)句達(dá)到這個(gè)目的:all:mainhello共八十頁(yè)6.1嵌入式Linux開(kāi)發(fā)(kāifā)環(huán)境(4)makefile中變量Makefile中允許(yǔnxǔ)使用簡(jiǎn)單的宏指代源文件及其相關(guān)編譯信息,在Linux中也稱為宏變量。在引用宏時(shí)只需在變量前加$符號(hào),在引用時(shí)就必須加圓括號(hào)()。$?
依賴的文件的修改日期比目標(biāo)文件的創(chuàng)建日期晚。$@
目標(biāo)的完整名稱。$<第一個(gè)依賴文件的名稱。$*
不包含擴(kuò)展名的目標(biāo)文件名稱。共八十頁(yè)6.1嵌入式Linux開(kāi)發(fā)(kāifā)環(huán)境4.glibc庫(kù)提供系統(tǒng)調(diào)用和基本函數(shù)的C庫(kù),可以通過(guò)rpm-qa|grepglibc查看系統(tǒng)目前安裝了哪些和glibc有關(guān)的包。5.gdb調(diào)試工具(1)功能:調(diào)試C或C++程序的調(diào)試器,監(jiān)視程序中變量的值,設(shè)置(shèzhì)斷點(diǎn)以使程序在指定的代碼行上停止執(zhí)行,支持單步執(zhí)行等。(2)應(yīng)用gcc–g-ofilefile.c輸入gdbFile-裝載想要調(diào)試的可執(zhí)行文件共八十頁(yè)6.1嵌入式Linux開(kāi)發(fā)(kāifā)環(huán)境6.1.2嵌入式linux開(kāi)發(fā)環(huán)境(huánjìng)建議的流程:1.建立主機(jī)開(kāi)發(fā)環(huán)境2.配置minicom3.配置NFS服務(wù)4.編譯嵌入式linux系統(tǒng)內(nèi)核5.文件系統(tǒng)的制作6.嵌入式系統(tǒng)開(kāi)發(fā)板的燒寫(xiě)安裝開(kāi)發(fā)環(huán)境配置交叉編譯環(huán)境修改profile文件共八十頁(yè)6.1嵌入式Linux開(kāi)發(fā)(kāifā)環(huán)境6.1.2嵌入式linux開(kāi)發(fā)(kāifā)環(huán)境建議的流程:1.建立主機(jī)開(kāi)發(fā)環(huán)境2.配置minicom3.配置NFS服務(wù)4.編譯嵌入式linux系統(tǒng)內(nèi)核5.文件系統(tǒng)的制作6.嵌入式系統(tǒng)開(kāi)發(fā)板的燒寫(xiě)Com口連線配置minicom參數(shù)共八十頁(yè)6.1嵌入式Linux開(kāi)發(fā)(kāifā)環(huán)境6.1.2嵌入式linux開(kāi)發(fā)環(huán)境建議的流程:1.建立主機(jī)開(kāi)發(fā)環(huán)境2.配置minicom3.配置NFS服務(wù)4.編譯嵌入式linux系統(tǒng)內(nèi)核(nèihé)5.文件系統(tǒng)的制作6.嵌入式系統(tǒng)開(kāi)發(fā)板的燒寫(xiě)設(shè)置NFS服務(wù)指定NFS服務(wù)的用戶掛載文件共八十頁(yè)6.1嵌入式Linux開(kāi)發(fā)(kāifā)環(huán)境6.1.2嵌入式linux開(kāi)發(fā)(kāifā)環(huán)境建議的流程:1.建立主機(jī)開(kāi)發(fā)環(huán)境2.配置minicom3.配置NFS服務(wù)4.編譯嵌入式linux系統(tǒng)內(nèi)核5.文件系統(tǒng)的制作6.嵌入式系統(tǒng)開(kāi)發(fā)板的燒寫(xiě)內(nèi)核配置建立依存關(guān)系建立內(nèi)核共八十頁(yè)6.1嵌入式Linux開(kāi)發(fā)(kāifā)環(huán)境6.1.2嵌入式linux開(kāi)發(fā)環(huán)境建議的流程:1.建立主機(jī)開(kāi)發(fā)環(huán)境2.配置minicom3.配置NFS服務(wù)4.編譯嵌入式linux系統(tǒng)內(nèi)核(nèihé)5.文件系統(tǒng)的制作6.嵌入式系統(tǒng)開(kāi)發(fā)板的燒寫(xiě)cramfs文件系統(tǒng)只讀文件系統(tǒng),
用到mkcramfs制作工具:#./mkcramfsrootcamare_rootfs.cramfsjffs2是一種可讀/寫(xiě)的文件系統(tǒng),制作工具叫做mkfs.jffs2:#./mkfs.jffs2-rrootfs-oxscale_fs.jffs2-e0x40000-p=0x01000000共八十頁(yè)6.1嵌入式Linux開(kāi)發(fā)(kāifā)環(huán)境6.1.2嵌入式linux開(kāi)發(fā)環(huán)境建議的流程(liúchéng):1.建立主機(jī)開(kāi)發(fā)環(huán)境2.配置minicom3.配置NFS服務(wù)4.編譯嵌入式linux系統(tǒng)內(nèi)核5.文件系統(tǒng)的制作6.嵌入式系統(tǒng)開(kāi)發(fā)板的燒寫(xiě)燒寫(xiě)bootloader燒寫(xiě)內(nèi)核zImage到FlashFlash分區(qū)燒寫(xiě)文件系統(tǒng)root共八十頁(yè)6.1.2交叉編譯(biānyì)環(huán)境的建立在建立交叉編譯環(huán)境之前,當(dāng)然首先要在一臺(tái)PC機(jī)(宿主機(jī))上安裝Linux操作系統(tǒng)。一般情況下用定制方式(fāngshì)進(jìn)行完全安裝,即在選擇軟件包(Package)時(shí)選擇最后一項(xiàng)完全安裝(everything)。然后再配置好網(wǎng)絡(luò)、TFTP服務(wù)(為下載燒寫(xiě)所用)和NFS服務(wù)(為交叉開(kāi)發(fā)時(shí)mount所用)。共八十頁(yè)6.1.2交叉編譯(biānyì)環(huán)境的建立匹配(pǐpèi)Binutils、gcc和glibc的版本工具鏈版本Linux2.4.xLinux2.6.xbinutils2.142.14gcc2.95.33.3.2glibc2.2.52.2.5glibc-threads2.2.52.2.5gdb5.36.0ARMV4T平臺(tái)工具鏈常用版本共八十頁(yè)6.1.2交叉編譯(biānyì)環(huán)境的建立構(gòu)建交叉編譯環(huán)境通常有3種方法:方法1:分步編譯和安裝交叉編譯環(huán)境所需要的庫(kù)和源代碼,最終生成交叉編譯環(huán)境。方法2:通過(guò)Crosstool腳本工具來(lái)實(shí)現(xiàn)一次編譯生成交叉編譯環(huán)境。方法3:使用開(kāi)發(fā)(kāifā)平臺(tái)供應(yīng)商提供的開(kāi)發(fā)(kāifā)環(huán)境安裝套件建立交叉編譯環(huán)境,這是最常用的方法。共八十頁(yè)6.1.2交叉編譯環(huán)境(huánjìng)的建立1.分步建立交叉編譯(biānyì)環(huán)境編譯工具鏈流程圖共八十頁(yè)6.1.2交叉編譯(biānyì)環(huán)境的建立建立交叉編譯環(huán)境(huánjìng)可以分為5個(gè)步驟:做好準(zhǔn)備工作:下載工具源碼包和補(bǔ)丁,準(zhǔn)備內(nèi)核頭文件,創(chuàng)建工作目錄等;編譯、安裝Binutils;編譯輔助編譯器(bootstrapgcc);建立glibc庫(kù),這里要使用交叉編譯工具鏈,例如arm-linux-gcc等;編譯生成完整的編譯器(fullgcc),重新配置gcc功能,使其支持C、C++等語(yǔ)言。共八十頁(yè)6.1.2交叉編譯環(huán)境(huánjìng)的建立2.制作交叉調(diào)試器(1)編譯交叉調(diào)試器對(duì)于交叉調(diào)試器,并不是工具鏈必需的工具,但是它是與工具鏈配套使用的。GDB的調(diào)試能力和BUG的修正也因?yàn)?yīnwèi)版本的不同而不同。(2)編譯gdbserver目標(biāo)板還需要gdbserver工具為目標(biāo)板交叉編譯gdbserver。共八十頁(yè)本章(běnzhānɡ)目錄6.1嵌入式Linux開(kāi)發(fā)環(huán)境
6.1.1交叉編譯工具(gōngjù)介紹6.1.2交叉編譯環(huán)境的建立6.2嵌入式Linux在ARM平臺(tái)上的移植
6.2.1Linux內(nèi)核源代碼的組織6.2.2嵌入式Linux內(nèi)核裁剪方法6.2.3嵌入式Linux內(nèi)核定制過(guò)程6.2.4內(nèi)核編譯及裝載6.2.5文件系統(tǒng)及其實(shí)現(xiàn)
共八十頁(yè)本章(běnzhānɡ)目錄6.1嵌入式Linux開(kāi)發(fā)環(huán)境
6.1.1交叉編譯工具介紹6.1.2交叉編譯環(huán)境的建立6.2嵌入式Linux在ARM平臺(tái)上的移植
6.2.1Linux內(nèi)核(nèihé)源代碼的組織6.2.2嵌入式Linux內(nèi)核裁剪方法6.2.3嵌入式Linux內(nèi)核定制過(guò)程6.2.4內(nèi)核編譯及裝載6.2.5文件系統(tǒng)及其實(shí)現(xiàn)
共八十頁(yè)6.2嵌入式Linux在ARM平臺(tái)(píngtái)上的移植6.2.1linux內(nèi)核源代碼的組織嵌入式linux內(nèi)核按照功能可分為(fēnwéi)進(jìn)程管理、內(nèi)存管理、文件系統(tǒng)、設(shè)備管理和網(wǎng)絡(luò)。進(jìn)程管理內(nèi)存管理文件系統(tǒng)設(shè)備管理網(wǎng)絡(luò)嵌入式linux內(nèi)核功能結(jié)構(gòu)圖層次結(jié)構(gòu)共八十頁(yè)6.2嵌入式Linux在ARM平臺(tái)(píngtái)上的移植進(jìn)程管理:內(nèi)核的進(jìn)程管理活動(dòng)實(shí)現(xiàn)了在一個(gè)cpu上多個(gè)進(jìn)程的抽象概念。內(nèi)存管理:內(nèi)核為每個(gè)進(jìn)程在有限可利用的資源上建立了虛擬地址空間,通過(guò)函數(shù)調(diào)用實(shí)現(xiàn)內(nèi)核不同部件(bùjiàn)與內(nèi)存管理子系統(tǒng)的交互。文件系統(tǒng):不僅包含著文件中的數(shù)據(jù)而且還有文件系統(tǒng)的結(jié)構(gòu)。設(shè)備管理:內(nèi)核必須為每個(gè)外部設(shè)備嵌入設(shè)備驅(qū)動(dòng)程序。網(wǎng)絡(luò):數(shù)據(jù)包的發(fā)送和接收。共八十頁(yè)6.2嵌入式Linux在ARM平臺(tái)(píngtái)上的移植IntelCPU及與之相兼容(jiānrónɡ)體系結(jié)構(gòu)的子目錄Linux內(nèi)核源代碼樹(shù)的組織針對(duì)ARM的linux有一個(gè)子目錄-arm共八十頁(yè)6.2嵌入式Linux在ARM平臺(tái)(píngtái)上的移植Linux內(nèi)核源代碼樹(shù)的組織說(shuō)明/arch:目錄包括(bāokuò)了所有和體系結(jié)構(gòu)相關(guān)的核心代碼。它下面的每一個(gè)子目錄都代表一種Linux支持的體系結(jié)構(gòu)(硬件平臺(tái),如ARM平臺(tái)相關(guān)代碼在arch/arm下),例如i386就是IntelCPU及與之相兼容體系結(jié)構(gòu)的子目錄。/fs:目錄存放Linux支持的文件系統(tǒng)代碼和各種類型的文件操作代碼。每一個(gè)子目錄支持一個(gè)文件系統(tǒng),如ext3文件系統(tǒng)對(duì)應(yīng)的就是ext3子目錄。共八十頁(yè)6.2嵌入式Linux在ARM平臺(tái)(píngtái)上的移植/init:目錄包含核心的初始化代碼(不是系統(tǒng)(xìtǒng)的引導(dǎo)代碼),有main.c和Version.c兩個(gè)文件。這是研究核心如何工作的好起點(diǎn)。ipc:目錄包含了核心進(jìn)程間的通信代碼,如信號(hào)量、消息隊(duì)列和管道等。Kernel:內(nèi)核管理的核心代碼,此目錄下的文件實(shí)現(xiàn)了大多數(shù)linux系統(tǒng)的內(nèi)核函數(shù),其中最重要的文件當(dāng)屬sched.c;同時(shí)與處理器結(jié)構(gòu)相關(guān)代碼都放在/archlib/目錄下。共八十頁(yè)6.2嵌入式Linux在ARM平臺(tái)(píngtái)上的移植/include:目錄包括編譯核心所需要的大部分頭文件,例如與平臺(tái)相關(guān)的頭文件在/include/linux子目錄下,與
intelcpu相關(guān)的頭文件在/include/asm-i386子目錄下,而/include/scsi目錄則是有關(guān)scsi設(shè)備的頭文件目錄。/lib:包含內(nèi)核要用到的一些常用函數(shù),如字符串操作函數(shù),格式化輸出函數(shù),內(nèi)存復(fù)制函數(shù)等。/mm:目錄包含了所有獨(dú)立于cpu體系結(jié)構(gòu)的內(nèi)存管理代碼(dàimǎ),如頁(yè)式存儲(chǔ)管理內(nèi)存的分配和釋放等。共八十頁(yè)6.2嵌入式Linux在ARM平臺(tái)(píngtái)上的移植net:目錄里是核心的網(wǎng)絡(luò)部分代碼,實(shí)現(xiàn)(shíxiàn)了各種常見(jiàn)的網(wǎng)絡(luò)協(xié)議,其每個(gè)子目錄對(duì)應(yīng)于網(wǎng)絡(luò)的一個(gè)方面。/drivers:目錄中是系統(tǒng)中所有的設(shè)備驅(qū)動(dòng)程序。它又進(jìn)一步劃分成幾類設(shè)備驅(qū)動(dòng),每一種有對(duì)應(yīng)的子目錄,如聲卡的驅(qū)動(dòng)對(duì)應(yīng)于/drivers/sound;block下為塊設(shè)備驅(qū)動(dòng)程序,比如ide(ide.c)共八十頁(yè)6.2嵌入式Linux在ARM平臺(tái)(píngtái)上的移植Linux內(nèi)核(nèihé)源代碼目錄結(jié)構(gòu)共八十頁(yè)6.2嵌入式Linux在ARM平臺(tái)(píngtái)上的移植Linux系統(tǒng)目錄共八十頁(yè)本章(běnzhānɡ)目錄6.1嵌入式Linux開(kāi)發(fā)環(huán)境
6.1.1交叉編譯工具介紹6.1.2交叉編譯環(huán)境的建立6.2嵌入式Linux在ARM平臺(tái)上的移植
6.2.1Linux內(nèi)核源代碼的組織
6.2.2嵌入式Linux內(nèi)核裁剪方法6.2.3嵌入式Linux內(nèi)核定制過(guò)程6.2.4內(nèi)核編譯及裝載(zhuāngzài)6.2.5文件系統(tǒng)及其實(shí)現(xiàn)
共八十頁(yè)6.2嵌入式Linux在ARM平臺(tái)(píngtái)上的移植6.2.2嵌入式linux內(nèi)核裁剪方法對(duì)Linux操作系統(tǒng)的移植工作主要分為2個(gè)方面:一方面是針對(duì)硬件(yìnɡjiàn)特點(diǎn)對(duì)源代碼的修改,比如內(nèi)核的啟動(dòng)部分、存儲(chǔ)設(shè)備的大小、具體的驅(qū)動(dòng)問(wèn)題等;另一方面是功能模塊的裁剪,主要是對(duì)內(nèi)核功能的配置,包括支持的文件類型、外設(shè)模塊等。共八十頁(yè)6.2嵌入式Linux在ARM平臺(tái)(píngtái)上的移植1.針對(duì)硬件的修改(1)對(duì)一種全新的硬件平臺(tái)開(kāi)展移植(yízhí)工作時(shí),需采用“自底向上”的設(shè)計(jì)方法從頭設(shè)計(jì),即從硬件的需求考慮逐步地采用分析、設(shè)計(jì)、編碼和測(cè)試。(2)大多數(shù)情況下,是在前人工作的基礎(chǔ)上修改已有的代碼。內(nèi)核的啟動(dòng)部分arch目錄下相關(guān)文件arch/arm/boot目錄entry-armv.S文件共八十頁(yè)6.2嵌入式Linux在ARM平臺(tái)(píngtái)上的移植2.功能模塊的裁剪使用Linux自身的配置工具(gōngjù),編譯定制內(nèi)核。修改內(nèi)核源代碼,進(jìn)行內(nèi)核裁剪?;谙到y(tǒng)調(diào)用關(guān)系,進(jìn)行內(nèi)核裁剪。共八十頁(yè)本章(běnzhānɡ)目錄6.1嵌入式Linux開(kāi)發(fā)環(huán)境(huánjìng)
6.1.1交叉編譯工具介紹6.1.2交叉編譯環(huán)境的建立6.2嵌入式Linux在ARM平臺(tái)上的移植
6.2.1Linux內(nèi)核源代碼的組織6.2.2嵌入式Linux內(nèi)核裁剪方法6.2.3嵌入式Linux內(nèi)核定制過(guò)程6.2.4內(nèi)核編譯及裝載6.2.5文件系統(tǒng)及其實(shí)現(xiàn)
共八十頁(yè)6.2嵌入式Linux在ARM平臺(tái)(píngtái)上的移植6.2.3嵌入式linux內(nèi)核定制過(guò)程使用Linux自身(zìshēn)的配置工具編譯定制內(nèi)核,嵌入式Linux操作系統(tǒng)內(nèi)核的定制過(guò)程基本可分為4個(gè)步驟:增刪新的內(nèi)核組件配置內(nèi)核生成內(nèi)核裝載內(nèi)核共八十頁(yè)6.2嵌入式Linux在ARM平臺(tái)(píngtái)上的移植6.2.3嵌入式linux內(nèi)核定制過(guò)程增刪新的內(nèi)核組件啟動(dòng)內(nèi)核配置(pèizhì)程序#Makemenuconfig(在linux源代碼目錄下)選擇loadanAlternateconfigrationfile配置內(nèi)核共八十頁(yè)本章(běnzhānɡ)目錄6.1嵌入式Linux開(kāi)發(fā)環(huán)境(huánjìng)
6.1.1交叉編譯工具介紹6.1.2交叉編譯環(huán)境的建立6.2嵌入式Linux在ARM平臺(tái)上的移植
6.2.1Linux內(nèi)核源代碼的組織6.2.2嵌入式Linux內(nèi)核裁剪方法
6.2.3嵌入式Linux內(nèi)核定制過(guò)程
6.2.4內(nèi)核編譯及裝載6.2.5文件系統(tǒng)及其實(shí)現(xiàn)
共八十頁(yè)6.2嵌入式Linux在ARM平臺(tái)(píngtái)上的移植6.2.4內(nèi)核編譯及裝載編譯內(nèi)核分以下3步進(jìn)行:(1)正確設(shè)置編譯內(nèi)核所需的附屬文件,進(jìn)行依賴性編譯:
#makedep說(shuō)明:此命令會(huì)搜索內(nèi)核編譯中的依賴關(guān)系并修正內(nèi)核編譯配置(pèizhì)。(2)清除以前構(gòu)造內(nèi)核時(shí)產(chǎn)生的所有目標(biāo)文件、模塊文件和一些臨時(shí)文件:
#makeclean共八十頁(yè)6.2嵌入式Linux在ARM平臺(tái)(píngtái)上的移植(3)生成新的可執(zhí)行內(nèi)核映像文件:
#makezImage說(shuō)明:編譯(biānyì)內(nèi)核并生成內(nèi)核映像文件zImage。(4)裝載內(nèi)核硬件:通過(guò)串口或以太網(wǎng),將生成的內(nèi)核文件燒寫(xiě)到嵌入式系統(tǒng)的flash中,啟動(dòng)運(yùn)行即可。代碼:tftpa0500000ramdisk.gztftpa0008000zImagegoa0008000共八十頁(yè)6.2嵌入式Linux在ARM平臺(tái)(píngtái)上的移植說(shuō)明:ramdisk是一個(gè)最小的linuxrootfs(根文件系統(tǒng)rootfs=RootFilsSystem)系統(tǒng),它包含(bāohán)了除內(nèi)核以外的所有l(wèi)inux系統(tǒng)在引導(dǎo)和管理時(shí)需要的工具。共八十頁(yè)本章(běnzhānɡ)目錄6.1嵌入式Linux開(kāi)發(fā)環(huán)境
6.1.1交叉編譯工具介紹6.1.2交叉編譯環(huán)境的建立6.2嵌入式Linux在ARM平臺(tái)上的移植
6.2.1Linux內(nèi)核源代碼的組織6.2.2嵌入式Linux內(nèi)核裁剪方法
6.2.3嵌入式Linux內(nèi)核定制過(guò)程(guòchéng)6.2.4內(nèi)核編譯及裝載6.2.5文件系統(tǒng)及其實(shí)現(xiàn)
共八十頁(yè)6.2嵌入式Linux在ARM平臺(tái)(píngtái)上的移植6.2.5文件系統(tǒng)及其實(shí)現(xiàn)1.文件系統(tǒng)
是指在一個(gè)物理設(shè)備上的任何文件組織和目錄,它構(gòu)成了Linux系統(tǒng)上所有數(shù)據(jù)的基礎(chǔ),Linux程序、庫(kù)、系統(tǒng)文件和用戶文件都駐留其中,因此,它是系統(tǒng)中龐大復(fù)雜且又是最為基本(jīběn)和重要的資源。Linux支持的文件系統(tǒng)有很多種,比如ext2、minix文件系統(tǒng)、msdos、ntfs、nfs、hpft、ncpfs、affsAmiga等。共八十頁(yè)6.2嵌入式Linux在ARM平臺(tái)(píngtái)上的移植Ext2文件系統(tǒng)是Linux事實(shí)上的標(biāo)準(zhǔn)文件系統(tǒng),它已經(jīng)取代了它的前任——擴(kuò)展文件系統(tǒng)(Ext)。Ext支持(zhīchí)的文件最大為2GB,支持的最長(zhǎng)文件名為255個(gè)字符,而且它不支持索引節(jié)點(diǎn)(包括數(shù)據(jù)修改時(shí)間標(biāo)記)。Ext2文件系統(tǒng)的穩(wěn)定性、可靠性和健壯性,所以幾乎在所有基于Linux的系統(tǒng)(包括臺(tái)式機(jī)、服務(wù)器、工作站甚至一些嵌入式設(shè)備)上都使用Ext2文件系統(tǒng)。共八十頁(yè)6.2嵌入式Linux在ARM平臺(tái)(píngtái)上的移植Linux下常用(chánɡyònɡ)文件系統(tǒng)結(jié)構(gòu)共八十頁(yè)6.2嵌入式Linux在ARM平臺(tái)(píngtái)上的移植6.2.5文件系統(tǒng)及其實(shí)現(xiàn)2.常用的嵌入式文件系統(tǒng)常用的文件系統(tǒng)基于不同(bùtónɡ)的存儲(chǔ)設(shè)備可分為3類:基于Flash的文件系統(tǒng):JFFS2,yaffs,cramfs,romfs等;基于RAM的文件系統(tǒng):Ramdisk,ramfs/tmpfs等;網(wǎng)絡(luò)文件系統(tǒng)NFS。共八十頁(yè)6.2嵌入式Linux在ARM平臺(tái)(píngtái)上的移植(1)JFFS2JFFS2的全名為JournallingFlashFileSystemVersion2(閃存日志型文件系統(tǒng)第2版)JFFS2文件系統(tǒng)是日志結(jié)構(gòu)化的①JFFS2在扇區(qū)級(jí)別上執(zhí)行Flash擦除、寫(xiě)、讀操作要比ext2文件系統(tǒng)好。②JFFS2提供了比ext2更好的崩潰(bēngkuì)、掉電安全保護(hù)。③JFFS2是專門為Flash芯片及其類似嵌入式設(shè)備創(chuàng)建的。共八十頁(yè)6.2嵌入式Linux在ARM平臺(tái)(píngtái)上的移植(2)yaffsyaffs/yaffs2(YetAnotherFlashSystem)是專為嵌入式系統(tǒng)使用NANDFlash而設(shè)計(jì)的一種日志型文件系統(tǒng)。與JFFS2相比,它減少(jiǎnshǎo)了一些功能,例如不支持?jǐn)?shù)據(jù)壓縮,所以速度更快,掛載時(shí)間很
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 江西省上饒市2024-2025學(xué)年度第一學(xué)期八年級(jí)上冊(cè)生物期末綠色評(píng)價(jià)試卷(含答案)
- 安徽省蕪湖市2024-2025學(xué)年高一上學(xué)期期末教學(xué)質(zhì)量監(jiān)控歷史試卷(含答案)
- 11年1月貨幣銀行學(xué)試卷與答案
- 棉紗原料倉(cāng)庫(kù)項(xiàng)目可行性研究報(bào)告寫(xiě)作模板-申批備案
- 數(shù)學(xué)-遼寧省大連市2024-2025學(xué)年高三上學(xué)期期末雙基測(cè)試卷及答案
- 2024青苔離婚經(jīng)濟(jì)補(bǔ)償協(xié)議書(shū)2篇
- 2024版服務(wù)協(xié)議續(xù)簽格式樣本版
- 福建省南平市金橋?qū)W校2021-2022學(xué)年高一語(yǔ)文聯(lián)考試卷含解析
- 2024鋁扣板吊頂工程節(jié)能評(píng)估與驗(yàn)收合同協(xié)議3篇
- 2025廠房租賃居間服務(wù)及市場(chǎng)調(diào)研協(xié)議3篇
- 中試部培訓(xùn)資料
- 【可行性報(bào)告】2024年第三方檢測(cè)相關(guān)項(xiàng)目可行性研究報(bào)告
- 藏醫(yī)學(xué)專業(yè)生涯發(fā)展展示
- 信息安全保密三員培訓(xùn)
- 2024新版《藥品管理法》培訓(xùn)課件
- 2024政務(wù)服務(wù)綜合窗口人員能力與服務(wù)規(guī)范考試試題
- JT∕T 1477-2023 系列2集裝箱 角件
- 《陸上風(fēng)電場(chǎng)工程設(shè)計(jì)概算編制規(guī)定及費(fèi)用標(biāo)準(zhǔn)》(NB-T 31011-2019)
- 承兌匯票臺(tái)帳模版
- 地下管道頂管施工方案(非常全)
- 有色金屬工業(yè)安裝工程質(zhì)量檢驗(yàn)評(píng)定標(biāo)準(zhǔn)(共1004頁(yè))
評(píng)論
0/150
提交評(píng)論