第6章 嵌入式Linux開(kāi)發(fā)環(huán)境及其在ARM上的移植_第1頁(yè)
第6章 嵌入式Linux開(kāi)發(fā)環(huán)境及其在ARM上的移植_第2頁(yè)
第6章 嵌入式Linux開(kāi)發(fā)環(huán)境及其在ARM上的移植_第3頁(yè)
第6章 嵌入式Linux開(kāi)發(fā)環(huán)境及其在ARM上的移植_第4頁(yè)
第6章 嵌入式Linux開(kāi)發(fā)環(huán)境及其在ARM上的移植_第5頁(yè)
已閱讀5頁(yè),還剩74頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、嵌入式系統(tǒng)設(shè)計(jì)主講教師:張錯(cuò)玲計(jì)算機(jī)工程學(xué)院安徽三聯(lián)學(xué)院ANHUISANLIANUNIVERSITY第6章 嵌入式Linux開(kāi)發(fā)環(huán)境及其在ARM上的移植主講教師:張老師嵌入式系統(tǒng)安徽三聯(lián)學(xué)院計(jì)算機(jī)工程學(xué)院本章目錄 6.1 嵌入式Linux開(kāi)發(fā)環(huán)境 6.1.1 交叉編譯工具介紹 6.1.2 交叉編譯環(huán)境的建立 6.2 嵌入式Linux在ARM平臺(tái)上的移植 6.2.1 Linux內(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) 教學(xué)目標(biāo)教學(xué)目標(biāo)1.了解交叉編譯工具;2.掌握gcc編譯器和g

2、db調(diào)試工具;3.理解和使用make命令和makefile文件;4.掌握交叉編譯環(huán)境的建立;5.了解嵌入式linux系統(tǒng)的移植過(guò)程,linux內(nèi)核裁剪方法、定制過(guò)程、內(nèi)核編譯及裝載;6.掌握常用的嵌入式文件系統(tǒng)種類;7.了解文件系統(tǒng)的構(gòu)建方法。Linux系統(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)和

3、加載內(nèi)核鏡像的作用。(2)位置:BootLoader是系統(tǒng)復(fù)位或上電后首先運(yùn)行的代碼,一般應(yīng)寫在起始物理地址0 x0開(kāi)始。Linux系統(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)目,基于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。Linux系統(tǒng)移植Bootloader的類型:(4)Blob(Boot Loader Obj

4、ect)是由Jan-Derk Bakker and Erik Mouw發(fā)布的,是專門為StrongARM 構(gòu)架下的LART設(shè)計(jì)的Boot Loader。(5)Bios-lt是專門支持三星(Samsung)公司ARM構(gòu)架處理器S3C4510B的Loader,可以設(shè)置CPU/ROM/SDRAM/EXTIO,管理并燒寫FLASH,裝載引導(dǎo)uClinux內(nèi)核。Linux系統(tǒng)移植Bootloader的類型:(6)Bootldr是康柏(Compaq)公司發(fā)布的,類似于compaq iPAQ Pocket PC,支持SA1100芯片。它被推薦用來(lái)引導(dǎo)Llinux,支持串口Y-modem協(xié)議以及jffs文件系

5、統(tǒng)。(7)vivi是韓國(guó)mizi 公司開(kāi)發(fā)的bootloader, 適用于ARM9處理器。Linux系統(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í)行前,處理器CPU應(yīng)滿足以下?tīng)顟B(tài): l R00 l R1機(jī)器類型l R2參數(shù)標(biāo)記列表在RAM中的起始地址l MMU - off l I-cache - on or off l D-cache off Linux系統(tǒng)移植u CPU寄存器的設(shè)置: R00 ;R1機(jī)器類型;R2啟動(dòng)參數(shù)標(biāo)記列表在RAM中的起始地址;這三個(gè)寄存器的設(shè)置是在最后啟動(dòng)內(nèi)核時(shí)通過(guò)啟動(dòng)參數(shù)來(lái)傳遞完成的。uCPU模式:關(guān)

