版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第7章
嵌入式Linux軟件設(shè)計(jì)主要內(nèi)容1324Bootloader引導(dǎo)程序Linux的移植驅(qū)動(dòng)程序開發(fā)應(yīng)用程序開發(fā)
7.1.1Bootloader的啟動(dòng)過程
在嵌入式操作系統(tǒng)中,BootLoader是在操作系統(tǒng)內(nèi)核運(yùn)行之前運(yùn)行??梢猿跏蓟布O(shè)備、建立內(nèi)存空間映射圖,從而將系統(tǒng)的軟硬件環(huán)境帶到一個(gè)合適狀態(tài),以便為最終調(diào)用操作系統(tǒng)內(nèi)核準(zhǔn)備好正確的環(huán)境。在嵌入式系統(tǒng)中,通常并沒有像BIOS那樣的固件程序(注,有的嵌入式CPU也會(huì)內(nèi)嵌一段短小的啟動(dòng)程序),因此整個(gè)系統(tǒng)的加載啟動(dòng)任務(wù)就完全由BootLoader來完成。嵌入式系統(tǒng)中,系統(tǒng)在上電或復(fù)位時(shí)通常都從地址0x00000000處開始執(zhí)行,而在這個(gè)地址處安排的通常就是系統(tǒng)的BootLoader程序。bootloader的操作模式:1,自啟動(dòng)模式:bootloader從目標(biāo)機(jī)上的某個(gè)固態(tài)存儲(chǔ)設(shè)備上將操作系統(tǒng)加載到RAM中運(yùn)行。2,交互模式:目標(biāo)機(jī)上的bootloader將通過串口或網(wǎng)絡(luò)等通行手段從開發(fā)主機(jī)(Host)上下載內(nèi)核映像等到RAM中??梢员籦ootloader寫到目標(biāo)機(jī)上的固態(tài)存儲(chǔ)媒質(zhì)中,或者直接進(jìn)入系統(tǒng)的引導(dǎo)。也可以通過串口接收用戶的命令。
7.1.1Bootloader的啟動(dòng)過程BootLoader的實(shí)現(xiàn)依賴于CPU的體系結(jié)構(gòu),因此大多數(shù)BootLoader都分為stage1和stage2兩大部分。BootLoader的stage1通常包括以下步驟:硬件設(shè)備初始化。為加載BootLoader的stage2準(zhǔn)備RAM空間。復(fù)制BootLoader的stage2到RAM空間中。設(shè)置好堆棧。跳轉(zhuǎn)到stage2的入口點(diǎn)。
BootLoader的stage2通常包括以下步驟:初始化本階段要使用的硬件設(shè)備。檢測(cè)系統(tǒng)內(nèi)存映射。將kernel映像和根文件系統(tǒng)映像從Flash讀到RAM中。為內(nèi)核設(shè)置啟動(dòng)參數(shù)。調(diào)用內(nèi)核。
7.1.2BootLoader——vivivivi是由韓國(guó)MIZI公司提供的一款針對(duì)S3C2410芯片的BootLoader。vivi的啟動(dòng)過程分為兩個(gè)階段:階段1和階段2。階段1的主要工作是:硬件初始化;配置串口;復(fù)制自身到SDRAM中(跳轉(zhuǎn)到C代碼的入口函數(shù))。階段2的主要工作是:對(duì)硬件系統(tǒng)繼續(xù)初始化;內(nèi)存映射初始化,內(nèi)存管理單元MMU初始化;初始化堆;初始化MTD設(shè)備,MTD設(shè)備指具有閃存功能的設(shè)備,如閃存芯片、閃存卡等;初始化私有數(shù)據(jù);初始化內(nèi)置命令;啟動(dòng)vivi。
7.1.3BootLoader——U-Boot
U-Boot,全稱UniversalBootLoader,是開源項(xiàng)目。其源碼目錄、編譯形式與Linux內(nèi)核很相似,事實(shí)上,不少U-Boot源碼就是相應(yīng)的Linux內(nèi)核源程序的簡(jiǎn)化,尤其是一些設(shè)備的驅(qū)動(dòng)程序。U-Boot不僅僅支持嵌入式Linux系統(tǒng)的引導(dǎo),它還支持VxWorks,QNX,Solaris等嵌入式操作系統(tǒng)。這是U-Boot中Universal的一層含義,另外一層含義則是U-Boot除了支持PowerPC系列的處理器外,還能支持MIPS、x86、ARM、NIOS、XScale等諸多常用系列的處理器。這兩個(gè)特點(diǎn)正是U-Boot項(xiàng)目的開發(fā)目標(biāo),即支持盡可能多的嵌入式處理器和嵌入式操作系統(tǒng)。就目前來看,U-Boot對(duì)PowerPC系列處理器支持最為豐富,對(duì)Linux的支持最完善。主要內(nèi)容1324Bootloader引導(dǎo)程序Linux的移植驅(qū)動(dòng)程序開發(fā)應(yīng)用程序開發(fā)
7.2Linux的移植所謂Linux移植,就是針對(duì)具體的目標(biāo)平臺(tái)對(duì)Linux做必要的改寫后,安裝到該目標(biāo)平臺(tái)并使其正確運(yùn)行的過程。基本內(nèi)容包括:獲取某一版本的Linux內(nèi)核源碼。根據(jù)具體的目標(biāo)平臺(tái),對(duì)源碼進(jìn)行必要的改寫(主要是修改有關(guān)體系結(jié)構(gòu)的部分),然后添加一些驅(qū)動(dòng),打造一款適合目標(biāo)平臺(tái)的新的操作系統(tǒng)。對(duì)該系統(tǒng)進(jìn)行針對(duì)目標(biāo)平臺(tái)的交叉編譯,生成一個(gè)內(nèi)核映像文件。將該映像文件燒寫、安裝到目標(biāo)平臺(tái)中。
7.2.1Linux內(nèi)核的目錄結(jié)構(gòu)1./arch:其中的子目錄包含了所有與硬件體系結(jié)構(gòu)相關(guān)的內(nèi)核移植代碼。每一個(gè)目錄都代表一種硬件平臺(tái),對(duì)于每種平臺(tái)都應(yīng)該包括:boot:包含啟動(dòng)內(nèi)核所使用的部分或全部平臺(tái)的相關(guān)代碼。kernel:包含支持體系結(jié)構(gòu)特有的特征代碼。lib:包含存放體系結(jié)構(gòu)特有的通用函數(shù)的實(shí)現(xiàn)代碼。mm:包含存放體系結(jié)構(gòu)特有的內(nèi)存管理程序的實(shí)現(xiàn)。mach-xxx:包含存放該處理器的移植代碼。2./Documentation:其中的子目錄包含有關(guān)內(nèi)核的許多非常詳細(xì)的文檔。3./drivers:其中的子目錄包含內(nèi)核中所有的設(shè)備驅(qū)動(dòng)程序。4./fs:其中的子目錄包含了所有文件系統(tǒng)的代碼。5./include:其中的子目錄包含了建立內(nèi)核代碼時(shí)所需的大部分庫(kù)文件的頭文件,該模塊利用其他模塊重建內(nèi)核。同時(shí),包括不同平臺(tái)需要的庫(kù)文件。6./init:其中的子目錄包含了內(nèi)核的初始化代碼,內(nèi)核從此目錄下開始工作。7./ipc:其中的子目錄包含了內(nèi)核的進(jìn)程間通訊的代碼。8./kernel:其中的子目錄包含了主內(nèi)核的代碼,如進(jìn)程調(diào)度等。9./lib:其中的子目錄包含了通用的庫(kù)函數(shù)代碼等。10./mm:其中的子目錄包含了內(nèi)核的內(nèi)存管理代碼。11./net:其中的子目錄包含了內(nèi)核的網(wǎng)絡(luò)相關(guān)代碼。12./scripts:其中的子目錄包含了配置內(nèi)核的一些腳本文件。
7.2.2Linux內(nèi)核源碼通常對(duì)內(nèi)核源碼的改寫難度較大,因?yàn)檫@不僅要求對(duì)內(nèi)核結(jié)構(gòu)非常熟悉,而且也要對(duì)目標(biāo)平臺(tái)的硬件結(jié)構(gòu)相當(dāng)了解。所以這部分工作主要由目標(biāo)平臺(tái)廠商提供,如對(duì)于ARM平臺(tái),對(duì)Linux內(nèi)核源碼的改寫就是由英國(guó)ARM公司完成的。對(duì)于讀者來說,只需從其網(wǎng)站上下載相關(guān)版本的Linux內(nèi)核補(bǔ)丁,再安裝補(bǔ)丁即可。
7.2.3交叉編譯環(huán)境的建立交叉編譯指利用運(yùn)行在機(jī)器上的編譯器編譯某個(gè)源程序,生成在另一臺(tái)機(jī)器上運(yùn)行的目標(biāo)代碼的過程。對(duì)于Linux系統(tǒng)和ARM平臺(tái)來講,GCC交叉編譯器能高效的完成移植,下面介紹生成GCC交叉編譯器的一般過程。(1)下載源代碼(2)編譯binutils(3)配置Linux內(nèi)核頭文件(4)第一次編譯gcc(5)交叉編譯glibc(6)第二次編譯gcc
7.2.4修改Linux內(nèi)核文件1.設(shè)置目標(biāo)平臺(tái)和指定交叉編譯器2.修改arch/arm目錄下Makefile文件3.修改arch/arm目錄下config.in文件4.修改arch/arm/boot目錄下Makefile文件5.修改arch/arm/boot/compressed目錄下Makefile文件6.在arch/arm/boot/compressed目錄下添加head-s3c2410.s文件,該文件主要用來初始化處理器。7.在arch/arm/def-configs目錄下添加配置好的S3C2410的配置文件。8.修改arch/arm/kernel目錄下Makefile文件9.修改arch/arm/kernel目錄下的debug-armv.s文件10.修改arch/arm/kernel目錄下的entry-armv.s文件11.修改arch/arm/mm目錄下的相關(guān)文件12.修改arch/arm/mach-s3c2410目錄下的相關(guān)文件
7.2.5Linux內(nèi)核及文件系統(tǒng)的編譯1.編譯Linux內(nèi)核makedepmakecleanmakezImage2.制作cramfs文件系統(tǒng)利用工具軟件MKCRAMFS制作cramfs文件系統(tǒng)。假設(shè)root_tech目錄包含將來要用到的所有文件,把制作工具和root_tech放在同一個(gè)目錄下,并在該目錄下使用命令:MKCRAMFSroot_techrootfs.cramfs
7.2.6Linux內(nèi)核及文件系統(tǒng)的下載1.利用vivi通過超級(jí)終端重新下載vivi2.利用vivi燒寫內(nèi)核和root文件系統(tǒng)3.利用U-Boot燒寫內(nèi)核和root文件系統(tǒng)主要內(nèi)容1324Bootloader引導(dǎo)程序Linux的移植驅(qū)動(dòng)程序開發(fā)應(yīng)用程序開發(fā)設(shè)備驅(qū)動(dòng)程序的工作原理設(shè)備驅(qū)動(dòng)程序是操作系統(tǒng)內(nèi)核和機(jī)器硬件之間的接口。設(shè)備驅(qū)動(dòng)程序?yàn)閼?yīng)用程序屏蔽了硬件的細(xì)節(jié),應(yīng)用程序可以像操作普通文件一樣對(duì)硬件設(shè)備進(jìn)行操作。設(shè)備驅(qū)動(dòng)程序作為內(nèi)核的一部分,完成以下功能:對(duì)設(shè)備初始化和釋放;把數(shù)據(jù)從內(nèi)核傳送到硬件和從硬件讀取數(shù)據(jù);讀取應(yīng)用程序傳送給設(shè)備文件的數(shù)據(jù)和回送應(yīng)用程序請(qǐng)求的數(shù)據(jù);檢測(cè)和處理設(shè)備出現(xiàn)的錯(cuò)誤。Linux下的設(shè)備驅(qū)動(dòng)程序是內(nèi)核的一部分,運(yùn)行在內(nèi)核模式。在Linux系統(tǒng)中,使用file_operation結(jié)構(gòu)將設(shè)備驅(qū)動(dòng)程序和文件系統(tǒng)相關(guān)聯(lián),在這個(gè)結(jié)構(gòu)里存放了設(shè)備各種操作的入口函數(shù)。
Linux下設(shè)備驅(qū)動(dòng)程序在輸入/輸出系統(tǒng)中的地位用戶程序的進(jìn)程(設(shè)備)文件系統(tǒng)設(shè)備驅(qū)動(dòng)程序設(shè)備服務(wù)子程序中斷處理程序物理設(shè)備控制器輸入/輸出請(qǐng)求輸入/輸出響應(yīng)物理設(shè)備驅(qū)動(dòng)程序的開發(fā)和使用步驟1.用戶在自己的驅(qū)動(dòng)程序源文件中定義file_operations結(jié)構(gòu),并編寫出設(shè)備需要的各個(gè)操作函數(shù),對(duì)于設(shè)備不需要的操作函數(shù)用NULL初始化;2.定義一個(gè)初始化函數(shù),該函數(shù)應(yīng)包含以下幾項(xiàng)工作:(1)對(duì)使用到的硬件寄存器進(jìn)行初始化,包括中斷寄存器。(2)初始化與設(shè)備相關(guān)的參數(shù)。(3)注冊(cè)設(shè)備。
intregister_chrdev(unsignedint,constchar*,structfile_operations*)其中三個(gè)參數(shù)分別代表主設(shè)備號(hào)、設(shè)備名和file_operations結(jié)構(gòu)變量的地址。(4)注冊(cè)設(shè)備使用的中斷。注冊(cè)中斷使用的函數(shù)。(5)其他的一些初始化工作,比如給設(shè)備分配I/O,申請(qǐng)DMA通道等。3.將設(shè)備驅(qū)動(dòng)加到Linux內(nèi)核中4.將設(shè)備驅(qū)動(dòng)編譯成驅(qū)動(dòng)模塊主要內(nèi)容1324Bootloader引導(dǎo)程序
Linux的移植驅(qū)動(dòng)程序開發(fā)應(yīng)用程序開發(fā)
應(yīng)用程序的開發(fā)步驟開發(fā)Linux應(yīng)用程序一般分為以下幾個(gè)步驟:編寫程序編寫Makefile文件編譯程序運(yùn)行程序?qū)⑸傻目蓤?zhí)行文件加入文件系統(tǒng)。如果應(yīng)用程序的運(yùn)行需要某些驅(qū)動(dòng)程序,先將驅(qū)動(dòng)程序掛接到文件系統(tǒng)中。舉例:hello應(yīng)用程序的開發(fā)和運(yùn)行1.編寫Hello程序編寫hello.c文件,保存在hello目錄下。代碼如下所示:#include<stdio.h>#include<stdlib.h>intmain(intargc,char**argv){printf("HelloReader,Congradulations!!!\n");return(0);}2.編寫Makefile文件,內(nèi)容如下:CC=/opt/host/armv4l/bin/armv4l-unknown-linux-gccCFLAGS=-I/l
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 門禁報(bào)警課程設(shè)計(jì)
- 廣告代理合同如何約定費(fèi)用和結(jié)算
- 上海市出口產(chǎn)品購(gòu)銷協(xié)議
- 權(quán)威土地轉(zhuǎn)讓協(xié)議書范本
- 網(wǎng)絡(luò)數(shù)據(jù)查詢協(xié)議
- 投資合作方共同建設(shè)合同
- 財(cái)會(huì)檔案管理制度
- 青瓜種子種植課程設(shè)計(jì)
- 實(shí)習(xí)基地緊密合作協(xié)議
- 連桿螺釘模鍛課程設(shè)計(jì)
- 醫(yī)療事故的心得體會(huì)(18篇)
- 從偏差行為到卓越一生3.0版
- 失血性休克患者的麻醉處理
- 現(xiàn)實(shí)與理想-西方古典繪畫 課件-2023-2024學(xué)年高中美術(shù)人美版(2019)美術(shù)鑒賞
- 認(rèn)識(shí)經(jīng)濟(jì)全球化 說課課件-2023-2024學(xué)年高中政治統(tǒng)編版選擇性必修一當(dāng)代國(guó)際政治與經(jīng)濟(jì)
- 2024網(wǎng)站滲透測(cè)試報(bào)告
- 2023-2024學(xué)年七年級(jí)上冊(cè)語(yǔ)文期中考試高頻考點(diǎn)13 寫作實(shí)踐解析版
- 九年級(jí)上期中考試質(zhì)量分析
- DB-T29-139-2015天津市房屋修繕工程質(zhì)量驗(yàn)收標(biāo)準(zhǔn)
- 消防安全知識(shí)宣講會(huì)
- 金融服務(wù)創(chuàng)新聯(lián)合體協(xié)議書
評(píng)論
0/150
提交評(píng)論