




版權(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月月 2 1.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. Bootloade
2、r程序框架結(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)? 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ā) 5 5.1 嵌入式軟件開發(fā)基礎(chǔ) 嵌入式軟件開發(fā)語言 嵌入式軟件開發(fā)流程 調(diào)試工具和方法 C語言程序的結(jié)構(gòu) 仿真環(huán)境 6 5.1.1 嵌入式軟件開發(fā)語言
3、p匯編(與體系結(jié)構(gòu)相關(guān)) pC語言(最常用語言)語言(最常用語言) pC+語言(面向?qū)ο?,C語言的擴(kuò)展) pJAVA(面向?qū)ο?,可移植性?qiáng)) p腳本語言(不需要編譯) 系統(tǒng)級(jí)開發(fā)系統(tǒng)級(jí)開發(fā) 應(yīng)用級(jí)開發(fā)應(yīng)用級(jí)開發(fā) 7 5.1.2 嵌入式軟件開發(fā)流程 pC語言程序的生成分成編譯、匯編、鏈接編譯、匯編、鏈接等 幾個(gè)步驟。最終的目標(biāo)的文件的主要部分是 處理器可執(zhí)行的機(jī)器代碼組合。根據(jù)系統(tǒng)的 不同,目標(biāo)文件可能除了可執(zhí)行的二進(jìn)制代 碼部分外,還包括一定的頭。 8 ARM程序的生成流程 編譯(Compile)是指從高級(jí)語言高級(jí)語言轉(zhuǎn)換成匯編語言匯編語言的過程。從本質(zhì) 上編譯是一個(gè)文本轉(zhuǎn)換的過程(從文本文件
4、到文本文件)。編譯包 含了C語言的語法解析語法解析和生成匯編語言生成匯編語言兩個(gè)步驟。 匯編(Assemble)是指從匯編語言匯編語言程序生成目標(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)特
5、點(diǎn): 在嵌入式系統(tǒng)中,調(diào)試的概念相對(duì)復(fù)雜。對(duì)于其調(diào)試過程, 程序主體運(yùn)行在目標(biāo)機(jī)上,主機(jī)所起的作用是獲得程序運(yùn)行中的 信息,并通過人工或者程序的方式分析這些信息。因此嵌入式調(diào) 試的基礎(chǔ)是需要一條從主機(jī)到目標(biāo)機(jī)的通訊通道。 5.1.3 調(diào)試工具和方法 10 5.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 Ac
6、tion Group的簡(jiǎn)稱。JTAG使用邊界掃描 (Boundary-Scan)的方式調(diào)試:在靠近芯片的輸入輸出管 腳上增加一個(gè)移位寄存器單元,通過這些寄存器單元實(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)行。 11 5.1.4 C語言程序的結(jié)構(gòu) pC語言目標(biāo)文件中的段 p目標(biāo)文件各段的鏈接 pC語言程序的執(zhí)行 12
7、C語言目標(biāo)文件中的段 C語言在編譯過程中,編譯系統(tǒng)會(huì)將每一個(gè)C語言源文件經(jīng)過 編譯和匯編,生成一個(gè)目標(biāo)文件(一般以 .o 為擴(kuò)展名)。目 標(biāo)文件的主體部分是由C語言各種語法生成的各段。 13 目標(biāo)文件各段的鏈接 可執(zhí)行文件其主體部分依然是代碼段(Code)、只讀數(shù)據(jù)段 (RO Data)、讀寫數(shù)據(jù)段(RW Data)三個(gè)段,這三個(gè)段由 各個(gè)目標(biāo)文件(.o)經(jīng)過“組合”而成。 14 C語言程序的執(zhí)行 這種方式一般適合于有操作系統(tǒng) 的情況,操作系統(tǒng)根據(jù)可執(zhí)行文 件中的信息,完成各段內(nèi)存的加 載和未初始化數(shù)據(jù)段的開辟。 15 C語言程序的執(zhí)行 嵌入式系統(tǒng)中,程序放置的位置 本身可以運(yùn)行程序(如NOR
8、 FLASH),可以直接將指針置于 程序放置的Code地址處,直接運(yùn) 行程序。 16 5.1.5 仿真環(huán)境 p最理想的開發(fā)方式還是脫離目標(biāo)機(jī)的開發(fā)。 程序的大部分代碼將在主機(jī)上調(diào)試通過,然 后再目標(biāo)機(jī)環(huán)境完成適應(yīng)性配置。嵌入式系 統(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)是需要指令集模擬器的
9、支持, 并可能消耗主機(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ā) 20 5.2 嵌入式Linux開發(fā)環(huán)境 GNU Tools 項(xiàng)目管理 調(diào)試器 21 5.2.1 GNU Tools pGNU Tools綜述 pGCC 編譯與鏈接 pC語言庫 22 GNU Tools綜述 GNU Tools是Linux環(huán)境下的開發(fā)工具,用于代碼的 生成。GNU Tools的重要組成部分是GCC。GCC 是GNU Compiler
10、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)換。對(duì)于通用計(jì)算機(jī),一般使用 GCC生成x86的可執(zhí)行代碼;對(duì)于嵌入式開發(fā)系統(tǒng),使 用交叉編譯的GCC,生成目標(biāo)機(jī)可以執(zhí)行的程序。 23 GCC默認(rèn)處理的文件 文件類型擴(kuò)展名文件說明 文本文 件 * *.c .c C語言源文件 * *.C / .C / * *.cxx.cxx / / * *.cc.ccC+語言源文件
11、* *.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)庫 24 Binutils工具集合 工具名稱工具名稱說明說明 asGNU匯編器。用以將處理器的匯編代碼轉(zhuǎn)換成可執(zhí)行代碼,并存儲(chǔ)到 目標(biāo)文件.o文件中 ldGNU鏈接器。用于將一個(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) o
12、bjectcopy轉(zhuǎn)換二進(jìn)制代碼的工具 objdump顯示目標(biāo)文件的反匯編工具 readelf顯示ELF文件中的各種信息 string顯示文件中的可打印字符 ranlib產(chǎn)生歸檔文件的系引,并將其保存到歸檔文件中,系引同時(shí)列出歸 檔文件各成員所定義的可重分配目標(biāo)文件。 addr2line可以將一個(gè)可執(zhí)行程序的地址映射到源文件的對(duì)應(yīng)行。 Gprof顯示程序調(diào)用段的各種數(shù)據(jù) 25 GCC對(duì)C語言程序的處理 p 預(yù)處理預(yù)處理 p 編譯編譯 p 匯編匯編 p 鏈接鏈接 26 GCC 編譯與鏈接 # gcc hello.c -o hello # ./hello Hello world! 預(yù)處理 # gc
13、c -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; 27 GCC 編譯與鏈接 一步完成:一步完成: # gcc foo1.c foo2.c -o foo 源程序:源程序: foo1.c foo2.c 多步完成:多步完成: # gcc -c foo1.c -o foo1.o # gcc -c f
14、oo2.c -o foo2.o # gcc foo1.o foo2.o -o foo 28 C語言庫 在嵌入式程序的C語言程 序的開發(fā)中,C語言庫是應(yīng)用程 序所依賴的基礎(chǔ)。在C語言庫中, 提供一些C語言中程序運(yùn)行的基 礎(chǔ),包括標(biāo)準(zhǔn)的庫函數(shù),如: printf、malloc、字符串處理等 基本函數(shù)操作。 常用的c函數(shù)庫: glibc, Clibc, newlib 29 5.2.2 項(xiàng)目管理 p工程管理工具M(jìn)ake與Makefile pMakefile是一個(gè)決定怎樣編譯工程的文本文件,按 照一定的規(guī)則書寫。在工程更新的時(shí)候,使用GNU 的make工具根據(jù)當(dāng)前的Makefile進(jìn)行工程編譯。 p版本
15、控制 30 工程管理工具M(jìn)ake與Makefile /* main.c */ #include hello.h int 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+) printf(argv%d = %sn,i,argvi); return 0; /* hello.h */ int hello(int argc,char*
16、 argv); 31 工程管理工具M(jìn)ake與Makefile # Makefile CC:= gcc HEAD:= hello.h SRC:= hello.c main.c OBJS:= hello.o main.o TT:= hello INC = . CFLAGS = -pipe -w -I$(INC) LDFLAGS = -Wall all:$(TT) $(TT):$(OBJS) $(CC) $(LDFLAGS) $(OBJS) -o $ %.o:%c $(CC) $(CFLAGS) -c $ -o $ clean: rm -f *.o $(TT) 32 5.2.2 項(xiàng)目管理 p工程管理
17、工具M(jìn)ake與Makefile pMakefile是一個(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)目等。不過這個(gè)廣為使用的 版本控制工具還有不少問題,包括中文支持和二進(jìn)制文件的處
18、理都有或多或少的問題。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)制文件等。 34 5.2.3 調(diào)試器 pGDB調(diào)試可以直接在嵌入式系統(tǒng)中使用,此時(shí)主機(jī)在調(diào)試系統(tǒng) 中的作用僅僅是顯示的終端。由于嵌入式系統(tǒng)與PC相比性能普 遍較低,因此在嵌入式Linux中直接調(diào)試可能造成性能下降。 p嵌入式系統(tǒng)的遠(yuǎn)程GDB調(diào)試的原理是在目標(biāo)機(jī)上運(yùn)行GDB serve
19、r,而在主機(jī)上運(yùn)行GDB,二者通過某種協(xié)議進(jìn)行連接。 這樣做的好處是將GDB調(diào)試系統(tǒng)的某部分工作移到主機(jī)上,由 此可以節(jié)省目標(biāo)機(jī)的部分資源。 35 GDB調(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 使用gdb啟動(dòng)被調(diào)試的程序。 36 GD
20、B調(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 over step 執(zhí)行下一行,進(jìn)入函數(shù),相當(dāng)于step in run 執(zhí)行當(dāng)前調(diào)試的程序,可以加參數(shù) quit 退出GDB 37 提綱提綱 嵌入式軟件開發(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ā) 38 5.3 構(gòu)建嵌入式Linu
21、x系統(tǒng) 5.3.1 嵌入式Linux系統(tǒng)的構(gòu)建流程 5.3.2 Bootloader 5.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)建中,Bootload
22、er和 Linux內(nèi)核內(nèi)核一般都有相對(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)
23、的時(shí)候 掛接掛接(mount)根文件系統(tǒng)。 44 pBootloader的作用 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 用戶接口功能 45 p嵌入式linux的引導(dǎo)方式 5.3.2 Bootloader 啟動(dòng)加載(Bootloader)模式: 也稱為“自主”(Autonomous)模式。在這種 情況下,Bootload
24、er 從目標(biāo)機(jī)上的某個(gè)固態(tài)存儲(chǔ)設(shè)備 上將操作系統(tǒng)加載到 RAM 中運(yùn)行,整個(gè)過程并沒有并沒有 用戶的介入用戶的介入。 下載(Downloading)模式: 目標(biāo)機(jī)上的 Bootloader 通過串口連接或網(wǎng)絡(luò)連接 等通信手段從主機(jī)(Host)下載文件。該模式通常用 于嵌入式產(chǎn)品的設(shè)計(jì)、調(diào)試設(shè)計(jì)、調(diào)試階段。 46 pLinux內(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
25、.3 Linux內(nèi)核 47 Linux內(nèi)核配置和編譯的流程 Linux內(nèi)核從配置到安裝大致有如下步驟: p配置內(nèi)核:最常見的命令為 make menuconfig p建立依賴關(guān)系:最常見的命令為 make dep p編譯內(nèi)核:最常見的命令為 make 或 make zImage p編譯內(nèi)核模塊:最常見的命令為 make modules p安裝內(nèi)核模塊:最常見的命令為 make modules_install p安裝內(nèi)核:最常見的命令為 make install 48 Linux內(nèi)核配置 內(nèi)核都會(huì)在配置完后生成一個(gè).config文件,還會(huì)產(chǎn)生大量的符號(hào) 連接和頭文件,這些在其余的創(chuàng)建過程中會(huì)用到
26、。.config 文件中保 存了根據(jù)在menuconfig中的選擇定義的相應(yīng)變量,在Linux內(nèi)核目錄 下的Makefile文件中將會(huì)包含這個(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 (
27、字符設(shè)備) p File systems (文件系統(tǒng)) p Console drivers (控制臺(tái)驅(qū)動(dòng)) 可以參考配置界面中的說明來確定每個(gè)選項(xiàng)的含義,不需 要的功能都可以去掉,這樣可以有效減小內(nèi)核的尺寸! 49 Linux內(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 目錄。 50 pLinux下的
28、文件系統(tǒng) p嵌入式Linux的文件系統(tǒng)介紹 pLinux的根文件系統(tǒng) 5.3.4 根文件系統(tǒng) 51 Linux下的文件系統(tǒng) 文件系統(tǒng)(File System)是文件存放文件存放在磁盤等存儲(chǔ)設(shè) 備上的組織方式組織方式,主要作用體現(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)樹上
29、。 52 Linux下的文件系統(tǒng) 53 嵌入式Linux的文件系統(tǒng)介紹 在嵌入式Linux中,常見的文件系統(tǒng)有以下幾種: p EXT2/3 (擴(kuò)展文件系統(tǒng)擴(kuò)展文件系統(tǒng)2/3) p ROMFS (Read Only Memory 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 A
30、nother Flash File System,另一種FLASH文件系統(tǒng)) 54 Linux的根文件系統(tǒng) Linux 的根文件系統(tǒng)的主要目錄: p/bin:包含基本的用戶命令工具程序 p/sbin:包含基本的系統(tǒng)管理程序 p/boot:包含內(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/
31、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ǔ) 嵌入式嵌入式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ā) 56 5.4 嵌入式Linux系統(tǒng)移植 5.4.1 Bootloader(引導(dǎo)加載器) 5.4.2 基于ARM-with MMU的Linux移植 5.4.3 基于ARM-noMMU的CL
32、inux移植 57 5.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)核映像加載到RAM中, 然后運(yùn)行,這時(shí)系統(tǒng)控制權(quán)交給操作系統(tǒng)。 58 Bootloader本質(zhì)上也是一個(gè)程序,也需要通過交叉編譯工 具生成二進(jìn)制代碼,但Bootloader與普通C語言程序存在 著明顯區(qū)別。 在Linux系統(tǒng)中,一般的C語言可執(zhí)行程序是依賴于操作 系統(tǒng)的,可能包含一些頭信息,還可能使用C語言基礎(chǔ)
33、函數(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都分為stage1和stage2兩大部分。 依賴于CPU體系結(jié)構(gòu)的代碼,例如設(shè)備初始化代碼等,通常都 放在stage1中,而且通常都用匯編語言匯編語言來實(shí)現(xiàn),以達(dá)到短小精 悍的目的。 而stage2則通常用C語言語言來實(shí)現(xiàn),這樣可以實(shí)現(xiàn)更復(fù)雜的功能, 而且代碼會(huì)具有更好的可讀性可
34、讀性和可移植性可移植性。 與體系結(jié)構(gòu)相關(guān) 5.4.1 Bootloader的開發(fā) 60 Bootloader的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語言的運(yùn)行環(huán)境 5.4.1 Bootloader的開發(fā) 61 Bootloader的stage1通常包括以下步驟 (以執(zhí)行的先后為順序): p硬件設(shè)備初始化硬件設(shè)備初始化 p為加載Bootloader的stage2準(zhǔn)備RAM空間 p拷貝Bootload
35、er的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) 62 Bootloader的stage1通常包括以下步驟 (以執(zhí)行的先后為順序): 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 Bo
36、otloader的開發(fā) 為了獲得更快的執(zhí)行速度,通常把stage2加載到 RAM空間中來執(zhí)行,因此必須為加載Bootloader 的stage2準(zhǔn)備好一段可用的RAM空間。 63 Bootloader的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ā) stage2的可執(zhí)行映像在固態(tài)存儲(chǔ)設(shè)備的存放起始 地址和終止地址; 為stage2所安排的RAM空間的起始地址。
37、 64 5.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) 65 Bootloader的stage1通常包括以下步驟 (以執(zhí)行的先后為順序): p硬件設(shè)備初始化 p為加載Bootloader的stage2準(zhǔn)備RAM空間 p拷貝Bootloader的stage2到RAM空間中 p設(shè)置堆棧 p跳轉(zhuǎn)到跳轉(zhuǎn)到stage2的的C入口點(diǎn)入口點(diǎn) 5.4.1 Bo
38、otloader的開發(fā) 在上述一切都就緒后,可以跳轉(zhuǎn)到Bootloader的 stage2去執(zhí)行了。 在ARM系統(tǒng)中,可以通過修改PC(R15)值為合 適的地址來實(shí)現(xiàn)(如 LDR指令) 66 Bootloader的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ā) 67 Bootloader的stage2通常包括以下步驟 (以執(zhí)行的先后為順序): p初始化本階段要使用到的硬件設(shè)
39、備 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ā) 68 Bootloader的stage2通常包括以下步驟 (以執(zhí)行的先后為順序): p初始化本階段要使用到的硬件設(shè)備初始化本階段要使用到的硬件設(shè)備 p檢測(cè)系統(tǒng)內(nèi)存映射(memory map) p將kernel映像和根文件系統(tǒng)映像從flash上讀到RAM 空間中 p為內(nèi)核設(shè)置啟動(dòng)
40、參數(shù) p調(diào)用內(nèi)核 初始化至少一個(gè)串口,以便和終端用戶進(jìn)行I/O 輸出信息; 初始化定時(shí)器等。 設(shè)備初始化完成后,可以輸出一些打印信息、 程序名字符串、版本號(hào)等。 5.4.1 Bootloader的開發(fā) 69 Bootloader的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空間。 Bootloader的
41、stage2必須先檢測(cè)整個(gè)系統(tǒng)的內(nèi)存映 射情況。 檢測(cè)完系統(tǒng)的內(nèi)存映射情況后,Bootloader也可以 將內(nèi)存映射的詳細(xì)信息打印到串口。 5.4.1 Bootloader的開發(fā) 70 Bootloader的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+
42、 = *src+; count -= 4; ; 71 Bootloader的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ā) 72 Bootlo
43、ader的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)核調(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)閉。
44、 5.4.1 Bootloader的開發(fā) 73 課程小結(jié)課程小結(jié) 1.1.嵌入式軟件開發(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)拷貝B
45、ootloader的stage2到 RAM空間中 (4)設(shè)置堆棧 (5)跳轉(zhuǎn)到stage2的C入口點(diǎn) stage2通常包括以下步驟 (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)核 74 5.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,
46、絕大 多數(shù)使用C語言編寫的系統(tǒng)內(nèi)核都是相同的,只有部分 與體系結(jié)構(gòu)相關(guān)的代碼使用相應(yīng)的匯編語言編寫。 因此,許多桌面Linux的程序都可以很容易移植到嵌入 式的ARM系統(tǒng)中。 75 5.4.2 基于ARM-with MMU的Linux移植 1. Linux內(nèi)核組成 76 代碼部分代碼部分程序語言程序語言描述描述 linux 2.x/initC初始化代碼,包括C語言入口函數(shù)main.c linux 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/ne
47、tC網(wǎng)絡(luò)代碼 linux 2.x/driversC驅(qū)動(dòng)程序代碼 包含char、block、net等子目錄 linux 2.x/includeC頭文件各部分代碼頭文件 linux 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移植 77 5.4.2 基于ARM-with MMU的Linux移植 例如mach-sa1100是對(duì)Intel Strong ARM內(nèi)核的SA1100的支持,mach- at91rm9200是對(duì)AT91rm9200的支持
48、。 對(duì)處理器進(jìn)行操作系統(tǒng)移植的時(shí)候,實(shí) 際上就可以根據(jù)相近的處理器出發(fā),新 建一個(gè)mach-XXX文件夾。 78 5.4.2 基于ARM-with MMU的Linux移植 3. ARM Linux系統(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)。 79 3. ARM Linux 系統(tǒng)的初始化過程 80 5.4.2 基于ARM
49、-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é)。 需要將硬件的中斷轉(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
50、/arch-XXX頭文件 這些是需要在內(nèi)核和內(nèi)核模塊中使用的頭文 件。在include/arm目錄中的每一個(gè)arch-XXX表 示了一種Linux支持ARM處理器,對(duì)于新增的處 理器需要增加一個(gè)arch-XXX目錄。 arch/arm/mach-XXX處理器 移植文件 這是移植主要需要的文件,既包括C語言文件, 也包括匯編文件。針對(duì)每種處理器需要增加各 種實(shí)現(xiàn)。 arch/arm/共同代碼部分ARM的 公共代碼 對(duì)于某些處理器,需要更改針對(duì)ARM處理器的 共同代碼部分,一般使用條件編譯的方式 Makefile和config文件編譯腳本 Linux內(nèi)核編譯過程中,需要配置的腳本決定 編譯的文件,
51、選擇移植的體系結(jié)構(gòu)。 4. 基于PXA 2xx嵌入式系統(tǒng)的ARM Linux移植 (1)irq.h:中斷系統(tǒng)頭文件 (2)dma.h:DMA系統(tǒng)頭文件 (3)io.h:I/O空間操作相關(guān)定義 (4)hardware.h:系統(tǒng)硬件頭文件,一般包括寄存器定義等 (5)memory.h:定義物理內(nèi)存偏移量以及虛擬內(nèi)存到DMA可見內(nèi)存的轉(zhuǎn)換 (6)system.h:一般定義系統(tǒng)空閑(arch_idle)和復(fù)位(arch_reset)兩個(gè)函數(shù) (7)timex.h:定義時(shí)鐘節(jié)拍(CLOCK_TICK_RATE),用于內(nèi)核計(jì)算時(shí)間 82 中斷系統(tǒng)的移植 中斷系統(tǒng)的移植是Linux操作系統(tǒng)在ARM移植的核心
52、部 分。中斷系統(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-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移植
53、 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í)鐘定義 include/asm-arm/arch-pxa/time.h:PXA定時(shí)器頭文件 4. 基于PXA 2xx嵌入式系統(tǒng)的ARM Linux移植 84 5.4.3 基于ARM-noMMU的CLinux移植 CLinux是目前嵌入式linux中最流行
54、的一種。 Micro-Control-Linux,意為“針對(duì)微控制領(lǐng)域而設(shè)計(jì)的 Linux系統(tǒng)”。 從Linux 2.0/2.4內(nèi)核派生而來,沿襲了主流Linux的絕 大部分特性,適合不具備MMU的微處理器/微控制器。 官方網(wǎng)站() 1. CLinux概述 85 5.4.3 基于ARM-noMMU的CLinux移植 虛擬內(nèi)存 Flat(扁平)格式 位置無關(guān)的代碼PIC 多進(jìn)程管理 2. CLinux與標(biāo)準(zhǔn)Linux的主要區(qū)別 86 5.4.3 基于ARM-noMMU的CLinux移植 虛擬內(nèi)存虛擬內(nèi)存 Flat(扁平)格式 位置無關(guān)的代碼PIC 多進(jìn)程
55、管理 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ù)空間中。 87 5.4.3 基于ARM-noMMU的CLinux移植 虛擬內(nèi)存 Flat(扁平)格式(扁平)格式 位置無關(guān)的代碼PIC 多進(jìn)程管理 2. CLinux與標(biāo)準(zhǔn)Linux的主要區(qū)別 CLinux下的可執(zhí)行程序不能使用通用的ELF格 式,而需要使用新的Flat(扁平)文件格
56、式; 通常編譯器不支持生成Flat文件格式,需要通過 中間格式轉(zhuǎn)換,如elf,使用elf2flat;或者coff (Common Object File Format),使用coff2flat轉(zhuǎn)換。 88 5.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)。 l一旦程序被加載到RAM中,其基準(zhǔn)地址就“固定”下 來; l或產(chǎn)生只使用相對(duì)尋址的代碼,即與位置無關(guān)代碼 (Position In
57、dependent Code, PIC) 89 5.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()。 90 5.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- 2.6.x Linux- 2.4.x Linux- 2.0.x OS源代碼CLinux
58、的內(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支持的平臺(tái)的默認(rèn)文件 romfs編譯結(jié)果ROM文件系統(tǒng)的目錄結(jié)構(gòu)
59、images編譯結(jié)果包含編譯好的二進(jìn)制內(nèi)核文件,文件系統(tǒng)的鏡像文件 和一個(gè)包含文件系統(tǒng)和內(nèi)核的鏡像 3. CLinux發(fā)布包 92 4. 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)試方式有哪些
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 專項(xiàng)5 標(biāo)點(diǎn)(原卷版)
- 河北省石家莊市新樂一中2024-2025學(xué)年高一下學(xué)期第一次月考生物試題(原卷版+解析版)
- 商品陳列大全
- 2025年初中魯科版(五四學(xué)制)八年級(jí)上冊(cè)第四章第二節(jié)《探究凸透鏡成像規(guī)律》說課稿
- 【國(guó)金證券】人形機(jī)器人行業(yè)研究:人形機(jī)器人從理想走進(jìn)現(xiàn)實(shí)
- 英語護(hù)士應(yīng)聘簡(jiǎn)歷
- 2025年廣東省初中學(xué)業(yè)水平考試模擬英語試題(原卷版+解析版)
- 《會(huì)計(jì)信息系統(tǒng)應(yīng)用》課件 學(xué)習(xí)情境2 系統(tǒng)管理和基礎(chǔ)設(shè)置
- 二零二五年度北京市電子產(chǎn)品寄存與智能監(jiān)控服務(wù)協(xié)議
- 二零二五年度辦公空間互換及增值服務(wù)合作協(xié)議
- 《C#程序設(shè)計(jì)基礎(chǔ)》課件
- 2024年第五屆美麗中國(guó)全國(guó)國(guó)家版圖知識(shí)競(jìng)賽題庫及答案(中小學(xué)組)
- 2025年江蘇航空職業(yè)技術(shù)學(xué)院高職單招職業(yè)適應(yīng)性測(cè)試近5年常考版參考題庫含答案解析
- 2025年上海市各區(qū)初三語文一模試題匯編之綜合運(yùn)用
- 2023年湖北省技能高考計(jì)算機(jī)類備考題庫(萬維題庫)-中部分(800題)
- S145水表井標(biāo)準(zhǔn)圖集
- 2025年云南曲靖市事業(yè)單位定向招聘駐曲部隊(duì)未就業(yè)隨軍家屬10人歷年管理單位筆試遴選500模擬題附帶答案詳解
- 第4章水彈性力學(xué)-流體與剛體、彈性體相互耦合運(yùn)動(dòng)理論
- 2024年10月自考13003數(shù)據(jù)結(jié)構(gòu)與算法試題及答案
- 單招建筑技能考試題及答案
- 專題11 大國(guó)崛起和大國(guó)關(guān)系(測(cè)試)
評(píng)論
0/150
提交評(píng)論