6、閉中斷;屬于SVC模式;Bootloader中沒(méi)有必要支持中斷的實(shí)現(xiàn),這屬于內(nèi)核機(jī)制以及設(shè)備驅(qū)動(dòng)管理的管理范疇;SVC模式是系統(tǒng)的一種保護(hù)模式,這樣就可以進(jìn)行一些只能在SVC模式下的操作,例如一些特定寄存器訪問(wèn)操作。Linux系統(tǒng)移植u Cache和MMU的設(shè)置: MMU必須關(guān)閉;數(shù)據(jù)cache必須關(guān)閉;指令cache可以關(guān)閉也可以開(kāi)啟;Bootloader中所有對(duì)地址的操作都是使用物理地址,是實(shí)在的實(shí)地址,不存在虛擬地址,因此MMU必須關(guān)閉。Bootloader主要是裝載內(nèi)核鏡像,鏡像數(shù)據(jù)必須真實(shí)寫回SDRAM中,所以數(shù)據(jù)cache必須關(guān)閉;而對(duì)于指令cache,不存在強(qiáng)制性的規(guī)定,但是一般

7、情況下,推薦關(guān)閉指令cache。Linux系統(tǒng)移植4.設(shè)備驅(qū)動(dòng)程序的移植如LCD、網(wǎng)卡、觸摸屏等設(shè)備驅(qū)動(dòng)程序的移植,主要是相近源碼的移植修改。5.文件系統(tǒng)的掛載在內(nèi)核啟動(dòng)的最后階段,進(jìn)行文件系統(tǒng)的加載。本章目錄 6.1 嵌入式Linux開(kāi)發(fā)環(huán)境 6.1.1 交叉編譯工具介紹 6.1.2 交叉編譯環(huán)境的建立 6.2 嵌入式Linux在ARM平臺(tái)上的移植 6.2.1 Linux內(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) 6.1 嵌入式Linux開(kāi)發(fā)環(huán)境u 采用交叉編譯開(kāi)發(fā)方式的目的:

8、由于嵌入式系統(tǒng)的硬件平臺(tái)沒(méi)有足夠的資源在本機(jī)上運(yùn)行開(kāi)發(fā)工具和調(diào)試工具,所以采用交叉編譯的方式進(jìn)行軟件開(kāi)發(fā)。u所謂交叉編譯就是在一個(gè)平臺(tái)上生成可以在另一個(gè)平臺(tái)上執(zhí)行的代碼。宿主宿主機(jī)機(jī)交叉編譯6.1 嵌入式Linux開(kāi)發(fā)環(huán)境宿主機(jī)通過(guò)串口與開(kāi)發(fā)板連接6.1 嵌入式Linux開(kāi)發(fā)環(huán)境開(kāi)發(fā)板與主機(jī)網(wǎng)線連接6.1 嵌入式Linux開(kāi)發(fā)環(huán)境6.1.1 交叉編譯工具介紹非洲牛羚技術(shù)、法律以及財(cái)政支持6.1 嵌入式Linux開(kāi)發(fā)環(huán)境6.1.1 交叉編譯工具介紹1.GNU binutils是一組二進(jìn)制工具集。包括:addr2line、ar、gprof、nm、objcopy、objdump、ranlib、siz

9、e、strings、strip等程序。(1)GNU 匯編器as用來(lái)將匯編語(yǔ)言編寫的源程序轉(zhuǎn)換成二進(jìn)制形式的目標(biāo)代碼,形式.o文件。(2)GNU鏈接器ld(3)GNU庫(kù)管理器ar6.1 嵌入式Linux開(kāi)發(fā)環(huán)境6.1.1 交叉編譯工具介紹2.gcc編譯器(1)gcc編譯器是基于命令行的。(2)gcc基本用法 gcc options filenames(3)gcc選項(xiàng)6.1 嵌入式Linux開(kāi)發(fā)環(huán)境gcc 編譯器常用的命令行參數(shù)一覽編譯器常用的命令行參數(shù)一覽序號(hào)gcc命令參數(shù)作用1gcc -E source_file.c-E,只執(zhí)行到預(yù)編譯。直接輸出預(yù)編譯結(jié)果。2 gcc -S source_fi

