版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
嵌入式Linux的軟件開發(fā)環(huán)境
編譯原理Linux環(huán)境下的GCC及ARM交叉編譯器的概念和使用調(diào)試技術(shù)內(nèi)核編譯、裁減以及Linux的移植嵌入式Linux的軟件開發(fā)環(huán)境編譯原理1什么是編譯程序從功能上看,一個(gè)編譯程序就是一個(gè)語言翻譯程序,它把一種語言(稱作源語言)書寫的程序翻譯成另一種語言(稱作目標(biāo)語言)的等價(jià)的程序.什么是編譯程序2功能術(shù)語編譯程序的源語言(源程序)編譯程序的目標(biāo)語言(目標(biāo)程序)編譯程序的實(shí)現(xiàn)語言SOI高級(jí)語言書寫的程序編譯程序低級(jí)語言程序STI功能術(shù)語SOI高級(jí)語言編譯程序低級(jí)語言程3什么是編譯程序分類軟件系統(tǒng)軟件語言處理系統(tǒng)操作系統(tǒng)編譯系統(tǒng)裸機(jī)什么是編譯程序分類操作系統(tǒng)編譯系統(tǒng)裸機(jī)4分類軟件:計(jì)算機(jī)系統(tǒng)中的程序及其文檔系統(tǒng)軟件:居于計(jì)算機(jī)系統(tǒng)中最靠近硬件的一層,其他軟件一般都通過系統(tǒng)軟件發(fā)揮作用。他和具體的應(yīng)用領(lǐng)域無關(guān),如編譯系統(tǒng)和操作系統(tǒng)等。語言處理系統(tǒng):把軟件語言書寫的各種程序處理成可在計(jì)算機(jī)上執(zhí)行的程序。軟件語言:用于書寫軟件的語言。它主要包括需求定義語言,功能性語言,設(shè)計(jì)性語言,程序設(shè)計(jì)語言以及文檔語言。分類軟件:計(jì)算機(jī)系統(tǒng)中的程序及其文檔語言處理系統(tǒng):把軟件語言5
預(yù)處理器編譯器匯編器裝配連接編輯骨架程序
源程序
目標(biāo)匯編程序
可重定位機(jī)器代碼
絕對(duì)機(jī)器碼可重定位目標(biāo)文件庫語言處理過程 預(yù)處理器編譯器匯編器裝配連接編輯骨架程序源程6語言轉(zhuǎn)(變)換系統(tǒng)C++編譯器C++CJavaBytecodeJava編譯器語言轉(zhuǎn)(變)換系統(tǒng)C++編譯器C++CJavaBytecod7術(shù)語編譯程序(compiler)編譯程序的源語言(源程序)(sourcelanguage)(sourceprogram)編譯程序的目標(biāo)語言(目標(biāo)程序)(objectortargetlanguage)(objectortargetprogram)編譯程序的實(shí)現(xiàn)語言(implementationlanguage)語言處理程序(languageprocessor)語言轉(zhuǎn)(變)換(languagetransformation)術(shù)語編譯程序(compiler)8編譯過程和編譯程序的結(jié)構(gòu)編譯邏輯過程詞法分析語法分析語義分析中間代碼生成代碼優(yōu)化目標(biāo)代碼生成編譯過程和編譯程序的結(jié)構(gòu)編譯邏輯過程9詞法分析從左至右讀字符流的源程序、識(shí)別(拼)單詞例:
position:=initial+rate*60;詞法分析從左至右讀字符流的源程序、識(shí)別(拼)單詞10詞法分析
position:=initial+rate*60;
單詞類型
單詞值標(biāo)識(shí)符1(id1) position算符(賦值) :=標(biāo)識(shí)符2(id2) initial算符(加) +標(biāo)識(shí)符3(id3) rate算符(乘) *整數(shù) 60分號(hào) ;詞法分析 position:=initial11又如一個(gè)C源程序片斷:inta;
a=a+2;詞法分析后可能返回:單詞類型
單詞值保留字int標(biāo)識(shí)符(變量名)
a界符;標(biāo)識(shí)符(變量名)
a算符(賦值) =標(biāo)識(shí)符(變量名)a算符(加) +整數(shù) 2界符 ;又如一個(gè)C源程序片斷:inta;12語法分析功能:層次分析.依據(jù)源程序的語法規(guī)則把源程序的單詞序列組成語法短語(表示成語法樹).position:=initial+rate*60;規(guī)則<賦值語句>::=<標(biāo)識(shí)符>“:=”<表達(dá)式><表達(dá)式>::=<表達(dá)式>“+”<表達(dá)式><表達(dá)式>::=<表達(dá)式>“*”<表達(dá)式><表達(dá)式>::=“(”<表達(dá)式>“)”<表達(dá)式>::=<標(biāo)識(shí)符><表達(dá)式>::=<整數(shù)><表達(dá)式>::=<實(shí)數(shù)>語法分析功能:層次分析.依據(jù)源程序的語法規(guī)則把源程序的單詞序13賦值語句標(biāo)識(shí)符表達(dá)式表達(dá)式+表達(dá)式表達(dá)式標(biāo)識(shí)符整數(shù)標(biāo)識(shí)符:=表達(dá)式*賦值語句標(biāo)識(shí)符表達(dá)式表達(dá)式+表達(dá)式表達(dá)式標(biāo)識(shí)符整數(shù)標(biāo)識(shí)符:=14id1:=id2+id3*N :=+N60*id1Positionid2initialid3rateid1:=id2+id3*N :=+N60*id1Pos15語義分析語義審查(靜態(tài)語義)上下文相關(guān)性類型匹配類型轉(zhuǎn)換例: Programp(); Varrate:real; procedureinitial; … position:=initial+rate*60/*error*/ /*error*//*warning*/; …語義分析語義審查(靜態(tài)語義)16又如:
intarr[2],abc;abc=arr*10; …Programp(); Varrate:real; Varinitial:real; Varposition:real;… position:=initial+rate*60嵌入式Linux的軟件開發(fā)環(huán)境分析課件17語義分析(semanticanalysis)60:=+*Id1positionId2initialId3rateinttoreal語義分析(semanticanalysis)60:=+*I18中間代碼生成(intermediatecodegeneration)源程序的內(nèi)部(中間)表示三元式、四元式、P-Code、C-Code、 U-Code、bytecode(* id3 t1 t2 )t2=id3*t1t2:=id3*t1中間代碼生成(intermediatecodegener19中間代碼生成
id1:=id2+id3*60(1) (inttoreal, 60 - t1 )(2) (* , id3 t1 t2 )(3) (+ , id2 t2 t3 )(4) (:= , t3 - id1 )中間代碼生成 id1:=id2+id3*6020代碼優(yōu)化
id1:=id2+id3*60(1) (inttoreal 60 - t1 )(2) (* id3 t1 t2 )(3) (+ id2 t2 t3 )(4) (:= t3 - id1 )變換(1)(* id3 60.0 t1 )(2)(+ id2 t1 id1 )代碼優(yōu)化 id1:=id2+id3*6021代碼優(yōu)化(codeoptimization)t1=b*ct1=b*ct2=t1+0t2=t1+t1t3=b*ca=t2t4=t2+t3a=t4代碼優(yōu)化(codeoptimization)t1=b*22目標(biāo)代碼生成(* , id3 60.0 t1 )(+ , id2 t1 id1 )movf id3,R2mulf #60.0,R2movf id2,R1addf R2,R1movf R1,id1目標(biāo)代碼生成(* , id3 60.0 t1 )movf i23符號(hào)表管理(symboltable)記錄源程序中使用的名字收集每個(gè)名字的各種屬性信息類型、作用域、分配存儲(chǔ)信息Const1 常量 值:35Var1 變量 類型:實(shí) 層次:2符號(hào)表管理(symboltable)記錄源程序中使用的名字24出錯(cuò)處理(errorhandling)
檢查錯(cuò)誤、報(bào)告出錯(cuò)信息、排錯(cuò)、恢復(fù)編譯工作出錯(cuò)處理(errorhandling) 檢查錯(cuò)誤、報(bào)告出25編譯程序結(jié)構(gòu)(components)詞法分析程序語法分析程序語義分析程序中間代碼生成程序代碼優(yōu)化程序目標(biāo)代碼生成程序符號(hào)表管理程序出錯(cuò)處理程序編譯程序結(jié)構(gòu)(components)詞法分析程序26出錯(cuò)處理語法分析程序語義分析程序目標(biāo)代碼生成程序詞法分析程序中間代碼生成程序代碼優(yōu)化程序表格管理出語法分析程序語義分析程序目標(biāo)代碼生成程序詞法分析程序中間代27編譯階段的組合分析,綜合(synthesis)源程序的分析線性分析層次分析語義分析目標(biāo)程序的綜合編譯的前端(frontend)編譯的后端(backend)遍(趟)從頭到尾掃描源程序(各種形式)一遍(pass)編譯階段的組合分析,綜合(synthesis)28高級(jí)語言解釋系統(tǒng)(interpreter)功能讓計(jì)算機(jī)執(zhí)行高級(jí)語言(basic,Matlab,prolog)與編譯程序的不同1)不生成目標(biāo)代碼2)能支持交互環(huán)境(同增量式編譯系統(tǒng))源程序
初始數(shù)據(jù)高級(jí)語言解釋系統(tǒng)(interpreter)功能29解釋系統(tǒng)直接對(duì)源程序中的語句進(jìn)行分析,執(zhí)行其隱含的操作。如:……
b:=2;a:=b+2;編譯程序
writea;……解釋程序直接將4的值輸出(顯示)解釋系統(tǒng)直接對(duì)源程序中的語句進(jìn)行分析,執(zhí)行其隱含的操作。30編譯階段和運(yùn)行階段存儲(chǔ)結(jié)構(gòu)名字表目標(biāo)代碼緩沖區(qū)編譯用源程序中間表示各種表格目標(biāo)代碼區(qū)數(shù)據(jù)區(qū)源程序緩沖區(qū)編譯階段和運(yùn)行階段存儲(chǔ)結(jié)構(gòu)名字表目標(biāo)代碼緩沖區(qū)編譯用源程序中31編譯技術(shù)的發(fā)展和應(yīng)用功能:程序集成環(huán)境實(shí)現(xiàn)方式手工機(jī)器語言匯編系統(tǒng)程序設(shè)計(jì)語言自動(dòng)構(gòu)造工具lexyaccgcc編譯技術(shù)的發(fā)展和應(yīng)用功能:程序集成環(huán)境32編譯程序的發(fā)展語言范型(paradigms)命令式(imperativelanguage)應(yīng)用式(applicative)基于規(guī)則的(rule-based)面向?qū)ο蟮模╫bject-oriented)編譯程序執(zhí)行環(huán)境批處理交互環(huán)境嵌入系統(tǒng)環(huán)境編譯程序的發(fā)展語言范型(paradigms)33研究領(lǐng)域并行編譯技術(shù)交叉編譯技術(shù)硬件描述語言及其編譯技術(shù)研究領(lǐng)域并行編譯技術(shù)34并行化編譯技術(shù)目的:提高并行計(jì)算機(jī)體系結(jié)構(gòu)的性能。超大規(guī)模計(jì)算的日益增長的需求高性能計(jì)算機(jī)并行軟件并行體系結(jié)構(gòu)單機(jī)速度并行體系結(jié)構(gòu)途徑1途徑2并行化編譯技術(shù)目的:提高并行計(jì)算機(jī)體系結(jié)構(gòu)的性能。并行體系結(jié)35
并行體系結(jié)構(gòu)
編譯技術(shù)支持
串行程序并行化編譯技術(shù)支持并行程序設(shè)計(jì)語言編譯
依賴于目標(biāo)機(jī)的優(yōu)化(低層)
36由于目標(biāo)機(jī)指令系統(tǒng)與宿主機(jī)的指令系統(tǒng)不同,編譯時(shí)將應(yīng)用程序的源程序在宿主機(jī)上生成目標(biāo)機(jī)代碼,稱為交叉編譯。SOIOAB由于目標(biāo)機(jī)指令系統(tǒng)與宿主機(jī)的指令系統(tǒng)不同,編譯時(shí)將應(yīng)用程序的37交叉編譯器交叉編譯器38硬件描述語言及其編譯技術(shù)電路設(shè)計(jì)依據(jù)驗(yàn)證結(jié)果如:VHDL硬件描述語言及其編譯技術(shù)電路設(shè)計(jì)依據(jù)39嵌入式開發(fā)工具基本概念嵌入式系統(tǒng)和系統(tǒng)軟件級(jí)的開發(fā)所需的計(jì)算機(jī)知識(shí)較多,而首當(dāng)其沖的是嵌入式開發(fā)工具的學(xué)習(xí),首先我們需要清楚的是為什么我們需要嵌入式開發(fā)工具:在嵌入式系統(tǒng)開發(fā)中目標(biāo)機(jī)與宿主機(jī)是分離的,它們之間往往具有不同的組織結(jié)構(gòu),例如:我們?cè)谘芯窟^程中宿主機(jī)一般均為PC,而目標(biāo)機(jī)為不同的開發(fā)板,這些開發(fā)板和PC具有不同的體系結(jié)構(gòu),而我們?yōu)榱耸乖冢校蒙线\(yùn)行的程序在目標(biāo)機(jī)上能夠運(yùn)行就需要將源程序編譯成相應(yīng)的目標(biāo)代碼,而這就是我們需要嵌入式開發(fā)工具的主要原因.嵌入式開發(fā)工具基本概念嵌入式系統(tǒng)和系統(tǒng)軟件級(jí)的開發(fā)所需40嵌入式開發(fā)工具簡介(一)在眾多嵌入式開發(fā)工具中GNUTools(基于OpenSource的軟件)是Linux環(huán)境下最重要的開發(fā)工具集,為了有效的開發(fā)嵌入式系統(tǒng),至少需要了解和掌握如下幾類工具:(1)編譯開發(fā)工具:即能夠把一個(gè)源程序編譯生成一個(gè)可執(zhí)行的軟件,如gcc等。(2)調(diào)試工具:即能夠?qū)?zhí)行程序進(jìn)行源碼或匯編級(jí)調(diào)試的軟件,如gdb。(3)軟件工程工具:用于協(xié)助多人開發(fā)或大型軟件項(xiàng)目的管理的軟件,如make,cvs。嵌入式開發(fā)工具簡介(一)在眾多嵌入式開發(fā)工具中41嵌入式開發(fā)工具簡介(二)在GNUTools中最基本的一些工具就包括:
ld(鏈接器),as(匯編器),gcc(C語言編譯器),glibc(包含各種基本函數(shù)實(shí)現(xiàn)的軟件庫)上述大部分軟件均可以在/gnu/上下載。嵌入式開發(fā)工具簡介(二)在GNUTools中最42嵌入式開發(fā)工具簡介(三)
binutils是一組二進(jìn)制工具程序集,它主要包括鏈接器,匯編器和其它用于處理目標(biāo)文件和檔案的工具。其中鏈接器為ld,它的主要作用是把各種目標(biāo)文件(.O文件和)和庫文件鏈接在一起,并根據(jù)定位數(shù)據(jù)和函數(shù)的地址,最終生成執(zhí)行程序。匯編器主要是AS:是GNU編譯器的匯編器(Assembler),負(fù)責(zé)把.S或.s為后綴的匯編文件編譯成.以.o為后綴的目標(biāo)文件處理目標(biāo)文件和檔案的主要工具是ar,它用于建立,修改和提取歸檔文件。一個(gè)歸檔文件是包含多個(gè)被包含文件的單個(gè)文件程序員可以從歸檔文件中檢索并得到原始的被包含文件的內(nèi)容,模式,時(shí)間戳,所有者和組等屬性嵌入式開發(fā)工具簡介(三)binutils是一組二進(jìn)43嵌入式開發(fā)工具簡介(四)glibc是GNU的C語言標(biāo)準(zhǔn)程序庫,C語言將部分函數(shù)留給操作系統(tǒng)來實(shí)現(xiàn),當(dāng)我們的程序需要調(diào)用時(shí),就要通過操作系統(tǒng)提供的C程序庫來取得這些服務(wù)。程序庫與應(yīng)用程序的鏈接方式可分為靜態(tài)與動(dòng)態(tài)鏈接兩種方式,當(dāng)應(yīng)用程序需要一個(gè)動(dòng)態(tài)鏈接庫時(shí)就需要我們自己安裝一個(gè)動(dòng)態(tài)庫在Linux操作系統(tǒng)中。嵌入式開發(fā)工具簡介(四)glibc是GNU的C44嵌入式開發(fā)工具簡介(五)Gcc編譯工具:gcc是一個(gè)強(qiáng)大的工具集合,它主要為GNU提供C編譯器,現(xiàn)在Gcc也開始支持多種工具語言,如JAVA,F(xiàn)ORTRAN等。如果能較好的掌握它,我們就能夠通過它提供的足夠多的參數(shù)來全面控制代碼的生成。嵌入式開發(fā)工具簡介(五)Gcc編譯工具:gcc是45GNUTools的安裝(一)在安裝GNUTools之前你需要注意的有兩個(gè)問題:(一)需要了解宿主機(jī)和目標(biāo)機(jī)的體系結(jié)構(gòu)。這是因?yàn)椴煌捏w系結(jié)構(gòu)所需的開發(fā)工具的版本是不同的。(二)不同開發(fā)工具之間版本的控制。GNUTools的安裝(一)在安裝GNUTool46GNUTools的安裝(二)此圖列出了到目前為止成功的版本配置宿主機(jī)目標(biāo)機(jī)OS內(nèi)核BinutilsGccGlibcI386i386Linux2.4.x2.14.903.3.12.3.2i386ppcLinux2.4.x2.10.12.95.32.2.1i386armLinux2.4.x2.13.903.2.12.3.1i386mipsLinux2.4.x2.8.1Egcs-1.1.22.0.6sparcppcLinux2.4.x2.10.12.95.22.1.3ppcarmLinux2.4.x2.10.12.95.32.2.3i386strongarmLinux2.6.x2.14.13.3.32.3.2i386xscaleLinux2.6.x2.14.13.3.32.3.2GNUTools的安裝(二)此圖列出了到目前為止成功的版本47GNUTools的安裝(三)對(duì)于每個(gè)單獨(dú)的工具軟件包,它的配置/編譯/安裝過程一般包括如下幾步:(1)下載并解壓軟件包;(2)配置軟件包;(3)編譯軟件包;(4)安裝軟件包;為了安裝某些GNUTools,可能還需要對(duì)Linux內(nèi)核的include文件進(jìn)行配置,這主要是由于glibc的安裝是與Linux內(nèi)核相關(guān)的。GNUTools的安裝(三)對(duì)于每個(gè)單獨(dú)的工具軟件48Bootloader概念(一)在專用的的嵌入式板上運(yùn)行l(wèi)inux已經(jīng)獲得了越來越廣泛的應(yīng)用,一個(gè)嵌入式linux系統(tǒng)從軟件的角度看通??梢苑譃?個(gè)層次(1)引導(dǎo)加載程序;(2)linux內(nèi)核.特定于嵌入式板子的定制內(nèi)核以及內(nèi)核的啟動(dòng)參數(shù);(3)文件系統(tǒng);(4)用戶應(yīng)用程序。bootloader軟件正是屬于引導(dǎo)加載程序的一部分。Bootloader概念(一)在專用的的嵌入式板49Bootloader概念(二)
在一般的PC中開機(jī)過程可分為BIOS和BootManger兩步:1.BIOS(Baiscinputoutputsystem),它存在于主板的flashRom上,負(fù)責(zé)硬件初始化的程式2.BootManager:它不象BIOS那樣與硬件結(jié)合的如此緊密.例如一套BootManager在X86系統(tǒng)上寫好后,就可在所有的X86機(jī)上使用.BootManager的工作是負(fù)責(zé)將Kernel載入,有時(shí)它還負(fù)責(zé)從多個(gè)硬盤分區(qū)載入OS,例如在同一臺(tái)PC上同時(shí)有l(wèi)inux和windows,我們就靠著在MBR上的BootManager來選擇要載入windows或是linux,同時(shí)BootManager也要負(fù)責(zé)一系列的初始化動(dòng)作.Bootloader概念(二)在一般的PC中開機(jī)過50Bootloader概念(三)
在嵌入式系統(tǒng)中通常是沒有BIOS那樣的固件程序的因此整個(gè)系統(tǒng)加載啟動(dòng)任務(wù)就完全由Bootloader來完成.雖然有很多種Bootloader,但大多Bootloader可以分為兩個(gè)步驟來完成:
Stage1:(1)硬件設(shè)備初始化(如I/O口,存儲(chǔ)器和時(shí)鐘).(2)為加載Bootloader的stage2準(zhǔn)備好RAM空間.(3)復(fù)制Bootloader的到RAM空間中.(4)設(shè)置好堆棧.(5)跳轉(zhuǎn)到stage2的C入口點(diǎn).Stage2:(1)初始化本階段要使用的硬件設(shè)備.(2)檢測系統(tǒng)的內(nèi)存映射.(3)將kernel映像和根文件系統(tǒng)映像從Flash上讀到RAM空間中.(4)從內(nèi)核設(shè)置啟動(dòng)參數(shù).(5)調(diào)用內(nèi)核.Bootloader概念(三)在嵌入式系統(tǒng)51Bootloader的安裝步驟根據(jù)我們以前介紹的知識(shí)我們?cè)诰幾g安裝一個(gè)bootloader到目標(biāo)板時(shí)首先需要找到一個(gè)適合目標(biāo)板的bootloader軟件,接著我們就需要為編譯安裝這個(gè)軟件到目標(biāo)板準(zhǔn)備必要的工具軟件,最后才是將編譯好的bootloader軟件下載到目標(biāo)板上。Bootloader的安裝步驟根據(jù)我們以前介紹的知52bootloader軟件的選擇目前應(yīng)用的比較廣泛的bootloader軟件有ARMboot,Redboot,U-boot等,這些軟件支持的CPU和所需要的開發(fā)環(huán)境各不相同,其中ARMBOOT支持基于ARM720T,ARM920T等CPU的開發(fā)板。而U-boot是迄今為止功能更為強(qiáng)大的開源bootloader軟件,它支持多種處理器平臺(tái),包括PPC,ARM,X86以及MIPS等。bootloader軟件的選擇目前應(yīng)用的比較廣53交叉編譯工具的選擇(一)在安裝交叉編譯環(huán)境之前你首先需要清楚你宿主機(jī)和目標(biāo)機(jī)的體系結(jié)構(gòu),以一套宿主機(jī)為安裝有Linux-的以X86結(jié)構(gòu)為基礎(chǔ)的PC機(jī),宿主機(jī)是以在安裝交叉編譯環(huán)境之前你首先需要清楚你宿主機(jī)和目標(biāo)機(jī)的體系結(jié)構(gòu),以一套宿主機(jī)為安裝有Linux-2.4.20.8的以X86結(jié)構(gòu)為基礎(chǔ)的PC機(jī),宿主機(jī)是以ARM9內(nèi)核為基礎(chǔ)的InteiPXA255開發(fā)板。交叉編譯工具的選擇(一)在安裝交叉編譯環(huán)境之前54交叉編譯工具的選擇(二)我們首先要找到交叉編譯環(huán)境中幾個(gè)重要的部分:針對(duì)目標(biāo)系統(tǒng)的編譯器GCC;針對(duì)目標(biāo)系統(tǒng)的二進(jìn)制工具binutils;目標(biāo)系統(tǒng)的標(biāo)準(zhǔn)C庫glibc。交叉編譯工具的選擇(二)我們首先要找到交叉編譯55交叉編譯工具的選擇(三)通過查詢資料可知最新的一套適合i386—arm體系的交叉編譯工具集是:binutils-2.14.tar.gz
gcc-3.3.2.tar.gz
glibc-2.2.5.tar.gz
glibc-linuxthreads-2.2.5.tar.gz
交叉編譯工具的選擇(三)通過查詢資料可知最新的一套56交叉編譯工具的安裝將以上工具集下載到你指定的目錄下后,就可解壓縮并安裝這些文件,需要注意的是在安裝完這些文件后,最好在/root/.bashrc文件中指明交叉編譯工具的路徑,這樣你在運(yùn)行arm-linux-gcc時(shí)就可以不考慮目錄的路徑讓shell自動(dòng)的尋找路徑。交叉編譯工具的安裝將以上工具集下載到你指定的目錄57Bootloader的移植(一)在安裝好交叉編譯工具后你就可以編譯bootloader軟件了,一般在bootloader軟件的Readme文檔中都會(huì)有編譯步驟,在有些文檔中還會(huì)有常見錯(cuò)誤(commonerror)的解決方法。
編譯好bootloader后,一般會(huì)生成一個(gè)。Bin文件,這就是我們要移植到開發(fā)板中的二進(jìn)制文件。Bootloader的移植(一)在安裝好交叉編譯工58Bootloader的移植(二)在得到.bin文件后我們就可以將它移植到目標(biāo)板上了,這時(shí)我們就需要移植工具來幫助我們,當(dāng)然針對(duì)不同的開發(fā)板有不同的移植工具。我們以IntelPXA255開發(fā)板為例,此開發(fā)板是通過JTAG口來加載bootoader,在連接好JTAG線之后,我們又需要一個(gè)JFlash-linux軟件,這個(gè)工具是一種直接寫閃存的軟件,通過它我們就可以直接將.bin文件燒寫到開發(fā)板閃存的0x00000000位置。Bootloader也就移植成功。Bootloader的移植(二)在得到.bin59GCC命令格式Gcc[option][filename]Gcc–oprogmain.csub1.csub2.csub3.c–oprog:指定輸出可執(zhí)行文件名為prog,缺省時(shí)為a.out
或先單獨(dú)編譯,然后連接:Gcc–cmain.cGcc–csub1.cGcc–csub2.cGcc–csub3.cGcc–oprogmain.osub1.osub2.osub3.oGCC命令格式Gcc[option][filename]60Make和Makefile自動(dòng)編譯,自動(dòng)確定軟件包的哪部分需要重新編譯并用特定的命令去編譯。Makefile的規(guī)則:目標(biāo)[屬性]分隔符號(hào)[依賴文件][;命令列]{<tab>命令列}Make和Makefile自動(dòng)編譯,自動(dòng)確定軟件包的哪部分需61Prog:main.osubfun.oGcc–oprogmain.osunfun.oMain.o:main.cmain.hGcc–c–I–omain.omain.cSubfun.o:subfun.cGcc–c–osubfun.osunfun.cClean:Rm–f*.oProg:main.osubfun.o62GDB調(diào)試程序
gdb的功能:監(jiān)視你程序中變量的值.設(shè)置斷點(diǎn)以使程序在指定的代碼行上停止執(zhí)行.單步執(zhí)行代碼.GDB調(diào)試程序gdb的功能:63為調(diào)試編譯代碼(CompilingCodeforDebugging)為了使gdb正常工作,你必須使你的程序在編譯時(shí)包含調(diào)試信息.調(diào)試信息包含你程序里的每個(gè)變量的類型和在可執(zhí)行文件里的地址映射以及源代碼的行號(hào).gdb利用這些信息使源代碼和機(jī)器碼相關(guān)聯(lián).在編譯時(shí)用-g選項(xiàng)打開調(diào)試選項(xiàng).
為調(diào)試編譯代碼(CompilingCodeforDeb64gdb基本命令命令描述file裝入想要調(diào)試的可執(zhí)行文件kill終止正在調(diào)試的程序list列出產(chǎn)生執(zhí)行文件的源代碼的一部分next執(zhí)行一行源代碼但不進(jìn)入函數(shù)內(nèi)部step執(zhí)行一行源代碼而且進(jìn)入函數(shù)內(nèi)部run執(zhí)行當(dāng)前被調(diào)試的程序quit終止gdbwatch使你能監(jiān)視一個(gè)變量的值而不管它何時(shí)被改變break在代碼里設(shè)置斷點(diǎn),這將使程序執(zhí)行到這里時(shí)被掛起make使你能不退出gdb就可以重新產(chǎn)生可執(zhí)行文件shell使你能不離開gdb就執(zhí)行UNIXshell命令gdb基本命令命令描述file裝入想要調(diào)試的可執(zhí)行文65編譯內(nèi)核一、升級(jí)內(nèi)核的原因保持最新的核心版本,更穩(wěn)定和可靠裁剪核心,提高效率增加對(duì)新硬件的支持去除內(nèi)核Bug某些新應(yīng)用軟件需要最新的核心版本支持學(xué)習(xí)核心設(shè)計(jì)技術(shù)編譯內(nèi)核一、升級(jí)內(nèi)核的原因66準(zhǔn)備工作確定編譯目的,升級(jí)或修正備份關(guān)鍵數(shù)據(jù)了解硬件配置
lspci列出所有的pci設(shè)備。dmesg也能給出很多有用的信息dmseg了解核心版本號(hào)
uname-a獲取(下載)最新核心源代碼解壓源碼到/usr/src/linux
tarzxvflinux-x.xx.xx.tar.gz
準(zhǔn)備工作確定編譯目的,升級(jí)或修正67編譯源碼清理環(huán)境
makeclean;
makedep;將原始程序與設(shè)備做連接工作,依存關(guān)系配置核心
‘makeconfig’–以命令行形式配置核心‘makemenuconfig’–以文本窗口形式配置核心‘makexconfig’–同上,但只能在X窗口下進(jìn)行根據(jù)命令行或菜單仔細(xì)選擇合適的配置,刪除你的系統(tǒng)不需要的配置,內(nèi)核越小,系統(tǒng)運(yùn)行越快。配置完畢后,存盤退出。編譯源碼清理環(huán)境68編譯核心:makebzImage;若配置時(shí)使用了核心模塊,還需要進(jìn)行系統(tǒng)模組的編譯和安裝。makemodules;makemodules_install更換核心,拷貝boot文件cp/usr/src/linux/arch/i386/boot/bzImage/boot/kernel-2.4.19/boot下面的文件名可以隨意取編譯核心:69配置LILOcd/etc修改lilo.conf,文件結(jié)尾處添加:image=/boot/kernel-2.4.19label=linux-2.4.19read-onlyroot=/dev/hda1重新運(yùn)行l(wèi)ilo重新啟動(dòng)機(jī)器,如果能正常運(yùn)行的話,那么恭喜你,成功了。如果有問題的話,把default修改為舊的內(nèi)核版本,重新運(yùn)行l(wèi)ilo就可以。然后,重新編譯內(nèi)核:cd/usr/src配置LILO70makeclean重新配置,檢查可能存在的問題。安裝補(bǔ)丁安裝補(bǔ)丁十分的簡單,就只要一步:cd/usr/srcpatch-p0<patch-2.4.19makeclean71嵌入式Linux的軟件開發(fā)環(huán)境分析課件72嵌入式Linux的軟件開發(fā)環(huán)境分析課件73嵌入式Linux的軟件開發(fā)環(huán)境分析課件74嵌入式Linux的軟件開發(fā)環(huán)境分析課件75演講完畢,謝謝觀看!演講完畢,謝謝觀看!76嵌入式Linux的軟件開發(fā)環(huán)境
編譯原理Linux環(huán)境下的GCC及ARM交叉編譯器的概念和使用調(diào)試技術(shù)內(nèi)核編譯、裁減以及Linux的移植嵌入式Linux的軟件開發(fā)環(huán)境編譯原理77什么是編譯程序從功能上看,一個(gè)編譯程序就是一個(gè)語言翻譯程序,它把一種語言(稱作源語言)書寫的程序翻譯成另一種語言(稱作目標(biāo)語言)的等價(jià)的程序.什么是編譯程序78功能術(shù)語編譯程序的源語言(源程序)編譯程序的目標(biāo)語言(目標(biāo)程序)編譯程序的實(shí)現(xiàn)語言SOI高級(jí)語言書寫的程序編譯程序低級(jí)語言程序STI功能術(shù)語SOI高級(jí)語言編譯程序低級(jí)語言程79什么是編譯程序分類軟件系統(tǒng)軟件語言處理系統(tǒng)操作系統(tǒng)編譯系統(tǒng)裸機(jī)什么是編譯程序分類操作系統(tǒng)編譯系統(tǒng)裸機(jī)80分類軟件:計(jì)算機(jī)系統(tǒng)中的程序及其文檔系統(tǒng)軟件:居于計(jì)算機(jī)系統(tǒng)中最靠近硬件的一層,其他軟件一般都通過系統(tǒng)軟件發(fā)揮作用。他和具體的應(yīng)用領(lǐng)域無關(guān),如編譯系統(tǒng)和操作系統(tǒng)等。語言處理系統(tǒng):把軟件語言書寫的各種程序處理成可在計(jì)算機(jī)上執(zhí)行的程序。軟件語言:用于書寫軟件的語言。它主要包括需求定義語言,功能性語言,設(shè)計(jì)性語言,程序設(shè)計(jì)語言以及文檔語言。分類軟件:計(jì)算機(jī)系統(tǒng)中的程序及其文檔語言處理系統(tǒng):把軟件語言81
預(yù)處理器編譯器匯編器裝配連接編輯骨架程序
源程序
目標(biāo)匯編程序
可重定位機(jī)器代碼
絕對(duì)機(jī)器碼可重定位目標(biāo)文件庫語言處理過程 預(yù)處理器編譯器匯編器裝配連接編輯骨架程序源程82語言轉(zhuǎn)(變)換系統(tǒng)C++編譯器C++CJavaBytecodeJava編譯器語言轉(zhuǎn)(變)換系統(tǒng)C++編譯器C++CJavaBytecod83術(shù)語編譯程序(compiler)編譯程序的源語言(源程序)(sourcelanguage)(sourceprogram)編譯程序的目標(biāo)語言(目標(biāo)程序)(objectortargetlanguage)(objectortargetprogram)編譯程序的實(shí)現(xiàn)語言(implementationlanguage)語言處理程序(languageprocessor)語言轉(zhuǎn)(變)換(languagetransformation)術(shù)語編譯程序(compiler)84編譯過程和編譯程序的結(jié)構(gòu)編譯邏輯過程詞法分析語法分析語義分析中間代碼生成代碼優(yōu)化目標(biāo)代碼生成編譯過程和編譯程序的結(jié)構(gòu)編譯邏輯過程85詞法分析從左至右讀字符流的源程序、識(shí)別(拼)單詞例:
position:=initial+rate*60;詞法分析從左至右讀字符流的源程序、識(shí)別(拼)單詞86詞法分析
position:=initial+rate*60;
單詞類型
單詞值標(biāo)識(shí)符1(id1) position算符(賦值) :=標(biāo)識(shí)符2(id2) initial算符(加) +標(biāo)識(shí)符3(id3) rate算符(乘) *整數(shù) 60分號(hào) ;詞法分析 position:=initial87又如一個(gè)C源程序片斷:inta;
a=a+2;詞法分析后可能返回:單詞類型
單詞值保留字int標(biāo)識(shí)符(變量名)
a界符;標(biāo)識(shí)符(變量名)
a算符(賦值) =標(biāo)識(shí)符(變量名)a算符(加) +整數(shù) 2界符 ;又如一個(gè)C源程序片斷:inta;88語法分析功能:層次分析.依據(jù)源程序的語法規(guī)則把源程序的單詞序列組成語法短語(表示成語法樹).position:=initial+rate*60;規(guī)則<賦值語句>::=<標(biāo)識(shí)符>“:=”<表達(dá)式><表達(dá)式>::=<表達(dá)式>“+”<表達(dá)式><表達(dá)式>::=<表達(dá)式>“*”<表達(dá)式><表達(dá)式>::=“(”<表達(dá)式>“)”<表達(dá)式>::=<標(biāo)識(shí)符><表達(dá)式>::=<整數(shù)><表達(dá)式>::=<實(shí)數(shù)>語法分析功能:層次分析.依據(jù)源程序的語法規(guī)則把源程序的單詞序89賦值語句標(biāo)識(shí)符表達(dá)式表達(dá)式+表達(dá)式表達(dá)式標(biāo)識(shí)符整數(shù)標(biāo)識(shí)符:=表達(dá)式*賦值語句標(biāo)識(shí)符表達(dá)式表達(dá)式+表達(dá)式表達(dá)式標(biāo)識(shí)符整數(shù)標(biāo)識(shí)符:=90id1:=id2+id3*N :=+N60*id1Positionid2initialid3rateid1:=id2+id3*N :=+N60*id1Pos91語義分析語義審查(靜態(tài)語義)上下文相關(guān)性類型匹配類型轉(zhuǎn)換例: Programp(); Varrate:real; procedureinitial; … position:=initial+rate*60/*error*/ /*error*//*warning*/; …語義分析語義審查(靜態(tài)語義)92又如:
intarr[2],abc;abc=arr*10; …Programp(); Varrate:real; Varinitial:real; Varposition:real;… position:=initial+rate*60嵌入式Linux的軟件開發(fā)環(huán)境分析課件93語義分析(semanticanalysis)60:=+*Id1positionId2initialId3rateinttoreal語義分析(semanticanalysis)60:=+*I94中間代碼生成(intermediatecodegeneration)源程序的內(nèi)部(中間)表示三元式、四元式、P-Code、C-Code、 U-Code、bytecode(* id3 t1 t2 )t2=id3*t1t2:=id3*t1中間代碼生成(intermediatecodegener95中間代碼生成
id1:=id2+id3*60(1) (inttoreal, 60 - t1 )(2) (* , id3 t1 t2 )(3) (+ , id2 t2 t3 )(4) (:= , t3 - id1 )中間代碼生成 id1:=id2+id3*6096代碼優(yōu)化
id1:=id2+id3*60(1) (inttoreal 60 - t1 )(2) (* id3 t1 t2 )(3) (+ id2 t2 t3 )(4) (:= t3 - id1 )變換(1)(* id3 60.0 t1 )(2)(+ id2 t1 id1 )代碼優(yōu)化 id1:=id2+id3*6097代碼優(yōu)化(codeoptimization)t1=b*ct1=b*ct2=t1+0t2=t1+t1t3=b*ca=t2t4=t2+t3a=t4代碼優(yōu)化(codeoptimization)t1=b*98目標(biāo)代碼生成(* , id3 60.0 t1 )(+ , id2 t1 id1 )movf id3,R2mulf #60.0,R2movf id2,R1addf R2,R1movf R1,id1目標(biāo)代碼生成(* , id3 60.0 t1 )movf i99符號(hào)表管理(symboltable)記錄源程序中使用的名字收集每個(gè)名字的各種屬性信息類型、作用域、分配存儲(chǔ)信息Const1 常量 值:35Var1 變量 類型:實(shí) 層次:2符號(hào)表管理(symboltable)記錄源程序中使用的名字100出錯(cuò)處理(errorhandling)
檢查錯(cuò)誤、報(bào)告出錯(cuò)信息、排錯(cuò)、恢復(fù)編譯工作出錯(cuò)處理(errorhandling) 檢查錯(cuò)誤、報(bào)告出101編譯程序結(jié)構(gòu)(components)詞法分析程序語法分析程序語義分析程序中間代碼生成程序代碼優(yōu)化程序目標(biāo)代碼生成程序符號(hào)表管理程序出錯(cuò)處理程序編譯程序結(jié)構(gòu)(components)詞法分析程序102出錯(cuò)處理語法分析程序語義分析程序目標(biāo)代碼生成程序詞法分析程序中間代碼生成程序代碼優(yōu)化程序表格管理出語法分析程序語義分析程序目標(biāo)代碼生成程序詞法分析程序中間代103編譯階段的組合分析,綜合(synthesis)源程序的分析線性分析層次分析語義分析目標(biāo)程序的綜合編譯的前端(frontend)編譯的后端(backend)遍(趟)從頭到尾掃描源程序(各種形式)一遍(pass)編譯階段的組合分析,綜合(synthesis)104高級(jí)語言解釋系統(tǒng)(interpreter)功能讓計(jì)算機(jī)執(zhí)行高級(jí)語言(basic,Matlab,prolog)與編譯程序的不同1)不生成目標(biāo)代碼2)能支持交互環(huán)境(同增量式編譯系統(tǒng))源程序
初始數(shù)據(jù)高級(jí)語言解釋系統(tǒng)(interpreter)功能105解釋系統(tǒng)直接對(duì)源程序中的語句進(jìn)行分析,執(zhí)行其隱含的操作。如:……
b:=2;a:=b+2;編譯程序
writea;……解釋程序直接將4的值輸出(顯示)解釋系統(tǒng)直接對(duì)源程序中的語句進(jìn)行分析,執(zhí)行其隱含的操作。106編譯階段和運(yùn)行階段存儲(chǔ)結(jié)構(gòu)名字表目標(biāo)代碼緩沖區(qū)編譯用源程序中間表示各種表格目標(biāo)代碼區(qū)數(shù)據(jù)區(qū)源程序緩沖區(qū)編譯階段和運(yùn)行階段存儲(chǔ)結(jié)構(gòu)名字表目標(biāo)代碼緩沖區(qū)編譯用源程序中107編譯技術(shù)的發(fā)展和應(yīng)用功能:程序集成環(huán)境實(shí)現(xiàn)方式手工機(jī)器語言匯編系統(tǒng)程序設(shè)計(jì)語言自動(dòng)構(gòu)造工具lexyaccgcc編譯技術(shù)的發(fā)展和應(yīng)用功能:程序集成環(huán)境108編譯程序的發(fā)展語言范型(paradigms)命令式(imperativelanguage)應(yīng)用式(applicative)基于規(guī)則的(rule-based)面向?qū)ο蟮模╫bject-oriented)編譯程序執(zhí)行環(huán)境批處理交互環(huán)境嵌入系統(tǒng)環(huán)境編譯程序的發(fā)展語言范型(paradigms)109研究領(lǐng)域并行編譯技術(shù)交叉編譯技術(shù)硬件描述語言及其編譯技術(shù)研究領(lǐng)域并行編譯技術(shù)110并行化編譯技術(shù)目的:提高并行計(jì)算機(jī)體系結(jié)構(gòu)的性能。超大規(guī)模計(jì)算的日益增長的需求高性能計(jì)算機(jī)并行軟件并行體系結(jié)構(gòu)單機(jī)速度并行體系結(jié)構(gòu)途徑1途徑2并行化編譯技術(shù)目的:提高并行計(jì)算機(jī)體系結(jié)構(gòu)的性能。并行體系結(jié)111
并行體系結(jié)構(gòu)
編譯技術(shù)支持
串行程序并行化編譯技術(shù)支持并行程序設(shè)計(jì)語言編譯
依賴于目標(biāo)機(jī)的優(yōu)化(低層)
112由于目標(biāo)機(jī)指令系統(tǒng)與宿主機(jī)的指令系統(tǒng)不同,編譯時(shí)將應(yīng)用程序的源程序在宿主機(jī)上生成目標(biāo)機(jī)代碼,稱為交叉編譯。SOIOAB由于目標(biāo)機(jī)指令系統(tǒng)與宿主機(jī)的指令系統(tǒng)不同,編譯時(shí)將應(yīng)用程序的113交叉編譯器交叉編譯器114硬件描述語言及其編譯技術(shù)電路設(shè)計(jì)依據(jù)驗(yàn)證結(jié)果如:VHDL硬件描述語言及其編譯技術(shù)電路設(shè)計(jì)依據(jù)115嵌入式開發(fā)工具基本概念嵌入式系統(tǒng)和系統(tǒng)軟件級(jí)的開發(fā)所需的計(jì)算機(jī)知識(shí)較多,而首當(dāng)其沖的是嵌入式開發(fā)工具的學(xué)習(xí),首先我們需要清楚的是為什么我們需要嵌入式開發(fā)工具:在嵌入式系統(tǒng)開發(fā)中目標(biāo)機(jī)與宿主機(jī)是分離的,它們之間往往具有不同的組織結(jié)構(gòu),例如:我們?cè)谘芯窟^程中宿主機(jī)一般均為PC,而目標(biāo)機(jī)為不同的開發(fā)板,這些開發(fā)板和PC具有不同的體系結(jié)構(gòu),而我們?yōu)榱耸乖冢校蒙线\(yùn)行的程序在目標(biāo)機(jī)上能夠運(yùn)行就需要將源程序編譯成相應(yīng)的目標(biāo)代碼,而這就是我們需要嵌入式開發(fā)工具的主要原因.嵌入式開發(fā)工具基本概念嵌入式系統(tǒng)和系統(tǒng)軟件級(jí)的開發(fā)所需116嵌入式開發(fā)工具簡介(一)在眾多嵌入式開發(fā)工具中GNUTools(基于OpenSource的軟件)是Linux環(huán)境下最重要的開發(fā)工具集,為了有效的開發(fā)嵌入式系統(tǒng),至少需要了解和掌握如下幾類工具:(1)編譯開發(fā)工具:即能夠把一個(gè)源程序編譯生成一個(gè)可執(zhí)行的軟件,如gcc等。(2)調(diào)試工具:即能夠?qū)?zhí)行程序進(jìn)行源碼或匯編級(jí)調(diào)試的軟件,如gdb。(3)軟件工程工具:用于協(xié)助多人開發(fā)或大型軟件項(xiàng)目的管理的軟件,如make,cvs。嵌入式開發(fā)工具簡介(一)在眾多嵌入式開發(fā)工具中117嵌入式開發(fā)工具簡介(二)在GNUTools中最基本的一些工具就包括:
ld(鏈接器),as(匯編器),gcc(C語言編譯器),glibc(包含各種基本函數(shù)實(shí)現(xiàn)的軟件庫)上述大部分軟件均可以在/gnu/上下載。嵌入式開發(fā)工具簡介(二)在GNUTools中最118嵌入式開發(fā)工具簡介(三)
binutils是一組二進(jìn)制工具程序集,它主要包括鏈接器,匯編器和其它用于處理目標(biāo)文件和檔案的工具。其中鏈接器為ld,它的主要作用是把各種目標(biāo)文件(.O文件和)和庫文件鏈接在一起,并根據(jù)定位數(shù)據(jù)和函數(shù)的地址,最終生成執(zhí)行程序。匯編器主要是AS:是GNU編譯器的匯編器(Assembler),負(fù)責(zé)把.S或.s為后綴的匯編文件編譯成.以.o為后綴的目標(biāo)文件處理目標(biāo)文件和檔案的主要工具是ar,它用于建立,修改和提取歸檔文件。一個(gè)歸檔文件是包含多個(gè)被包含文件的單個(gè)文件程序員可以從歸檔文件中檢索并得到原始的被包含文件的內(nèi)容,模式,時(shí)間戳,所有者和組等屬性嵌入式開發(fā)工具簡介(三)binutils是一組二進(jìn)119嵌入式開發(fā)工具簡介(四)glibc是GNU的C語言標(biāo)準(zhǔn)程序庫,C語言將部分函數(shù)留給操作系統(tǒng)來實(shí)現(xiàn),當(dāng)我們的程序需要調(diào)用時(shí),就要通過操作系統(tǒng)提供的C程序庫來取得這些服務(wù)。程序庫與應(yīng)用程序的鏈接方式可分為靜態(tài)與動(dòng)態(tài)鏈接兩種方式,當(dāng)應(yīng)用程序需要一個(gè)動(dòng)態(tài)鏈接庫時(shí)就需要我們自己安裝一個(gè)動(dòng)態(tài)庫在Linux操作系統(tǒng)中。嵌入式開發(fā)工具簡介(四)glibc是GNU的C120嵌入式開發(fā)工具簡介(五)Gcc編譯工具:gcc是一個(gè)強(qiáng)大的工具集合,它主要為GNU提供C編譯器,現(xiàn)在Gcc也開始支持多種工具語言,如JAVA,F(xiàn)ORTRAN等。如果能較好的掌握它,我們就能夠通過它提供的足夠多的參數(shù)來全面控制代碼的生成。嵌入式開發(fā)工具簡介(五)Gcc編譯工具:gcc是121GNUTools的安裝(一)在安裝GNUTools之前你需要注意的有兩個(gè)問題:(一)需要了解宿主機(jī)和目標(biāo)機(jī)的體系結(jié)構(gòu)。這是因?yàn)椴煌捏w系結(jié)構(gòu)所需的開發(fā)工具的版本是不同的。(二)不同開發(fā)工具之間版本的控制。GNUTools的安裝(一)在安裝GNUTool122GNUTools的安裝(二)此圖列出了到目前為止成功的版本配置宿主機(jī)目標(biāo)機(jī)OS內(nèi)核BinutilsGccGlibcI386i386Linux2.4.x2.14.903.3.12.3.2i386ppcLinux2.4.x2.10.12.95.32.2.1i386armLinux2.4.x2.13.903.2.12.3.1i386mipsLinux2.4.x2.8.1Egcs-1.1.22.0.6sparcppcLinux2.4.x2.10.12.95.22.1.3ppcarmLinux2.4.x2.10.12.95.32.2.3i386strongarmLinux2.6.x2.14.13.3.32.3.2i386xscaleLinux2.6.x2.14.13.3.32.3.2GNUTools的安裝(二)此圖列出了到目前為止成功的版本123GNUTools的安裝(三)對(duì)于每個(gè)單獨(dú)的工具軟件包,它的配置/編譯/安裝過程一般包括如下幾步:(1)下載并解壓軟件包;(2)配置軟件包;(3)編譯軟件包;(4)安裝軟件包;為了安裝某些GNUTools,可能還需要對(duì)Linux內(nèi)核的include文件進(jìn)行配置,這主要是由于glibc的安裝是與Linux內(nèi)核相關(guān)的。GNUTools的安裝(三)對(duì)于每個(gè)單獨(dú)的工具軟件124Bootloader概念(一)在專用的的嵌入式板上運(yùn)行l(wèi)inux已經(jīng)獲得了越來越廣泛的應(yīng)用,一個(gè)嵌入式linux系統(tǒng)從軟件的角度看通??梢苑譃?個(gè)層次(1)引導(dǎo)加載程序;(2)linux內(nèi)核.特定于嵌入式板子的定制內(nèi)核以及內(nèi)核的啟動(dòng)參數(shù);(3)文件系統(tǒng);(4)用戶應(yīng)用程序。bootloader軟件正是屬于引導(dǎo)加載程序的一部分。Bootloader概念(一)在專用的的嵌入式板125Bootloader概念(二)
在一般的PC中開機(jī)過程可分為BIOS和BootManger兩步:1.BIOS(Baiscinputoutputsystem),它存在于主板的flashRom上,負(fù)責(zé)硬件初始化的程式2.BootManager:它不象BIOS那樣與硬件結(jié)合的如此緊密.例如一套BootManager在X86系統(tǒng)上寫好后,就可在所有的X86機(jī)上使用.BootManager的工作是負(fù)責(zé)將Kernel載入,有時(shí)它還負(fù)責(zé)從多個(gè)硬盤分區(qū)載入OS,例如在同一臺(tái)PC上同時(shí)有l(wèi)inux和windows,我們就靠著在MBR上的BootManager來選擇要載入windows或是linux,同時(shí)BootManager也要負(fù)責(zé)一系列的初始化動(dòng)作.Bootloader概念(二)在一般的PC中開機(jī)過126Bootloader概念(三)
在嵌入式系統(tǒng)中通常是沒有BIOS那樣的固件程序的因此整個(gè)系統(tǒng)加載啟動(dòng)任務(wù)就完全由Bootloader來完成.雖然有很多種Bootloader,但大多Bootloader可以分為兩個(gè)步驟來完成:
Stage1:(1)硬件設(shè)備初始化(如I/O口,存儲(chǔ)器和時(shí)鐘).(2)為加載Bootloader的stage2準(zhǔn)備好RAM空間.(3)復(fù)制Bootloader的到RAM空間中.(4)設(shè)置好堆棧.(5)跳轉(zhuǎn)到stage2的C入口點(diǎn).Stage2:(1)初始化本階段要使用的硬件設(shè)備.(2)檢測系統(tǒng)的內(nèi)存映射.(3)將kernel映像和根文件系統(tǒng)映像從Flash上讀到RAM空間中.(4)從內(nèi)核設(shè)置啟動(dòng)參數(shù).(5)調(diào)用內(nèi)核.Bootloader概念(三)在嵌入式系統(tǒng)127Bootloader的安裝步驟根據(jù)我們以前介紹的知識(shí)我們?cè)诰幾g安裝一個(gè)bootloader到目標(biāo)板時(shí)首先需要找到一個(gè)適合目標(biāo)板的bootloader軟件,接著我們就需要為編譯安裝這個(gè)軟件到目標(biāo)板準(zhǔn)備必要的工具軟件,最后才是將編譯好的bootloader軟件下載到目標(biāo)板上。Bootloader的安裝步驟根據(jù)我們以前介紹的知128bootloader軟件的選擇目前應(yīng)用的比較廣泛的bootloader軟件有ARMboot,Redboot,U-boot等,這些軟件支持的CPU和所需要的開發(fā)環(huán)境各不相同,其中ARMBOOT支持基于ARM720T,ARM920T等CPU的開發(fā)板。而U-boot是迄今為止功能更為強(qiáng)大的開源bootloader軟件,它支持多種處理器平臺(tái),包括PPC,ARM,X86以及MIPS等。bootloader軟件的選擇目前應(yīng)用的比較廣129交叉編譯工具的選擇(一)在安裝交叉編譯環(huán)境之前你首先需要清楚你宿主機(jī)和目標(biāo)機(jī)的體系結(jié)構(gòu),以一套宿主機(jī)為安裝有Linux-的以X86結(jié)構(gòu)為基礎(chǔ)的PC機(jī),宿主機(jī)是以在安裝交叉編譯環(huán)境之前你首先需要清楚你宿主機(jī)和目標(biāo)機(jī)的體系結(jié)構(gòu),以一套宿主機(jī)為安裝有Linux-2.4.20.8的以X86結(jié)構(gòu)為基礎(chǔ)的PC機(jī),宿主機(jī)是以ARM9內(nèi)核為基礎(chǔ)的InteiPXA255開發(fā)板。交叉編譯工具的選擇(一)在安裝交叉編譯環(huán)境之前130交叉編譯工具的選擇(二)我們首先要找到交叉編譯環(huán)境中幾個(gè)重要的部分:針對(duì)目標(biāo)系統(tǒng)的編譯器GCC;針對(duì)目標(biāo)系統(tǒng)的二進(jìn)制工具binutils;目標(biāo)系統(tǒng)的標(biāo)準(zhǔn)C庫glibc。交叉編譯工具的選擇(二)我們首先要找到交叉編譯131交叉編譯工具的選擇(三)通過查詢資料可知最新的一套適合i386—arm體系的交叉編譯工具集是:binutils-2.14.tar.gz
gcc-3.3.2.tar.gz
glibc-2.2.5.tar.gz
glibc-linuxthreads-2.2.5.tar.gz
交叉編譯工具的選擇(三)通過查詢資料可知最新的一套132交叉編譯工具的安裝將以上工具集下載到你指定的目錄下后,就可解壓縮并安裝這些文件,需要注意的是在安裝完這些文件后,最好在/root/.bashrc文件中指明交叉編譯工具的路徑,這樣你在運(yùn)行arm-linux-gcc時(shí)就可以不考慮目錄的路徑讓shell自動(dòng)的尋找路徑。交叉編譯工具的安裝將以上工具集下載到你指定的目錄133Bootloader的移植(一)在安裝好交叉編譯工具后你就可以編譯bootloader軟件了,一般在bootloader軟件的Readme文檔中都會(huì)有編譯步驟,在有些文檔中還會(huì)有常見錯(cuò)誤(commonerror)的解決方法。
編譯好bootloader后,一般會(huì)生成一個(gè)。Bin文件,這就是我們要移植到開發(fā)板中的二進(jìn)制文件。Bootloader的
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 工廠生產(chǎn)承包合同
- 2024貨運(yùn)合同格式范本新版范文
- 2024新版廣告合同范本
- 定制辦公桌椅及安裝協(xié)議
- 投資合作談判技巧
- 招標(biāo)代理合作協(xié)議樣本
- 房建工程施工分包協(xié)議
- 戶外廣告業(yè)務(wù)合作合同參考
- 廣東省室內(nèi)裝潢設(shè)計(jì)合同樣本
- 3.1.1橢圓的標(biāo)準(zhǔn)方程【同步課件】
- 南京市2024-2025學(xué)年六年級(jí)上學(xué)期11月期中調(diào)研數(shù)學(xué)試卷二(有答案)
- 汽車防凍液中毒
- 粉條產(chǎn)品購銷合同模板
- 2024至2030年中國自動(dòng)車配件行業(yè)投資前景及策略咨詢研究報(bào)告
- 2024-2030年中國蔗糖行業(yè)市場深度調(diào)研及發(fā)展趨勢與投資前景研究報(bào)告
- 北師版 七上 數(shù)學(xué) 第四章 基本平面圖形《角-第2課時(shí) 角的大小比較》課件
- 外研版小學(xué)英語(三起點(diǎn))六年級(jí)上冊(cè)期末測試題及答案(共3套)
- 北師大版(2024新版)七年級(jí)上冊(cè)生物期中學(xué)情調(diào)研測試卷(含答案)
- 產(chǎn)品包裝規(guī)范管理制度
- 2024年海南省中考物理試題卷(含答案)
- 2024統(tǒng)編新版小學(xué)三年級(jí)語文上冊(cè)第八單元:大單元整體教學(xué)設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論