版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、1嵌入式系統(tǒng)嵌入式系統(tǒng)第第5 5課課 嵌入式軟件開發(fā)基礎(chǔ)嵌入式軟件開發(fā)基礎(chǔ)謝謝 斌斌 中南大學(xué)信息科學(xué)與工程學(xué)院中南大學(xué)信息科學(xué)與工程學(xué)院20102010年年1212月月21.ARM處理器尋址方式2.ARM指令格式3.ARM指令的條件碼4.存儲(chǔ)器訪問指令5.數(shù)據(jù)處理指令 6.乘法指令 7.ARM分支指令 8.協(xié)處理器指令 9.雜項(xiàng)指令10.偽指令11.Thumb指令集回顧回顧3課前提問課前提問1.1.嵌入式軟件開發(fā)的主要步驟嵌入式軟件開發(fā)的主要步驟有哪些?有哪些?2. 嵌入式開發(fā)常用的調(diào)試方式有哪些?嵌入式開發(fā)常用的調(diào)試方式有哪些?3. Bootloader程序框架結(jié)構(gòu)和各部分完成的任務(wù)?程序
2、框架結(jié)構(gòu)和各部分完成的任務(wù)?4. 將將Linux內(nèi)核移植到一種新處理器的主要工作??jī)?nèi)核移植到一種新處理器的主要工作?5. Linux驅(qū)動(dòng)程序的分類及相關(guān)程序結(jié)構(gòu)?驅(qū)動(dòng)程序的分類及相關(guān)程序結(jié)構(gòu)?4提綱提綱 嵌入式軟件開發(fā)基礎(chǔ)嵌入式軟件開發(fā)基礎(chǔ) 嵌入式嵌入式Linux開發(fā)環(huán)境開發(fā)環(huán)境 構(gòu)建嵌入式構(gòu)建嵌入式Linux系統(tǒng)系統(tǒng) 嵌入式嵌入式Linux系統(tǒng)移植系統(tǒng)移植 嵌入式嵌入式Linux驅(qū)動(dòng)開發(fā)驅(qū)動(dòng)開發(fā)55.1 嵌入式軟件開發(fā)基礎(chǔ) 嵌入式軟件開發(fā)語言嵌入式軟件開發(fā)流程調(diào)試工具和方法C語言程序的結(jié)構(gòu)仿真環(huán)境65.1.1 嵌入式軟件開發(fā)語言p匯編(與體系結(jié)構(gòu)相關(guān))pC語言(最常用語言)語言(最常用語言)
3、pC+語言(面向?qū)ο螅珻語言的擴(kuò)展)pJAVA(面向?qū)ο?,可移植性?qiáng))p腳本語言(不需要編譯)系統(tǒng)級(jí)開發(fā)系統(tǒng)級(jí)開發(fā)應(yīng)用級(jí)開發(fā)應(yīng)用級(jí)開發(fā)75.1.2 嵌入式軟件開發(fā)流程pC語言程序的生成分成編譯、匯編、鏈接編譯、匯編、鏈接等幾個(gè)步驟。最終的目標(biāo)的文件的主要部分是處理器可執(zhí)行的機(jī)器代碼組合。根據(jù)系統(tǒng)的不同,目標(biāo)文件可能除了可執(zhí)行的二進(jìn)制代碼部分外,還包括一定的頭。8ARM程序的生成流程編譯(Compile)是指從高級(jí)語言高級(jí)語言轉(zhuǎn)換成匯編語言匯編語言的過程。從本質(zhì)上編譯是一個(gè)文本轉(zhuǎn)換的過程(從文本文件到文本文件)。編譯包含了C語言的語法解析語法解析和生成匯編語言生成匯編語言兩個(gè)步驟。匯編(Asse
4、mble)是指從匯編語言匯編語言程序生成目標(biāo)系統(tǒng)的二進(jìn)制代碼(機(jī)器代碼機(jī)器代碼)的過程。相對(duì)于編譯過程的語法解析,匯編的過程相對(duì)簡(jiǎn)單。這是因?yàn)閷?duì)于一款特定的處理器,其匯編語言和二進(jìn)制的機(jī)器代碼是一一對(duì)應(yīng)的。鏈接(Link)過程將匯編成的多個(gè)機(jī)器代碼多個(gè)機(jī)器代碼組合成一個(gè)可執(zhí)行程一個(gè)可執(zhí)行程序序。一般來說,通過編譯和匯編過程,每一個(gè)源文件將生成一個(gè)目標(biāo)文件。鏈接器的作用就是將這些目標(biāo)文件組合,組合的過程包括了代碼段、數(shù)據(jù)段等部分的合并,以及添加相應(yīng)的文件頭。9嵌入式調(diào)試的特點(diǎn)特點(diǎn):在嵌入式系統(tǒng)中,調(diào)試的概念相對(duì)復(fù)雜。對(duì)于其調(diào)試過程,程序主體運(yùn)行在目標(biāo)機(jī)上,主機(jī)所起的作用是獲得程序運(yùn)行中的信息,并
5、通過人工或者程序的方式分析這些信息。因此嵌入式調(diào)試的基礎(chǔ)是需要一條從主機(jī)到目標(biāo)機(jī)的通訊通道。5.1.3 調(diào)試工具和方法105.1.3 調(diào)試工具和方法嵌入式開發(fā)常用的調(diào)試方式:p打印調(diào)試信息pJTAG調(diào)試p遠(yuǎn)程gdb調(diào)試打印調(diào)試信息是最基本的調(diào)試方式, 實(shí)現(xiàn)了類似printf()的標(biāo)準(zhǔn)輸出,在嵌入式系統(tǒng)中,這種輸出的通訊通道可能是串口或者網(wǎng)絡(luò)協(xié)議。在某些系統(tǒng)中,沒有實(shí)現(xiàn)標(biāo)準(zhǔn)輸出,這就需要開發(fā)者自己開發(fā)調(diào)試手段。JTAG是Joint Test Action Group的簡(jiǎn)稱。JTAG使用邊界掃描(Boundary-Scan)的方式調(diào)試:在靠近芯片的輸入輸出管腳上增加一個(gè)移位寄存器單元,通過這些寄存
6、器單元實(shí)現(xiàn)對(duì)芯片輸入輸出信號(hào)的觀察和控制。在遠(yuǎn)程GDB調(diào)試中,調(diào)試器是運(yùn)行在主機(jī)(host,桌面電腦)的應(yīng)用程序, 被調(diào)試的程序是運(yùn)行在目標(biāo)(target)上。在遠(yuǎn)程GDB調(diào)試中,目標(biāo)機(jī)運(yùn)行GDB服務(wù)器(Server),GDB服務(wù)器通過通信協(xié)議將被調(diào)試程序的運(yùn)行信息發(fā)送至主機(jī),在主機(jī)方面對(duì)調(diào)試信息進(jìn)行分析并控制程序的運(yùn)行。115.1.4 C語言程序的結(jié)構(gòu)pC語言目標(biāo)文件中的段p目標(biāo)文件各段的鏈接pC語言程序的執(zhí)行12C語言目標(biāo)文件中的段C語言在編譯過程中,編譯系統(tǒng)會(huì)將每一個(gè)C語言源文件經(jīng)過編譯和匯編,生成一個(gè)目標(biāo)文件(一般以 .o 為擴(kuò)展名)。目標(biāo)文件的主體部分是由C語言各種語法生成的各段。1
7、3目標(biāo)文件各段的鏈接 可執(zhí)行文件其主體部分依然是代碼段(Code)、只讀數(shù)據(jù)段(RO Data)、讀寫數(shù)據(jù)段(RW Data)三個(gè)段,這三個(gè)段由各個(gè)目標(biāo)文件(.o)經(jīng)過“組合”而成。14C語言程序的執(zhí)行這種方式一般適合于有操作系統(tǒng)的情況,操作系統(tǒng)根據(jù)可執(zhí)行文件中的信息,完成各段內(nèi)存的加載和未初始化數(shù)據(jù)段的開辟。15C語言程序的執(zhí)行嵌入式系統(tǒng)中,程序放置的位置本身可以運(yùn)行程序(如NOR FLASH),可以直接將指針置于程序放置的Code地址處,直接運(yùn)行程序。165.1.5 仿真環(huán)境p最理想的開發(fā)方式還是脫離目標(biāo)機(jī)的開發(fā)。程序的大部分代碼將在主機(jī)上調(diào)試通過,然后再目標(biāo)機(jī)環(huán)境完成適應(yīng)性配置。嵌入式系
8、統(tǒng)使用主機(jī)調(diào)試目標(biāo)機(jī)的程序主要有以下兩種方式:p源代碼編譯成主機(jī)程序 p主機(jī)運(yùn)行目標(biāo)機(jī)代碼 17源代碼編譯成主機(jī)程序 本質(zhì)是一套代碼編譯兩次,調(diào)試階段編譯成在主機(jī)(x86)運(yùn)行的代碼,真正使用的時(shí)候再編譯成目標(biāo)機(jī)的代碼。18主機(jī)運(yùn)行目標(biāo)機(jī)代碼 本質(zhì)是在主機(jī)上使用指令仿真器運(yùn)行目標(biāo)機(jī)的二進(jìn)制代碼。優(yōu)點(diǎn)是可以更逼真地運(yùn)行目標(biāo)機(jī)的代碼;缺點(diǎn)是需要指令集模擬器的支持,并可能消耗主機(jī)較大的資源。19提綱提綱 嵌入式軟件開發(fā)基礎(chǔ)嵌入式軟件開發(fā)基礎(chǔ) 嵌入式嵌入式Linux開發(fā)環(huán)境開發(fā)環(huán)境 構(gòu)建嵌入式構(gòu)建嵌入式Linux系統(tǒng)系統(tǒng) 嵌入式嵌入式Linux系統(tǒng)移植系統(tǒng)移植 嵌入式嵌入式Linux驅(qū)動(dòng)開發(fā)驅(qū)動(dòng)開發(fā)2
9、05.2 嵌入式Linux開發(fā)環(huán)境GNU Tools項(xiàng)目管理調(diào)試器215.2.1 GNU ToolspGNU Tools綜述pGCC 編譯與鏈接pC語言庫22GNU Tools綜述 GNU Tools是Linux環(huán)境下的開發(fā)工具,用于代碼的生成。GNU Tools的重要組成部分是GCC。GCC 是GNU Compiler Collection 的縮寫,是一個(gè)非常優(yōu)秀的跨平臺(tái)編譯器集合,支持x86、ARM、MIPS 和PowerPC 等多種目標(biāo)平臺(tái),支持C、C+、Java、ADA、Fortran 和Pascal 等多種高級(jí)語言。 GCC完成從C、C+等源文件向運(yùn)行在特定CPU硬件上的目標(biāo)代碼的轉(zhuǎn)
10、換。對(duì)于通用計(jì)算機(jī),一般使用GCC生成x86的可執(zhí)行代碼;對(duì)于嵌入式開發(fā)系統(tǒng),使用交叉編譯的GCC,生成目標(biāo)機(jī)可以執(zhí)行的程序。23GCC默認(rèn)處理的文件文件類型擴(kuò)展名文件說明文本文件* *.c .c C語言源文件* *.C / .C / * *.cxx / .cxx / * *.cc.ccC+語言源文件* *.i.i預(yù)處理后的C語言源文件* *.ii.ii預(yù)處理后的C+語言源文件* *.s .s * *.S.S匯編語言* *.h.h頭文件二進(jìn)制文件.o.o目標(biāo)文件.so.so動(dòng)態(tài)庫.a.a靜態(tài)庫24Binutils工具集合工具名稱工具名稱說明說明asGNU匯編器。用以將處理器的匯編代碼轉(zhuǎn)換成可執(zhí)
11、行代碼,并存儲(chǔ)到目標(biāo)文件.o文件中l(wèi)dGNU鏈接器。用于將一個(gè)或多個(gè)目標(biāo)文件.o、庫組合成一個(gè)可執(zhí)行程序;或者生成靜態(tài)庫和動(dòng)態(tài)庫。ar歸檔工具,可以將多個(gè)文件組合成一個(gè)大文件,并且可以讀取原始文件的內(nèi)容。stripe去除文件中的符號(hào)nm用以顯示目標(biāo)文件中的符號(hào)objectcopy轉(zhuǎn)換二進(jìn)制代碼的工具objdump顯示目標(biāo)文件的反匯編工具readelf顯示ELF文件中的各種信息string顯示文件中的可打印字符ranlib產(chǎn)生歸檔文件的系引,并將其保存到歸檔文件中,系引同時(shí)列出歸檔文件各成員所定義的可重分配目標(biāo)文件。addr2line可以將一個(gè)可執(zhí)行程序的地址映射到源文件的對(duì)應(yīng)行。Gprof顯示
12、程序調(diào)用段的各種數(shù)據(jù)25GCC對(duì)C語言程序的處理p 預(yù)處理預(yù)處理p 編譯編譯 p 匯編匯編p 鏈接鏈接26GCC 編譯與鏈接# gcc hello.c -o hello# ./helloHello world!預(yù)處理# gcc -E hello.c -o hello.i編譯和匯編# gcc -c hello.i -o hello.o鏈接# gcc hello.o -o hello一步完成:一步完成:分步完成:分步完成:/* hello.c */#include int main(void) printf (Hello world!n ); return 0;27GCC 編譯與鏈接一步完成:一步
13、完成:# gcc foo1.c foo2.c -o foo源程序:源程序: foo1.c foo2.c多步完成:多步完成:# gcc -c foo1.c -o foo1.o# gcc -c foo2.c -o foo2.o# gcc foo1.o foo2.o -o foo28C語言庫 在嵌入式程序的C語言程序的開發(fā)中,C語言庫是應(yīng)用程序所依賴的基礎(chǔ)。在C語言庫中,提供一些C語言中程序運(yùn)行的基礎(chǔ),包括標(biāo)準(zhǔn)的庫函數(shù),如:printf、malloc、字符串處理等基本函數(shù)操作。 常用的c函數(shù)庫:glibc, Clibc, newlib 295.2.2 項(xiàng)目管理p工程管理工具M(jìn)ake與Makefile
14、pMakefile是一個(gè)決定怎樣編譯工程的文本文件,按照一定的規(guī)則書寫。在工程更新的時(shí)候,使用GNU的make工具根據(jù)當(dāng)前的Makefile進(jìn)行工程編譯。p版本控制30工程管理工具M(jìn)ake與Makefile/* main.c */#include hello.hint main (int argc,char* argv) hello(argc,argv); return 0;/* hello.c */#include int hello(int argc,char* argv) int i; printf (Hello world!n); for(i = 0;i argc; i+) print
15、f(argv%d = %sn,i,argvi); return 0;/* hello.h */int hello(int argc,char* argv);31工程管理工具M(jìn)ake與Makefile# MakefileCC:= gccHEAD:= hello.hSRC:= hello.c main.c OBJS:= hello.o main.oTT:= helloINC = .CFLAGS = -pipe -w -I$(INC)LDFLAGS = -Wallall:$(TT)$(TT):$(OBJS)$(CC) $(LDFLAGS) $(OBJS) -o $%.o:%c$(CC) $(CFLA
16、GS) -c $ -o $ clean:rm -f *.o $(TT)325.2.2 項(xiàng)目管理p工程管理工具M(jìn)ake與MakefilepMakefile是一個(gè)決定怎樣編譯工程的文本文件,按照一定的規(guī)則書寫。在工程更新的時(shí)候,使用GNU的make工具根據(jù)當(dāng)前的Makefile進(jìn)行工程編譯。p版本控制p記錄每次修改的地方,并且可以讓使用者方便地存取各個(gè)版本、比較版本差異。更進(jìn)一步,是建立一個(gè)多人開發(fā)的環(huán)境,可以記錄每個(gè)人的修改,解決版本沖突的問題。33版本控制 CVS是一種廣泛應(yīng)用的、開源的、透明于網(wǎng)絡(luò)的版本控制系統(tǒng)。CVS支持程序代碼版本的儲(chǔ)存與維護(hù)、程序代碼版本的追蹤回溯、支持多人合作開發(fā)項(xiàng)目
17、等。不過這個(gè)廣為使用的版本控制工具還有不少問題,包括中文支持和二進(jìn)制文件的處理都有或多或少的問題。SVN的出現(xiàn)改變了這一現(xiàn)狀。 SVN保留大多數(shù)CVS 特性,而且進(jìn)一步支持更多的特性,包括版本化管理目錄、重命名和文件meta-data、提交是真實(shí)的原子操作、可以通過WebDAV/DeltaV協(xié)議進(jìn)行訪問、可以選擇獨(dú)立服務(wù)器模式、分支和標(biāo)簽是代價(jià)低廉(固定不變的)的操作、高效處理二進(jìn)制文件等。345.2.3 調(diào)試器pGDB調(diào)試可以直接在嵌入式系統(tǒng)中使用,此時(shí)主機(jī)在調(diào)試系統(tǒng)中的作用僅僅是顯示的終端。由于嵌入式系統(tǒng)與PC相比性能普遍較低,因此在嵌入式Linux中直接調(diào)試可能造成性能下降。p嵌入式系統(tǒng)
18、的遠(yuǎn)程GDB調(diào)試的原理是在目標(biāo)機(jī)上運(yùn)行GDB server,而在主機(jī)上運(yùn)行GDB,二者通過某種協(xié)議進(jìn)行連接。這樣做的好處是將GDB調(diào)試系統(tǒng)的某部分工作移到主機(jī)上,由此可以節(jié)省目標(biāo)機(jī)的部分資源。35GDB調(diào)試基礎(chǔ) GDB是一個(gè)強(qiáng)大的命令行調(diào)試工具。命令行的強(qiáng)大就是在于其可以形成執(zhí)行序列,形成腳本。UNIX下的軟件全是命令行的,這給程序開發(fā)提代供了極大的便利,命令行軟件的優(yōu)勢(shì)在于,它們可以非常容易的集成在一起,使用幾個(gè)簡(jiǎn)單的已有工具的命令,就可以做出一個(gè)非常強(qiáng)大的功能。要使用GDB調(diào)試,需在Makefile的編譯和鏈接選項(xiàng)中增加 g 提供GDB所需要的信息。調(diào)試方法:# gdb hello使用gd
19、b啟動(dòng)被調(diào)試的程序。36GDB調(diào)試基礎(chǔ) GDB調(diào)試主要使用的語法為:break 在程序中設(shè)置端點(diǎn) clear 清除所有的已定義的停止點(diǎn)。info 顯示相關(guān)的信息,如地址、寄存器、棧信息、輸入?yún)?shù)等next 執(zhí)行下一行,但是不進(jìn)入函數(shù),相當(dāng)于step overstep 執(zhí)行下一行,進(jìn)入函數(shù),相當(dāng)于step inrun 執(zhí)行當(dāng)前調(diào)試的程序,可以加參數(shù)quit 退出GDB37提綱提綱 嵌入式軟件開發(fā)基礎(chǔ)嵌入式軟件開發(fā)基礎(chǔ) 嵌入式嵌入式Linux開發(fā)環(huán)境開發(fā)環(huán)境 構(gòu)建嵌入式構(gòu)建嵌入式Linux系統(tǒng)系統(tǒng) 嵌入式嵌入式Linux系統(tǒng)移植系統(tǒng)移植 嵌入式嵌入式Linux驅(qū)動(dòng)開發(fā)驅(qū)動(dòng)開發(fā)385.3 構(gòu)建嵌入式
20、Linux系統(tǒng)5.3.1 嵌入式Linux系統(tǒng)的構(gòu)建流程5.3.2 Bootloader5.3.3 Linux內(nèi)核5.3.4 根文件系統(tǒng)39 嵌入式Linux一般來說由以下三個(gè)部分組成:Bootloader(引導(dǎo)加載器)內(nèi)核根文件系統(tǒng)5.3.1 嵌入式Linux系統(tǒng)的構(gòu)建流程系統(tǒng)的引導(dǎo)程序,最基本功能是加載linux內(nèi)核并運(yùn)行。經(jīng)過編譯生成的一段可執(zhí)行程序。內(nèi)核運(yùn)行時(shí)可能需要從外部獲取啟動(dòng)參數(shù)(由Bootloader提供)。Linux內(nèi)核啟動(dòng)后首先加載的文件系統(tǒng),但不是Linux系統(tǒng)運(yùn)行所必需的。40嵌入式Linux的構(gòu)建 在嵌入式Linux的構(gòu)建中,Bootloader和Linux內(nèi)核內(nèi)核一
21、般都有相對(duì)成熟的代碼。主要的工作有兩步:第一步是根據(jù)本系統(tǒng)硬件平臺(tái)硬件平臺(tái)的狀況進(jìn)行移植移植;第二步是采取交叉編譯交叉編譯對(duì)源代碼進(jìn)行編譯,形成運(yùn)行時(shí)需要的映像(映像(Image)文件)文件。41嵌入式Linux的構(gòu)建Bootloader的移植的移植42嵌入式Linux的構(gòu)建 Linux內(nèi)核的移植內(nèi)核的移植43嵌入式Linux的構(gòu)建Linux內(nèi)核的啟動(dòng)并不依賴于根文件系統(tǒng)(rootfs),但是要保證Linux內(nèi)核的正常運(yùn)作,還是需要根文件系統(tǒng)根文件系統(tǒng)的支持。在構(gòu)建系統(tǒng)的過程中需要為系統(tǒng)生成根文件系統(tǒng)的映像文件,讓Linux內(nèi)核在啟動(dòng)的時(shí)候掛接掛接(mount)根文件系統(tǒng)。44pBootloa
22、der的作用 5.3.2 Bootloader Bootloader是系統(tǒng)啟動(dòng)后首先運(yùn)行的程序,對(duì)于嵌入式linux操作系統(tǒng)的Bootloader,其最基本的功能是加載linux的內(nèi)核并運(yùn)行。 Bootloader一般還具有以下的功能:p 通訊功能(串口、網(wǎng)絡(luò)、USB)p FLASH相關(guān)功能(燒寫FLASH,程序固化)p 用戶接口功能45p嵌入式linux的引導(dǎo)方式5.3.2 Bootloader啟動(dòng)加載(Bootloader)模式: 也稱為“自主”(Autonomous)模式。在這種情況下,Bootloader 從目標(biāo)機(jī)上的某個(gè)固態(tài)存儲(chǔ)設(shè)備上將操作系統(tǒng)加載到 RAM 中運(yùn)行,整個(gè)過程并沒有并
23、沒有用戶的介入用戶的介入。下載(Downloading)模式: 目標(biāo)機(jī)上的 Bootloader 通過串口連接或網(wǎng)絡(luò)連接等通信手段從主機(jī)(Host)下載文件。該模式通常用于嵌入式產(chǎn)品的設(shè)計(jì)、調(diào)試設(shè)計(jì)、調(diào)試階段。 46pLinux內(nèi)核配置和編譯的流程pLinux內(nèi)核配置pLinux內(nèi)核的編譯 Linux內(nèi)核是指Linux源代碼經(jīng)過編譯和鏈接生成的映像文件(Image),它存在壓縮和非壓縮兩種形式。本質(zhì)上映像文件是一個(gè)可執(zhí)行程序映像文件是一個(gè)可執(zhí)行程序,由Bootloader加載運(yùn)行。5.3.3 Linux內(nèi)核47Linux內(nèi)核配置和編譯的流程 Linux內(nèi)核從配置到安裝大致有如下步驟:p配置內(nèi)核
24、:最常見的命令為 make menuconfigp建立依賴關(guān)系:最常見的命令為 make depp編譯內(nèi)核:最常見的命令為 make 或 make zImagep編譯內(nèi)核模塊:最常見的命令為 make modulesp安裝內(nèi)核模塊:最常見的命令為 make modules_installp安裝內(nèi)核:最常見的命令為 make install48Linux內(nèi)核配置 內(nèi)核都會(huì)在配置完后生成一個(gè).config文件,還會(huì)產(chǎn)生大量的符號(hào)連接和頭文件,這些在其余的創(chuàng)建過程中會(huì)用到。.config 文件中保存了根據(jù)在menuconfig中的選擇定義的相應(yīng)變量,在Linux內(nèi)核目錄下的Makefile文件中將會(huì)
25、包含這個(gè)文件。重要的內(nèi)核選項(xiàng)包括:p Code maturity level options (內(nèi)核成熟級(jí)別選項(xiàng))p Loadable module support (可加載模塊支持)p General setup (通用設(shè)置)p Memory technology devices (內(nèi)存技術(shù)設(shè)備)p Block devices (塊設(shè)備)p Network device support (網(wǎng)絡(luò)設(shè)備支持)p Character devices (字符設(shè)備)p File systems (文件系統(tǒng))p Console drivers (控制臺(tái)驅(qū)動(dòng))可以參考配置界面中的說明來確定每個(gè)選項(xiàng)的含義,不
26、需要的功能都可以去掉,這樣可以有效減小內(nèi)核的尺寸!49Linux內(nèi)核的編譯建立內(nèi)核依賴關(guān)系(linux-2.6.x不再需要這個(gè)步驟):# make dep編譯內(nèi)核:# make zImage 或者# make單獨(dú)地編譯內(nèi)核模塊:# make modules 如果編譯成功,所生成的內(nèi)核映像文件將放置在arch/$ARCH/boot目錄下,對(duì)于ARM 架構(gòu)來說就是 arch/arm/boot 目錄。50pLinux下的文件系統(tǒng)p嵌入式Linux的文件系統(tǒng)介紹pLinux的根文件系統(tǒng)5.3.4 根文件系統(tǒng)51Linux下的文件系統(tǒng) 文件系統(tǒng)(File System)是文件存放文件存放在磁盤等存儲(chǔ)設(shè)備
27、上的組織方式組織方式,主要作用體現(xiàn)在對(duì)文件和目錄的組織上。 Linux下的文件系統(tǒng),由虛擬文件系統(tǒng)和實(shí)際的文件系統(tǒng)兩個(gè)層次組成。目前常用的有EXT2、CRAMFS、JFFS2、NFTL、NFS和RAM 磁盤文件系統(tǒng)等。 在Linux下,不同的文件系統(tǒng)連接成一個(gè)單一的樹型樹型結(jié)構(gòu),用一個(gè)統(tǒng)一的單個(gè)實(shí)體表示文件系統(tǒng)。Linux在文件系統(tǒng)安裝的時(shí)候,把其掛接 (mount) 到這個(gè)單一的文件系統(tǒng)樹上。52Linux下的文件系統(tǒng)53嵌入式Linux的文件系統(tǒng)介紹在嵌入式Linux中,常見的文件系統(tǒng)有以下幾種:p EXT2/3(擴(kuò)展文件系統(tǒng)擴(kuò)展文件系統(tǒng)2/3)p ROMFS (Read Only Mem
28、ory File System,只讀文件系統(tǒng))p CRAMFS (Compress Read Access Memory File System,壓縮只讀文件系統(tǒng))p JFFS2 (Journaling Flash File system 2,日志文件系統(tǒng)日志文件系統(tǒng)2)p NFS (Net File System,網(wǎng)絡(luò)文件系統(tǒng)網(wǎng)絡(luò)文件系統(tǒng))p YAFFS (Yet Another Flash File System,另一種FLASH文件系統(tǒng))54 Linux的根文件系統(tǒng) Linux 的根文件系統(tǒng)的主要目錄:p/bin:包含基本的用戶命令工具程序p/sbin:包含基本的系統(tǒng)管理程序p/boot
29、:包含內(nèi)核映像及啟動(dòng)相關(guān)文件p/etc:(executive time config)包含系統(tǒng)配置文件和腳本p/lib:包含系統(tǒng)庫和內(nèi)核模塊p/usr:用戶程序及庫目錄p/home:用戶主目錄p/root:root 用戶主目錄p/dev:設(shè)備文件目錄,目錄下的每個(gè)文件代表一個(gè)設(shè)備p/opt:額外軟件包所在目錄p/mnt:文件系統(tǒng)臨時(shí)掛裝目錄p/var:包含運(yùn)行時(shí)改變的文件,例如lock 和log 文件p/proc:內(nèi)核創(chuàng)建和使用的虛擬文件系統(tǒng),存放運(yùn)行時(shí)系統(tǒng)信息p/tmp:臨時(shí)文件目錄根文件系統(tǒng)是Linux內(nèi)核啟動(dòng)后掛接的文件系統(tǒng)。55提綱提綱 嵌入式軟件開發(fā)基礎(chǔ)嵌入式軟件開發(fā)基礎(chǔ) 嵌入式嵌入
30、式Linux開發(fā)環(huán)境開發(fā)環(huán)境 構(gòu)建嵌入式構(gòu)建嵌入式Linux系統(tǒng)系統(tǒng) 嵌入式嵌入式Linux系統(tǒng)移植系統(tǒng)移植 嵌入式嵌入式Linux驅(qū)動(dòng)開發(fā)驅(qū)動(dòng)開發(fā)565.4 嵌入式Linux系統(tǒng)移植5.4.1 Bootloader(引導(dǎo)加載器)5.4.2 基于ARM-with MMU的Linux移植5.4.3 基于ARM-noMMU的CLinux移植575.4.1 Bootloader的開發(fā)Bootloader是在操作系統(tǒng)內(nèi)核運(yùn)行之前運(yùn)行的一段小程序。通過這段小程序,可以初始化硬件設(shè)備、建立系統(tǒng)的內(nèi)存空間映射圖,從而將系統(tǒng)的軟硬件環(huán)境設(shè)置為一個(gè)可以運(yùn)行操作系統(tǒng)的狀態(tài);最終,Bootloader把操作系統(tǒng)內(nèi)核
31、映像加載到RAM中,然后運(yùn)行,這時(shí)系統(tǒng)控制權(quán)交給操作系統(tǒng)。58Bootloader本質(zhì)上也是一個(gè)程序,也需要通過交叉編譯工具生成二進(jìn)制代碼,但Bootloader與普通C語言程序存在著明顯區(qū)別。在Linux系統(tǒng)中,一般的C語言可執(zhí)行程序是依賴于操作系統(tǒng)的,可能包含一些頭信息,還可能使用C語言基礎(chǔ)函數(shù)的庫。而Bootloader是不依賴操作系統(tǒng)的。相反,Linux內(nèi)核是由Bootloader調(diào)用的。Bootloader中所有的功能,都需要在其本身的代碼中包含。5.4.1 Bootloader的開發(fā)59便于適應(yīng)不同平臺(tái)Bootloader的實(shí)現(xiàn)依賴于CPU的體系結(jié)構(gòu),因此大多數(shù)Bootloader
32、都分為stage1和stage2兩大部分。依賴于CPU體系結(jié)構(gòu)的代碼,例如設(shè)備初始化代碼等,通常都放在stage1中,而且通常都用匯編語言匯編語言來實(shí)現(xiàn),以達(dá)到短小精悍的目的。而stage2則通常用C語言語言來實(shí)現(xiàn),這樣可以實(shí)現(xiàn)更復(fù)雜的功能,而且代碼會(huì)具有更好的可讀性可讀性和可移植性可移植性。 與體系結(jié)構(gòu)相關(guān)5.4.1 Bootloader的開發(fā)60Bootloader的stage1通常包括以下步驟(以執(zhí)行的先后為順序):p硬件設(shè)備初始化p為加載Bootloader的stage2準(zhǔn)備RAM空間p拷貝Bootloader的stage2到RAM空間中p設(shè)置堆棧p跳轉(zhuǎn)到stage2的C入口點(diǎn)準(zhǔn)備C語
33、言的運(yùn)行環(huán)境5.4.1 Bootloader的開發(fā)61Bootloader的stage1通常包括以下步驟(以執(zhí)行的先后為順序):p硬件設(shè)備初始化硬件設(shè)備初始化p為加載Bootloader的stage2準(zhǔn)備RAM空間p拷貝Bootloader的stage2到RAM空間中p設(shè)置堆棧p跳轉(zhuǎn)到stage2的C入口點(diǎn)5.4.1 Bootloader的開發(fā)屏蔽所有的中斷(如ARM的CPSR)設(shè)置CPU的速度和時(shí)鐘頻率RAM初始化(內(nèi)存控制器設(shè)置)初始化LED(如通過GPIO來驅(qū)動(dòng)LED)關(guān)閉CPU內(nèi)部指令數(shù)據(jù)cache(具有MMU)62Bootloader的stage1通常包括以下步驟(以執(zhí)行的先后為順序
34、):p硬件設(shè)備初始化p為加載為加載Bootloader的的stage2準(zhǔn)備準(zhǔn)備RAM空間空間p拷貝Bootloader的stage2到RAM空間中p設(shè)置堆棧p跳轉(zhuǎn)到stage2的C入口點(diǎn)5.4.1 Bootloader的開發(fā)為了獲得更快的執(zhí)行速度,通常把stage2加載到RAM空間中來執(zhí)行,因此必須為加載Bootloader的stage2準(zhǔn)備好一段可用的RAM空間。63Bootloader的stage1通常包括以下步驟(以執(zhí)行的先后為順序):p硬件設(shè)備初始化p為加載Bootloader的stage2準(zhǔn)備RAM空間p拷貝拷貝Bootloader的的stage2到到RAM空間中空間中p設(shè)置堆棧p跳
35、轉(zhuǎn)到stage2的C入口點(diǎn)5.4.1 Bootloader的開發(fā)stage2的可執(zhí)行映像在固態(tài)存儲(chǔ)設(shè)備的存放起始地址和終止地址;為stage2所安排的RAM空間的起始地址。645.4.1 Bootloader的開發(fā)Bootloader的stage1通常包括以下步驟(以執(zhí)行的先后為順序):p硬件設(shè)備初始化p為加載Bootloader的stage2準(zhǔn)備RAM空間p拷貝Bootloader的stage2到RAM空間中p設(shè)置堆棧設(shè)置堆棧p跳轉(zhuǎn)到stage2的C入口點(diǎn)65Bootloader的stage1通常包括以下步驟(以執(zhí)行的先后為順序):p硬件設(shè)備初始化p為加載Bootloader的stage2準(zhǔn)
36、備RAM空間p拷貝Bootloader的stage2到RAM空間中p設(shè)置堆棧p跳轉(zhuǎn)到跳轉(zhuǎn)到stage2的的C入口點(diǎn)入口點(diǎn)5.4.1 Bootloader的開發(fā)在上述一切都就緒后,可以跳轉(zhuǎn)到Bootloader的stage2去執(zhí)行了。在ARM系統(tǒng)中,可以通過修改PC(R15)值為合適的地址來實(shí)現(xiàn)(如 LDR指令)66Bootloader的stage1通常包括以下步驟(以執(zhí)行的先后為順序):p硬件設(shè)備初始化p為加載Bootloader的stage2準(zhǔn)備RAM空間p拷貝Bootloader的stage2到RAM空間中p設(shè)置堆棧p跳轉(zhuǎn)到stage2的C入口點(diǎn)5.4.1 Bootloader的開發(fā)67B
37、ootloader的stage2通常包括以下步驟(以執(zhí)行的先后為順序):p初始化本階段要使用到的硬件設(shè)備p檢測(cè)系統(tǒng)內(nèi)存映射(memory map)p將kernel映像和根文件系統(tǒng)映像從flash上讀到RAM空間中p為內(nèi)核設(shè)置啟動(dòng)參數(shù)p調(diào)用內(nèi)核在嵌入式系統(tǒng)中也可以直接在ROM或者FLASH上直接運(yùn)行內(nèi)核映像與根文件系統(tǒng)映像,但這種做法會(huì)犧牲系統(tǒng)的運(yùn)行速度運(yùn)行速度!5.4.1 Bootloader的開發(fā)68Bootloader的stage2通常包括以下步驟(以執(zhí)行的先后為順序):p初始化本階段要使用到的硬件設(shè)備初始化本階段要使用到的硬件設(shè)備p檢測(cè)系統(tǒng)內(nèi)存映射(memory map)p將kernel
38、映像和根文件系統(tǒng)映像從flash上讀到RAM空間中p為內(nèi)核設(shè)置啟動(dòng)參數(shù)p調(diào)用內(nèi)核初始化至少一個(gè)串口,以便和終端用戶進(jìn)行I/O輸出信息;初始化定時(shí)器等。設(shè)備初始化完成后,可以輸出一些打印信息、程序名字符串、版本號(hào)等。5.4.1 Bootloader的開發(fā)69Bootloader的stage2通常包括以下步驟(以執(zhí)行的先后為順序):p初始化本階段要使用到的硬件設(shè)備p檢測(cè)系統(tǒng)內(nèi)存映射檢測(cè)系統(tǒng)內(nèi)存映射(memory map)p將kernel映像和根文件系統(tǒng)映像從flash上讀到RAM空間中p為內(nèi)核設(shè)置啟動(dòng)參數(shù)p調(diào)用內(nèi)核內(nèi)存映射就是指在整個(gè)4GB的物理地址空間中,有哪些地址范圍被分配用于尋址系統(tǒng)的RAM
39、空間。 Bootloader的stage2必須先檢測(cè)整個(gè)系統(tǒng)的內(nèi)存映射情況。檢測(cè)完系統(tǒng)的內(nèi)存映射情況后,Bootloader也可以將內(nèi)存映射的詳細(xì)信息打印到串口。5.4.1 Bootloader的開發(fā)70Bootloader的stage2通常包括以下步驟(以執(zhí)行的先后為順序):p初始化本階段要使用到的硬件設(shè)備p檢測(cè)系統(tǒng)內(nèi)存映射(memory map)p將將kernel映像和根文件系統(tǒng)映像從映像和根文件系統(tǒng)映像從flash上讀到上讀到RAM空間中空間中p為內(nèi)核設(shè)置啟動(dòng)參數(shù)p調(diào)用內(nèi)核規(guī)劃內(nèi)存占用的布局從Flash上拷貝5.4.1 Bootloader的開發(fā)while(count) *dest+ =
40、 *src+; count -= 4;71Bootloader的stage2通常包括以下步驟(以執(zhí)行的先后為順序):p初始化本階段要使用到的硬件設(shè)備p檢測(cè)系統(tǒng)內(nèi)存映射(memory map)p將kernel映像和根文件系統(tǒng)映像從flash上讀到RAM空間中p為內(nèi)核設(shè)置啟動(dòng)參數(shù)為內(nèi)核設(shè)置啟動(dòng)參數(shù)p調(diào)用內(nèi)核調(diào)用內(nèi)核之前,通常需要設(shè)置Linux內(nèi)核的啟動(dòng)參數(shù)。例如,“console=ttyS0,115200n8”表示以ttyS0作為控制臺(tái),且串口采用如下設(shè)置:“115200bps、無奇偶校驗(yàn)、8位數(shù)據(jù)位”。5.4.1 Bootloader的開發(fā)72Bootloader的stage2通常包括以下步驟(
41、以執(zhí)行的先后為順序):p初始化本階段要使用到的硬件設(shè)備p檢測(cè)系統(tǒng)內(nèi)存映射(memory map)p將kernel映像和根文件系統(tǒng)映像從flash上讀到RAM空間中p為內(nèi)核設(shè)置啟動(dòng)參數(shù)p調(diào)用內(nèi)核調(diào)用內(nèi)核CPU寄存器的設(shè)置lR0=0;lR1=機(jī)器類型ID(linux/arch/arm/tools/mach-types);lR2=啟動(dòng)參數(shù)標(biāo)記列表在RAM中的起始基地址。CPU模式l必須禁止中斷(IRQs和FIQs);lCPU必須為SVC模式。Cache和MMU的設(shè)置l指令Cache可以打開也可以關(guān)閉;l數(shù)據(jù)Cache必須關(guān)閉。5.4.1 Bootloader的開發(fā)73課程小結(jié)課程小結(jié)1.1.嵌入式軟
42、件開發(fā)的主要步驟嵌入式軟件開發(fā)的主要步驟有哪些?有哪些?2. 嵌入式開發(fā)常用的調(diào)試方式有哪些?嵌入式開發(fā)常用的調(diào)試方式有哪些?3. Bootloader程序框架結(jié)構(gòu)和各部分完成的任務(wù)?程序框架結(jié)構(gòu)和各部分完成的任務(wù)?4. 將將Linux內(nèi)核移植到一種新處理器的主要工作??jī)?nèi)核移植到一種新處理器的主要工作?5. Linux驅(qū)動(dòng)程序的分類及相關(guān)程序結(jié)構(gòu)?驅(qū)動(dòng)程序的分類及相關(guān)程序結(jié)構(gòu)?stage1通常包括以下步驟(1)硬件設(shè)備初始化(2)為加載Bootloader的stage2準(zhǔn)備RAM空間(3)拷貝Bootloader的stage2到RAM空間中(4)設(shè)置堆棧(5)跳轉(zhuǎn)到stage2的C入口點(diǎn)sta
43、ge2通常包括以下步驟(1)初始化本階段要使用到的硬件設(shè)備(2)檢測(cè)系統(tǒng)內(nèi)存映射(memory map)(3)將kernel映像和根文件系統(tǒng)映像從flash上讀到RAM空間中(4)為內(nèi)核設(shè)置啟動(dòng)參數(shù)(5)調(diào)用內(nèi)核745.4.2 基于ARM-with MMU的Linux移植標(biāo)準(zhǔn)Linux的移植指使標(biāo)準(zhǔn)Linux在某個(gè)具有MMU的處理器的系統(tǒng)上可以正常運(yùn)行。為了達(dá)到這個(gè)目的,需要更改或增加Linux的部分源代碼。在Linux操作系統(tǒng)中,無論基于ARM還是x86 PC,絕大多數(shù)使用C語言編寫的系統(tǒng)內(nèi)核都是相同的,只有部分與體系結(jié)構(gòu)相關(guān)的代碼使用相應(yīng)的匯編語言編寫。因此,許多桌面Linux的程序都可以
44、很容易移植到嵌入式的ARM系統(tǒng)中。755.4.2 基于ARM-with MMU的Linux移植1. Linux內(nèi)核組成76代碼部分代碼部分程序語言程序語言描述描述linux 2.x/initC初始化代碼,包括C語言入口函數(shù)main.clinux 2.x/kernelC內(nèi)核的核心代碼,包括進(jìn)程調(diào)度等linux 2.x/ipcC進(jìn)程通訊代碼linux 2.x/mmC內(nèi)存管理代碼linux 2.x/fsC文件系統(tǒng)代碼linux 2.x/netC網(wǎng)絡(luò)代碼linux 2.x/driversC驅(qū)動(dòng)程序代碼包含char、block、net等子目錄linux 2.x/includeC頭文件各部分代碼頭文件li
45、nux 2.x/archC+匯編與體系結(jié)構(gòu)相關(guān)的C和匯編代碼(arm、i386、m68k、x86_64)移植改動(dòng)的主要工作。2. Linux源文件結(jié)構(gòu)5.4.2 基于ARM-with MMU的Linux移植775.4.2 基于ARM-with MMU的Linux移植例如mach-sa1100是對(duì)Intel Strong ARM內(nèi)核的SA1100的支持,mach-at91rm9200是對(duì)AT91rm9200的支持。對(duì)處理器進(jìn)行操作系統(tǒng)移植的時(shí)候,實(shí)際上就可以根據(jù)相近的處理器出發(fā),新建一個(gè)mach-XXX文件夾。785.4.2 基于ARM-with MMU的Linux移植3. ARM Linux系
46、統(tǒng)的初始化過程Linux的C語言入口是linux 2.x/init/目錄中的main.c的start_kernel()函數(shù)。在嵌入式Linux中,內(nèi)核作為一段可執(zhí)行的代碼是由Bootloader加載然后運(yùn)行的。Linux程序進(jìn)入C語言入口后,將完成系統(tǒng)的各種初始化工作,并建立第一個(gè)進(jìn)程,整個(gè)系統(tǒng)進(jìn)入調(diào)度狀態(tài)。 793. ARM Linux 系統(tǒng)的初始化過程805.4.2 基于ARM-with MMU的Linux移植4. 基于PXA 2xx嵌入式系統(tǒng)的ARM Linux移植一個(gè)具體的處理器的移植的主要代碼改動(dòng)包括增加處增加處理器類型理器類型、中斷系統(tǒng)中斷系統(tǒng)和定時(shí)器系統(tǒng)定時(shí)器系統(tǒng)幾個(gè)重要的環(huán)節(jié)。
47、需要將硬件的中斷轉(zhuǎn)換成操作系統(tǒng)的中斷操作系統(tǒng)的中斷。定時(shí)器定時(shí)器為操作系統(tǒng)提供時(shí)鐘節(jié)拍。根據(jù)移植后內(nèi)核的需要配置編譯選項(xiàng)編譯選項(xiàng)。DMA和一些必要驅(qū)動(dòng)程序(如串口)通常也是需要的。81目錄和文件類型描 述arch/arm/tools/mach-types機(jī)器類型 這是包含機(jī)器類型(處理器類型)的文件,需要在此處增加新的處理器類型include/asm-arm/arch-XXX頭文件 這些是需要在內(nèi)核和內(nèi)核模塊中使用的頭文件。在include/arm目錄中的每一個(gè)arch-XXX表示了一種Linux支持ARM處理器,對(duì)于新增的處理器需要增加一個(gè)arch-XXX目錄。arch/arm/mach-X
48、XX處理器移植文件 這是移植主要需要的文件,既包括C語言文件,也包括匯編文件。針對(duì)每種處理器需要增加各種實(shí)現(xiàn)。arch/arm/共同代碼部分ARM的公共代碼 對(duì)于某些處理器,需要更改針對(duì)ARM處理器的共同代碼部分,一般使用條件編譯的方式Makefile和config文件編譯腳本 Linux內(nèi)核編譯過程中,需要配置的腳本決定編譯的文件,選擇移植的體系結(jié)構(gòu)。4. 基于PXA 2xx嵌入式系統(tǒng)的ARM Linux移植irq.h:中斷系統(tǒng)頭文件dma.h:DMA系統(tǒng)頭文件io.h:I/O空間操作相關(guān)定義hardware.h:系統(tǒng)硬件頭文件,一般包括寄存器定義等memory.h:定義物理內(nèi)存偏移量以及虛
49、擬內(nèi)存到DMA可見內(nèi)存的轉(zhuǎn)換system.h:一般定義系統(tǒng)空閑(arch_idle)和復(fù)位(arch_reset)兩個(gè)函數(shù)timex.h:定義時(shí)鐘節(jié)拍(CLOCK_TICK_RATE),用于內(nèi)核計(jì)算時(shí)間82中斷系統(tǒng)的移植中斷系統(tǒng)的移植是Linux操作系統(tǒng)在ARM移植的核心部分。中斷系統(tǒng)的移植需要從兩個(gè)方面考慮:一部分是中斷系統(tǒng)的初始化初始化,另一部分是中斷發(fā)生后的處理處理。PXA中斷系統(tǒng)移植主要涉及以下幾個(gè)文件:arch/arm/kernel/entry-armv.S:ARM中斷系統(tǒng)的入口程序arch/arm/mach/irq.c:ARM公共中斷處理文件include/asm-arm/arch
50、-pxa/entry-macro.S:提供由平臺(tái)調(diào)用的宏include/asm-arm/arch-pxa/irqs.h:中斷號(hào)定義arch/arm/mach-pxa/irq.c:PXA中斷實(shí)現(xiàn)文件4. 基于PXA 2xx嵌入式系統(tǒng)的ARM Linux移植83定時(shí)器的移植在操作系統(tǒng)中,定時(shí)器的移植是必不可少的,其目的是定時(shí)產(chǎn)生一個(gè)中斷,操作系統(tǒng)將利用該中斷作為自己的時(shí)鐘。時(shí)間間隔可以通過硬件來設(shè)定。PXA定時(shí)器的移植主要涉及以下幾個(gè)文件:asm-arm/kernel/time.c:ARM定時(shí)器和時(shí)間公共代碼include/asm-arm/arch-pxa/timex.h:PXA時(shí)鐘定義inclu
51、de/asm-arm/arch-pxa/time.h:PXA定時(shí)器頭文件4. 基于PXA 2xx嵌入式系統(tǒng)的ARM Linux移植845.4.3 基于ARM-noMMU的CLinux移植CLinux是目前嵌入式linux中最流行的一種。Micro-Control-Linux,意為“針對(duì)微控制領(lǐng)域而設(shè)計(jì)的Linux系統(tǒng)”。從Linux 2.0/2.4內(nèi)核派生而來,沿襲了主流Linux的絕大部分特性,適合不具備MMU的微處理器/微控制器。官方網(wǎng)站()1. CLinux概述855.4.3 基于ARM-noMMU的CLinux移植虛擬內(nèi)存Flat(扁平)格式位
52、置無關(guān)的代碼PIC多進(jìn)程管理2. CLinux與標(biāo)準(zhǔn)Linux的主要區(qū)別865.4.3 基于ARM-noMMU的CLinux移植虛擬內(nèi)存虛擬內(nèi)存Flat(扁平)格式位置無關(guān)的代碼PIC多進(jìn)程管理2. CLinux與標(biāo)準(zhǔn)Linux的主要區(qū)別標(biāo)準(zhǔn)Linux使用硬件地址轉(zhuǎn)換的內(nèi)存管理模型,應(yīng)用程序使用虛擬地址,CPU實(shí)際執(zhí)行程序所使用的事物理地址;CLinux沒有MMU,無法映射虛擬內(nèi)存,只能直接訪問物理內(nèi)存,一個(gè)進(jìn)程在執(zhí)行前,系統(tǒng)必須為進(jìn)程分配足夠的連續(xù)地址空間,然后全部載入主存儲(chǔ)器的連續(xù)空間中。875.4.3 基于ARM-noMMU的CLinux移植虛擬內(nèi)存Flat(扁平)格式(扁平)格式位置無
53、關(guān)的代碼PIC多進(jìn)程管理2. CLinux與標(biāo)準(zhǔn)Linux的主要區(qū)別CLinux下的可執(zhí)行程序不能使用通用的ELF格式,而需要使用新的Flat(扁平)文件格式;通常編譯器不支持生成Flat文件格式,需要通過中間格式轉(zhuǎn)換,如elf,使用elf2flat;或者coff (Common Object File Format),使用coff2flat轉(zhuǎn)換。885.4.3 基于ARM-noMMU的CLinux移植虛擬內(nèi)存Flat(扁平)格式位置無關(guān)的代碼位置無關(guān)的代碼PIC多進(jìn)程管理2. CLinux與標(biāo)準(zhǔn)Linux的主要區(qū)別在CLinux中,由內(nèi)核所加載的程序必須能夠獨(dú)立運(yùn)行,與它們?cè)趦?nèi)存中的位置無關(guān)
54、。l一旦程序被加載到RAM中,其基準(zhǔn)地址就“固定”下來;l或產(chǎn)生只使用相對(duì)尋址的代碼,即與位置無關(guān)代碼(Position Independent Code, PIC)895.4.3 基于ARM-noMMU的CLinux移植虛擬內(nèi)存Flat(扁平)格式位置無關(guān)的代碼PIC多進(jìn)程管理多進(jìn)程管理2. CLinux與標(biāo)準(zhǔn)Linux的主要區(qū)別在CLinux中沒有fork()的條用,只能使用vfork()。905.4.3 基于ARM-noMMU的CLinux移植虛擬內(nèi)存Flat(扁平)格式位置無關(guān)的代碼PIC多進(jìn)程管理2. CLinux與標(biāo)準(zhǔn)Linux的主要區(qū)別91內(nèi)內(nèi) 容容類類 型型描描 述述Linux
55、-2.6.xLinux-2.4.xLinux-2.0.xOS源代碼CLinux的內(nèi)核,與Linux-2.6.x/Linux-2.4.x/ Linux-2.0.x內(nèi)核兼容。freeswan軟件源代碼來自的軟件lib軟件源代碼用戶層應(yīng)用程序所用到的一些庫,包括libc,libm等等uClibc源代碼是一個(gè)libc庫,比通常使用的glic更小,更精簡(jiǎn)user源代碼包含了CLinux自帶的大量用戶層的應(yīng)用程序config配置腳本一個(gè)基本的linux配置腳本用來進(jìn)行默認(rèn)的配置vendors編譯信息包含平臺(tái)特定的一些編譯信息和一些支持文件。這里還存放了對(duì)每一個(gè)CLinux支
56、持的平臺(tái)的默認(rèn)文件romfs編譯結(jié)果ROM文件系統(tǒng)的目錄結(jié)構(gòu)images編譯結(jié)果包含編譯好的二進(jìn)制內(nèi)核文件,文件系統(tǒng)的鏡像文件和一個(gè)包含文件系統(tǒng)和內(nèi)核的鏡像3. CLinux發(fā)布包924. CLinux源文件結(jié)構(gòu)和移植93 CLinux的移植需要增加和改動(dòng)的文件和Linux基本一致,只是Linux基于arch/arm目錄,而CLinux基于arch/armnommu目錄。parch/arm/tools/mach-types: 機(jī)器類型pinclude/asm-armnommu/arch-XXX:頭文件parch/armnommu/mach-XXX:處理器移植文件parch/armnommu/共同代碼部分:ARM的公共代碼pMakefile和config文件: 編譯腳本4. CLinux源文件結(jié)構(gòu)和移植94課程小結(jié)課程小結(jié) 嵌入式軟件開發(fā)基礎(chǔ)嵌入式軟件開發(fā)基礎(chǔ) 嵌入式嵌入式Linux開發(fā)環(huán)境開發(fā)環(huán)境 構(gòu)建嵌入式構(gòu)建嵌入式Linux系統(tǒng)系統(tǒng) 嵌入式嵌入式Linux系統(tǒng)移植系統(tǒng)移植 嵌入式嵌入式Linux驅(qū)動(dòng)開發(fā)驅(qū)動(dòng)開發(fā)95課程小結(jié)課程小結(jié)1.1.嵌入式軟件開發(fā)的主要步驟嵌入式軟件開發(fā)的主要步驟有哪些?有哪些?2. 嵌入式開發(fā)常用的調(diào)試方式有哪些?嵌入式開發(fā)常用的調(diào)試方式有哪些?3.
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 【正版授權(quán)】 ISO 21219-21:2025 EN Intelligent transport systems - Traffic and travel information (TTI) via transport protocol experts group,generation 2 (TPEG2) - Part 21: Geographic lo
- 《環(huán)境安全教育資料》課件
- 2024年隔離酒店消防安全應(yīng)急預(yù)案
- 單位管理制度合并匯編人員管理篇
- 單位管理制度分享大全【職工管理】十篇
- 《種按摩康復(fù)療法》課件
- 單位管理制度呈現(xiàn)合集【職員管理篇】十篇
- 單位管理制度呈現(xiàn)大合集【員工管理篇】十篇
- 《電子商務(wù)新技術(shù)》課件
- 2024年地稅個(gè)人年度工作總結(jié)
- 國(guó)家開放大學(xué)電大本科《國(guó)際私法》2024-2025期末試題及答案(試卷號(hào):1020)
- 《微觀經(jīng)濟(jì)學(xué)》(雙語)試卷B及答案
- 脅痛中醫(yī)臨床路徑
- 16種(卡特爾)人格測(cè)評(píng)試題及答案
- 蛋雞養(yǎng)殖場(chǎng)管理制度管理辦法
- 螺內(nèi)酯在腎臟病中的應(yīng)用演示教學(xué)
- 市政工程計(jì)量與計(jì)價(jià)講義
- 小孩出生后視力發(fā)展過程
- X62W萬能銑床
- 供應(yīng)商年度審核計(jì)劃及現(xiàn)場(chǎng)審核表
- 環(huán)甲膜穿刺ppt課件
評(píng)論
0/150
提交評(píng)論