10、le.c-S,只執(zhí)行到源代碼到匯編代碼的轉(zhuǎn)換,輸出匯編代碼。3gcc -c source_file.c-c,只執(zhí)行到編譯,輸出目標(biāo)文件。4gcc -g source_file.c 生成供調(diào)試用的可執(zhí)行文件,可以在gdb中運(yùn)行。5 gcc -O source_file.c-O(大寫的字母O),編譯器對(duì)代碼進(jìn)行自動(dòng)優(yōu)化編譯,輸出效率更高的可執(zhí)行文件。6 gcc -Wall source_file.c-W,在編譯中開(kāi)啟一些額外的警告(warning)信息。-Wall,將所有的警告信息全開(kāi)。6.1 嵌入式Linux開(kāi)發(fā)環(huán)境(4)函數(shù)庫(kù)和包含文件 如果需要鏈接不在標(biāo)準(zhǔn)目錄下的函數(shù)庫(kù)或包含文件,可以使用-

11、L dirname和-Idirname選項(xiàng)指定文件所在的目錄,來(lái)確保該目錄的搜索順序在標(biāo)準(zhǔn)目錄之前。(5)gcc執(zhí)行過(guò)程 用GCC 編譯程序生成可執(zhí)行文件有時(shí)候看起來(lái)似乎僅通過(guò)編譯一步就完成了,但事實(shí)上要經(jīng)過(guò)下面的幾個(gè)過(guò)程:6.1 嵌入式Linux開(kāi)發(fā)環(huán)境 預(yù)處理(Pre-Processing)GCC首先調(diào)用cpp命令進(jìn)行預(yù)處理,主要實(shí)現(xiàn)對(duì)源代碼編譯前的預(yù)處理,比如將源代碼中指定的頭文件包含進(jìn)來(lái)。 編譯(Compiling)接著調(diào)用cc1命令進(jìn)行編譯,作為整個(gè)編譯過(guò)程的一個(gè)中間步驟,該過(guò)程會(huì)將源代碼翻譯生成匯編代碼。 匯編(Assembling)匯編過(guò)程是針對(duì)匯編語(yǔ)言的步驟,調(diào)用as 命令進(jìn)行

12、工作,生成擴(kuò)展名為.o 的目標(biāo)文件。 鏈接(Linking)最后調(diào)用鏈接器ld來(lái)完成鏈接。6.1 嵌入式Linux開(kāi)發(fā)環(huán)境 案例分析(P147) 程序清單6.1 hello.c #include int main() printf(“hello world!n”); #gcc o hello hello.c#./hello輸出:hello world!6.1 嵌入式Linux開(kāi)發(fā)環(huán)境3.make命令和Makefile文件(1)make存在的原因:都是源文件太多惹得禍。(2)解決問(wèn)題:l 可以將大型的開(kāi)發(fā)項(xiàng)目分解成為多個(gè)更易于管理的模塊,對(duì)于一個(gè)包括幾百個(gè)源文件的應(yīng)用程序,使用make工具和ma

13、kefile文件就可以簡(jiǎn)潔明快地理順各個(gè)源文件之間紛繁復(fù)雜的相互關(guān)系。l 如此多的源文件,如果每次都要鍵入gcc命令進(jìn)行編譯的話,那對(duì)程序員來(lái)說(shuō)簡(jiǎn)直就是一場(chǎng)災(zāi)難。而make工具則可自動(dòng)完成編譯工作,并且可以只對(duì)程序員在上次編譯后修改過(guò)的部分進(jìn)行編譯。6.1 嵌入式Linux開(kāi)發(fā)環(huán)境(3)make參數(shù)uk: 如果使用該選項(xiàng),即使make程序遇到錯(cuò)誤也會(huì)繼續(xù)向下運(yùn)行;如果沒(méi)有該選項(xiàng),在遇到第一個(gè)錯(cuò)誤時(shí)make程序馬上就會(huì)停止,那么后面的錯(cuò)誤情況就不得而知了。我們可以利用這個(gè)選項(xiàng)來(lái)查出所有有編譯問(wèn)題的源文件。uf : 指定作為makefile的文件的名稱。6.1 嵌入式Linux開(kāi)發(fā)環(huán)境(3)Mak

14、efile文件u語(yǔ)法規(guī)則:文件中需要說(shuō)明如何編譯各個(gè)源文件并連接生成可執(zhí)行文件,并要求定義源文件之間的依賴關(guān)系。u命名規(guī)則:Makefile或者makefile或者make f filename u基本結(jié)構(gòu): target : dependencies commandtarget是目標(biāo)文件,可以是Object File,也可以是執(zhí)行文件。dependencies:規(guī)定了最終得到的應(yīng)用程序跟生成它的各個(gè)源文件之間的關(guān)系。command也就是make需要執(zhí)行的命令。說(shuō)明:command必須以Tab鍵開(kāi)頭。6.1 嵌入式Linux開(kāi)發(fā)環(huán)境案例分析6-2:main: main.o f1.o f2.om

15、ain.o: main.c def1.hf1.o: f1.c def1.h def2.hf2.o: f2.c def2.h def3.h上面的各個(gè)源文件跟各模塊之間的關(guān)系具有一個(gè)明顯的層次結(jié)構(gòu),如果def2.h發(fā)生了變化,那么就需要更新f1.o和f2.o,而f1.o和f2.o發(fā)生了變化的話,那么main也需要隨之重新構(gòu)建。6.1 嵌入式Linux開(kāi)發(fā)環(huán)境main: main.o f1.o f2.ogcc -o main main.o f1.o f2.omain.o: main.c def1.hgcc -c main.cf1.o: f1.c def1.h def2.hgcc -c f1.cf2.

16、o: f2.c def2.h def3.hgcc -c f2.cclean:-rm f main.o f1.o f2.o#include #include “def1.h”extern void function2();extern void function3();int main()function2();function3();exit (EXIT_SUCCESS);/* f1.c */#include “def1.h”#include “def2.h”void function2() /* f2.c */#include “def2.h”#include “def3.h”void fu

17、nction3()6.1 嵌入式Linux開(kāi)發(fā)環(huán)境默認(rèn)時(shí),make程序只更新makefile中的第一個(gè)目標(biāo),如果希望更新多個(gè)目標(biāo)文件的話,可以使用一個(gè)特殊的目標(biāo)all,假如我們想在一個(gè)makefile中更新main和hello這兩個(gè)程序文件的話,可以加入下列語(yǔ)句達(dá)到這個(gè)目的:all: main hello6.1 嵌入式Linux開(kāi)發(fā)環(huán)境(4)makefile中變量 Makefile中允許使用簡(jiǎn)單的宏指代源文件及其相關(guān)編譯信息,在Linux中也稱為宏變量。在引用宏時(shí)只需在變量前加$符號(hào),在引用時(shí)就必須加圓括號(hào)()。$? 依賴的文件的修改日期比目標(biāo)文件的創(chuàng)建日期晚。$ 目標(biāo)的完整名稱。$ 第一個(gè)依

18、賴文件的名稱。$* 不包含擴(kuò)展名的目標(biāo)文件名稱。6.1 嵌入式Linux開(kāi)發(fā)環(huán)境4.glibc庫(kù) 提供系統(tǒng)調(diào)用和基本函數(shù)的C庫(kù),可以通過(guò)rpm -qa | grep glibc查看系統(tǒng)目前安裝了哪些和glibc有關(guān)的包。5.gdb調(diào)試工具(1)功能:調(diào)試C或C+程序的調(diào)試器,監(jiān)視程序中變量的值,設(shè)置斷點(diǎn)以使程序在指定的代碼行上停止執(zhí)行,支持單步執(zhí)行等。(2)應(yīng)用u gcc g -o file file.cu 輸入gdbu File-裝載想要調(diào)試的可執(zhí)行文件6.1 嵌入式Linux開(kāi)發(fā)環(huán)境6.1.2 嵌入式linux開(kāi)發(fā)環(huán)境建議的流程:1.建立主機(jī)開(kāi)發(fā)環(huán)境2.配置minicom3.配置NFS服務(wù)

19、4.編譯嵌入式linux系統(tǒng)內(nèi)核5.文件系統(tǒng)的制作6.嵌入式系統(tǒng)開(kāi)發(fā)板的燒寫安裝開(kāi)發(fā)環(huán)境配置交叉編譯環(huán)境修改profile文件6.1 嵌入式Linux開(kāi)發(fā)環(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)核5.文件系統(tǒng)的制作6.嵌入式系統(tǒng)開(kāi)發(fā)板的燒寫Com口連線配置minicom參數(shù)6.1 嵌入式Linux開(kāi)發(fā)環(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)核5.文件系統(tǒng)的制作6.嵌入式系統(tǒng)開(kāi)發(fā)板的燒寫設(shè)置NF

20、S服務(wù)指定NFS服務(wù)的用戶掛載文件6.1 嵌入式Linux開(kāi)發(fā)環(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)核5.文件系統(tǒng)的制作6.嵌入式系統(tǒng)開(kāi)發(fā)板的燒寫內(nèi)核配置建立依存關(guān)系建立內(nèi)核6.1 嵌入式Linux開(kāi)發(fā)環(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)核5.文件系統(tǒng)的制作6.嵌入式系統(tǒng)開(kāi)發(fā)板的燒寫cramfs 文件系統(tǒng)只讀文件系統(tǒng), 用到mkcramfs制作工具:# ./mkcramfs root c

21、amare_rootfs.cramfsjffs2是一種可讀/寫的文件系統(tǒng),制作工具叫做mkfs.jffs2:# ./mkfs.jffs2 -r rootfs -o xscale_fs.jffs2 -e 0 x40000 -p=0 x010000006.1 嵌入式Linux開(kāi)發(fā)環(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)核5.文件系統(tǒng)的制作6.嵌入式系統(tǒng)開(kāi)發(fā)板的燒寫燒寫bootloader燒寫內(nèi)核zImage到FlashFlash分區(qū)燒寫文件系統(tǒng)root6.1.2 6.1.2 交叉編譯環(huán)境的建立交叉

22、編譯環(huán)境的建立l 在建立交叉編譯環(huán)境之前,當(dāng)然首先要在一臺(tái)PC機(jī)(宿主機(jī))上安裝Linux操作系統(tǒng)。一般情況下用定制方式進(jìn)行完全安裝,即在選擇軟件包(Package)時(shí)選擇最后一項(xiàng)完全安裝(everything)。然后再配置好網(wǎng)絡(luò)、TFTP服務(wù)(為下載燒寫所用)和NFS服務(wù)(為交叉開(kāi)發(fā)時(shí)mount所用)。6.1.2 交叉編譯環(huán)境的建立l 匹配Binutils、gcc和glibc的版本工具鏈版本Linux 2.4.xLinux 2.6.xbinutils2.142.14gcc.2glibc.5glibc-threads.5gdb5.36.0ARM

23、V4T平臺(tái)工具鏈常用版本 6.1.2 交叉編譯環(huán)境的建立l 構(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ā)平臺(tái)供應(yīng)商提供的開(kāi)發(fā)環(huán)境安裝套件建立交叉編譯環(huán)境,這是最常用的方法。 6.1.2 交叉編譯環(huán)境的建立1. 分步建立交叉編譯環(huán)境編譯工具鏈流程圖6.1.2 交叉編譯環(huán)境的建立建立交叉編譯環(huán)境可以分為5個(gè)步驟:做好準(zhǔn)備工作:下載工具源碼包和補(bǔ)丁,準(zhǔn)備內(nèi)核頭文件,創(chuàng)建工作目錄等;編譯、安裝Binutils;編譯輔助編譯器(bootstrap gcc)

24、;建立glibc庫(kù),這里要使用交叉編譯工具鏈,例如arm-linux-gcc等;編譯生成完整的編譯器(full gcc),重新配置gcc功能,使其支持C、C+等語(yǔ)言。 6.1.2 交叉編譯環(huán)境的建立2. 制作交叉調(diào)試器(1)編譯交叉調(diào)試器 對(duì)于交叉調(diào)試器,并不是工具鏈必需的工具,但是它是與工具鏈配套使用的。GDB的調(diào)試能力和BUG的修正也因?yàn)榘姹镜牟煌煌#?)編譯gdbserver 目標(biāo)板還需要gdbserver工具為目標(biāo)板交叉編譯gdbserver。 本章目錄 6.1 嵌入式Linux開(kāi)發(fā)環(huán)境 6.1.1 交叉編譯工具介紹 6.1.2 交叉編譯環(huán)境的建立 6.2 嵌入式Linux在AR

25、M平臺(tái)上的移植 6.2.1 Linux內(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) 本章目錄 6.1 嵌入式Linux開(kāi)發(fā)環(huán)境 6.1.1 交叉編譯工具介紹 6.1.2 交叉編譯環(huán)境的建立 6.2 嵌入式Linux在ARM平臺(tái)上的移植 6.2.1 Linux內(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) 6.2 嵌入式Linux在ARM平臺(tái)上的移植6.2.1 linux內(nèi)

26、核源代碼的組織l 嵌入式linux內(nè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)6.2 嵌入式Linux在ARM平臺(tá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)核不同部件與內(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ā)送和接收。6.2 嵌入式Linux在ARM平臺(tái)上的移植In

27、tel CPU及與之相兼容體系結(jié)構(gòu)的子目錄Linux內(nèi)核源代碼樹的組織針對(duì)ARM的linux有一個(gè)子目錄-arm6.2 嵌入式Linux在ARM平臺(tái)上的移植Linux內(nèi)核源代碼樹的組織說(shuō)明l /arch:目錄包括了所有和體系結(jié)構(gòu)相關(guān)的核心代碼。它下面的每一個(gè)子目錄都代表一種Linux支持的體系結(jié)構(gòu)(硬件平臺(tái),如ARM平臺(tái)相關(guān)代碼在arch/arm下),例如i386就是Intel CPU及與之相兼容體系結(jié)構(gòu)的子目錄。l /fs:目錄存放Linux支持的文件系統(tǒng)代碼和各種類型的文件操作代碼。每一個(gè)子目錄支持一個(gè)文件系統(tǒng),如ext3文件系統(tǒng)對(duì)應(yīng)的就是ext3子目錄。6.2 嵌入式Linux在ARM平

28、臺(tái)上的移植l /init:目錄包含核心的初始化代碼(不是系統(tǒng)的引導(dǎo)代碼),有main.c和Version.c兩個(gè)文件。這是研究核心如何工作的好起點(diǎn)。l ipc:目錄包含了核心進(jìn)程間的通信代碼,如信號(hào)量、消息隊(duì)列和管道等。l Kernel:內(nèi)核管理的核心代碼,此目錄下的文件實(shí)現(xiàn)了大多數(shù)linux系統(tǒng)的內(nèi)核函數(shù),其中最重要的文件當(dāng)屬sched.c;同時(shí)與處理器結(jié)構(gòu)相關(guān)代碼都放在/archlib/目錄下。6.2 嵌入式Linux在ARM平臺(tái)上的移植l /include:目錄包括編譯核心所需要的大部分頭文件,例如與平臺(tái)相關(guān)的頭文件在/include/linux子目錄下,與 intel cpu相關(guān)的頭文

29、件在/include/asm-i386子目錄下,而/include/scsi目錄則是有關(guān)scsi設(shè)備的頭文件目錄。l /lib:包含內(nèi)核要用到的一些常用函數(shù),如字符串操作函數(shù),格式化輸出函數(shù),內(nèi)存復(fù)制函數(shù)等。l /mm:目錄包含了所有獨(dú)立于 cpu 體系結(jié)構(gòu)的內(nèi)存管理代碼,如頁(yè)式存儲(chǔ)管理內(nèi)存的分配和釋放等。6.2 嵌入式Linux在ARM平臺(tái)上的移植l net:目錄里是核心的網(wǎng)絡(luò)部分代碼,實(shí)現(xiàn)了各種常見(jiàn)的網(wǎng)絡(luò)協(xié)議,其每個(gè)子目錄對(duì)應(yīng)于網(wǎng)絡(luò)的一個(gè)方面。l /drivers:目錄中是系統(tǒng)中所有的設(shè)備驅(qū)動(dòng)程序。它又進(jìn)一步劃分成幾類設(shè)備驅(qū)動(dòng),每一種有對(duì)應(yīng)的子目錄,如聲卡的驅(qū)動(dòng)對(duì)應(yīng)于/drivers/so

30、und;block 下為塊設(shè)備驅(qū)動(dòng)程序,比如ide(ide.c)6.2 嵌入式Linux在ARM平臺(tái)上的移植Linux內(nèi)核源代碼目錄結(jié)構(gòu)6.2 嵌入式Linux在ARM平臺(tái)上的移植Linux系統(tǒng)目錄本章目錄 6.1 嵌入式Linux開(kāi)發(fā)環(huán)境 6.1.1 交叉編譯工具介紹 6.1.2 交叉編譯環(huán)境的建立 6.2 嵌入式Linux在ARM平臺(tái)上的移植 6.2.1 Linux內(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) 6.2 嵌入式Linux在ARM平臺(tái)上的移植6.2.2 嵌入式lin

31、ux內(nèi)核裁剪方法l 對(duì)Linux操作系統(tǒng)的移植工作主要分為2個(gè)方面: 一方面是針對(duì)硬件特點(diǎn)對(duì)源代碼的修改,比如內(nèi)核的啟動(dòng)部分、存儲(chǔ)設(shè)備的大小、具體的驅(qū)動(dòng)問(wèn)題等; 另一方面是功能模塊的裁剪,主要是對(duì)內(nèi)核功能的配置,包括支持的文件類型、外設(shè)模塊等。 6.2 嵌入式Linux在ARM平臺(tái)上的移植1.針對(duì)硬件的修改(1)對(duì)一種全新的硬件平臺(tái)開(kāi)展移植工作時(shí),需采用“自底向上”的設(shè)計(jì)方法從頭設(shè)計(jì),即從硬件的需求考慮逐步地采用分析、設(shè)計(jì)、編碼和測(cè)試。(2)大多數(shù)情況下,是在前人工作的基礎(chǔ)上修改已有的代碼。 內(nèi)核的啟動(dòng)部分 arch目錄下相關(guān)文件 arch/arm/boot目錄 entry-armv.S文件6

32、.2 嵌入式Linux在ARM平臺(tái)上的移植2. 功能模塊的裁剪使用Linux自身的配置工具,編譯定制內(nèi)核。修改內(nèi)核源代碼,進(jìn)行內(nèi)核裁剪。基于系統(tǒng)調(diào)用關(guān)系,進(jìn)行內(nèi)核裁剪。 本章目錄 6.1 嵌入式Linux開(kāi)發(fā)環(huán)境 6.1.1 交叉編譯工具介紹 6.1.2 交叉編譯環(huán)境的建立 6.2 嵌入式Linux在ARM平臺(tái)上的移植 6.2.1 Linux內(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) 6.2 嵌入式Linux在ARM平臺(tái)上的移植6.2.3 嵌入式linux內(nèi)核定制過(guò)程使用Linu

33、x自身的配置工具編譯定制內(nèi)核,嵌入式Linux操作系統(tǒng)內(nèi)核的定制過(guò)程基本可分為4個(gè)步驟:增刪新的內(nèi)核組件配置內(nèi)核生成內(nèi)核裝載內(nèi)核6.2 嵌入式Linux在ARM平臺(tái)上的移植6.2.3 嵌入式linux內(nèi)核定制過(guò)程n 增刪新的內(nèi)核組件n 啟動(dòng)內(nèi)核配置程序 #Make menuconfig (在linux源代碼目錄下) 選擇load an Alternate configration filen 配置內(nèi)核本章目錄 6.1 嵌入式Linux開(kāi)發(fā)環(huán)境 6.1.1 交叉編譯工具介紹 6.1.2 交叉編譯環(huán)境的建立 6.2 嵌入式Linux在ARM平臺(tái)上的移植 6.2.1 Linux內(nèi)核源代碼的組織 6.

34、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) 6.2 嵌入式Linux在ARM平臺(tái)上的移植6.2.4 內(nèi)核編譯及裝載編譯內(nèi)核分以下3步進(jìn)行:(1)正確設(shè)置編譯內(nèi)核所需的附屬文件,進(jìn)行依賴性編譯: # make dep說(shuō)明:此命令會(huì)搜索內(nèi)核編譯中的依賴關(guān)系并修正內(nèi)核編譯配置。(2)清除以前構(gòu)造內(nèi)核時(shí)產(chǎn)生的所有目標(biāo)文件、模塊文件和一些臨時(shí)文件: # make clean6.2 嵌入式Linux在ARM平臺(tái)上的移植(3)生成新的可執(zhí)行內(nèi)核映像文件: # make zImage 說(shuō)明:編譯內(nèi)核并生成內(nèi)核映像文件

35、zImage。(4)裝載內(nèi)核硬件:通過(guò)串口或以太網(wǎng),將生成的內(nèi)核文件燒寫到嵌入式系統(tǒng)的flash中,啟動(dòng)運(yùn)行即可。 代碼:tftp a0500000 ramdisk.gz tftp a0008000 zImage go a00080006.2 嵌入式Linux在ARM平臺(tái)上的移植說(shuō)明:ramdisk是一個(gè)最小的linux rootfs(根文件系統(tǒng)rootfs=Root Fils System)系統(tǒng),它包含了除內(nèi)核以外的所有l(wèi)inux系統(tǒng)在引導(dǎo)和管理時(shí)需要的工具。本章目錄 6.1 嵌入式Linux開(kāi)發(fā)環(huán)境 6.1.1 交叉編譯工具介紹 6.1.2 交叉編譯環(huán)境的建立 6.2 嵌入式Linux在A

36、RM平臺(tái)上的移植 6.2.1 Linux內(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) 6.2 嵌入式Linux在ARM平臺(tá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ù)雜且又是最為基本和重要的資源。l Linux支持的文件系統(tǒng)有很多種,比如ext2、minix文件系統(tǒng)、msdos、ntfs、nfs、hpft、ncpfs、aff

37、s Amiga等。 6.2 嵌入式Linux在ARM平臺(tái)上的移植uExt2文件系統(tǒng)是Linux事實(shí)上的標(biāo)準(zhǔn)文件系統(tǒng),它已經(jīng)取代了它的前任擴(kuò)展文件系統(tǒng)(Ext)。Ext支持的文件最大為2GB,支持的最長(zhǎng)文件名為255個(gè)字符,而且它不支持索引節(jié)點(diǎn)(包括數(shù)據(jù)修改時(shí)間標(biāo)記)。uExt2文件系統(tǒng)的穩(wěn)定性、可靠性和健壯性,所以幾乎在所有基于Linux的系統(tǒng)(包括臺(tái)式機(jī)、服務(wù)器、工作站甚至一些嵌入式設(shè)備)上都使用Ext2文件系統(tǒng)。 6.2 嵌入式Linux在ARM平臺(tái)上的移植Linux下常用文件系統(tǒng)結(jié)構(gòu)6.2 嵌入式Linux在ARM平臺(tái)上的移植6.2.5 文件系統(tǒng)及其實(shí)現(xiàn)2. 常用的嵌入式文件系統(tǒng) 常用的

38、文件系統(tǒng)基于不同的存儲(chǔ)設(shè)備可分為3類:基于Flash的文件系統(tǒng):JFFS2,yaffs,cramfs,romfs等;基于RAM的文件系統(tǒng):Ramdisk,ramfs/tmpfs等;網(wǎng)絡(luò)文件系統(tǒng)NFS。6.2 嵌入式Linux在ARM平臺(tái)上的移植(1)JFFS2 JFFS2的全名為Journalling Flash File System Version 2(閃存日志型文件系統(tǒng)第2版)JFFS2文件系統(tǒng)是日志結(jié)構(gòu)化的 JFFS2在扇區(qū)級(jí)別上執(zhí)行Flash擦除、寫、讀操作要比ext2文件系統(tǒng)好。 JFFS2提供了比ext2更好的崩潰、掉電安全保護(hù)。 JFFS2是專門為Flash芯片及其類似嵌入式設(shè)備創(chuàng)建的 。6.2 嵌

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論