北航國家課程嵌入式系統(tǒng)-實驗3 linux內(nèi)核在arm平臺上的移植_第1頁
北航國家課程嵌入式系統(tǒng)-實驗3 linux內(nèi)核在arm平臺上的移植_第2頁
北航國家課程嵌入式系統(tǒng)-實驗3 linux內(nèi)核在arm平臺上的移植_第3頁
北航國家課程嵌入式系統(tǒng)-實驗3 linux內(nèi)核在arm平臺上的移植_第4頁
北航國家課程嵌入式系統(tǒng)-實驗3 linux內(nèi)核在arm平臺上的移植_第5頁
已閱讀5頁,還剩28頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

LINUX內(nèi)核在arm平臺上的移植牛建偉鄒琪嵌入式系統(tǒng)課程——實驗三實驗?zāi)康膶嶒瀮?nèi)容BootloaderLinux內(nèi)核實驗步驟實驗?zāi)康牧私鈈ootloader及其作用,了解Linux內(nèi)核結(jié)構(gòu)。掌握配置和編譯Linux系統(tǒng)內(nèi)核的方法以及移植嵌入式Linux的基本步驟。實驗內(nèi)容在Linux系統(tǒng)的宿主PC下,修改裁減內(nèi)核源碼,編譯生成bootloader、內(nèi)核映像和根文件系統(tǒng)。在Windows系統(tǒng)的宿主PC下,燒寫bootloader、內(nèi)核映像和根文件系統(tǒng)。(帶U盤)嵌入式Linux系統(tǒng)構(gòu)成引導(dǎo)加載程序(armboot,blob,redboot,vivi,U-Boot)啟動加載模式(正常工作模式),下載模式內(nèi)核文件系統(tǒng)用戶應(yīng)用程序(有時還包括嵌入式圖形用戶界面)內(nèi)核根文件系統(tǒng)Bootloader啟動參數(shù)Bootloader介紹引導(dǎo)加載程序bootloader是系統(tǒng)加電后運行的第一段代碼,它完成整個系統(tǒng)的加載啟動任務(wù)。在基于ARM的嵌入式系統(tǒng)中,系統(tǒng)在上電或復(fù)位時通常都從地址0x00000000處開始執(zhí)行,而在這個地址處放的通常就是系統(tǒng)的bootloader。通過這段小程序,可以初始化硬件設(shè)備、建立內(nèi)存空間的映射圖,從而將系統(tǒng)的軟硬件環(huán)境帶到一個合適的狀態(tài),以便為最終調(diào)用操作系統(tǒng)內(nèi)核準(zhǔn)備好正確的環(huán)境。Bootloader的啟動流程第一個階段主要包括依賴于CPU的體系結(jié)構(gòu)硬件初始化的代碼,通常用匯編語言實現(xiàn)。這個階段的任務(wù)有:◆基本的硬件設(shè)備初始化(屏蔽所有中斷、關(guān)閉處理器內(nèi)部指令/數(shù)據(jù)cache等)◆為第二階段準(zhǔn)備RAM空間◆如果是從某個固態(tài)存儲媒質(zhì)中,則復(fù)制Bootloader的第二階段代碼到RAM◆設(shè)置堆棧◆跳轉(zhuǎn)到第二階段的C程序入口點第二個階段通常用C語言完成,以便實現(xiàn)更復(fù)雜的功能,也使程序有更好的可讀性和移植性。這個階段的任務(wù)有:◆初始化本階段要使用到的硬件設(shè)備◆檢測系統(tǒng)內(nèi)存映射◆將內(nèi)核映像和根文件系統(tǒng)映像從flash讀到RAM◆為內(nèi)核設(shè)置啟動參數(shù)◆啟動內(nèi)核(將控制交給內(nèi)核)Linux內(nèi)核介紹目前專門針對嵌入式設(shè)備的Linux改版有針對無MMU的uClinux和針對有MMU的標(biāo)準(zhǔn)Linux在各硬件體系結(jié)構(gòu)上的移植版本。uClinux是通過對標(biāo)準(zhǔn)Linux內(nèi)核裁減,去除虛擬內(nèi)存管理部分的代碼,并對內(nèi)存分配進(jìn)行優(yōu)化,從而達(dá)到提高系統(tǒng)運行效率的目的。因此uClinux的應(yīng)用程序開發(fā)要求用戶自己正確的處理內(nèi)存管理,一旦錯誤地修改了其他進(jìn)程的內(nèi)存,將可能造成系統(tǒng)死機(jī)?;谙馎RM2410這樣的ARM9內(nèi)核的ARM-Linux使用了MMU的內(nèi)存管理,對進(jìn)程有保護(hù),提高了嵌入式系統(tǒng)中多進(jìn)程的保護(hù)能力。使用戶應(yīng)用程序的可靠性得以提高,降低了用戶的開發(fā)難度。Linux內(nèi)核結(jié)構(gòu)/arch目錄,包含了體系結(jié)構(gòu)相關(guān)部分的內(nèi)核代碼,如i386arm等平臺,而每個平臺又包括以下幾個目錄:boot:包括啟動內(nèi)核所用的部分或全部代碼

kernel:存放支持體系結(jié)構(gòu)特有的特征的實現(xiàn)lib:存放高速的體現(xiàn)結(jié)構(gòu)特有的通用函數(shù)的實現(xiàn)

mm:存放體系結(jié)構(gòu)特有的內(nèi)存管理程序的實現(xiàn)/drivers目錄,保存了內(nèi)核中所有設(shè)備驅(qū)動程序。/fs目錄,列出了Linux支持的所有文件系統(tǒng)的代碼,如ntfsext3和yaffs等/include目錄,包括編譯核心所需要的大部分頭文件,例如與平臺無關(guān)的頭文件在include/linux子目錄下。不同的平臺需要的頭文件會有所不同,因此該目錄和arch目錄一樣,按平臺劃分多個子目錄,如asm-arm是arm平臺的。Linux內(nèi)核結(jié)構(gòu)(續(xù))/init目錄,包含了內(nèi)核的初始化代碼,有

兩個文件。/ipc目錄,包含了核心進(jìn)程間的通信代碼。/kernel目錄,內(nèi)核管理的核心代碼在此,與處理器結(jié)構(gòu)相關(guān)的代碼都在arch/*/kernel目錄下。/lib目錄,包括與平臺無關(guān)的通用函數(shù)。/mm目錄,包含了所有的內(nèi)存管理代碼。與具體硬件體系結(jié)構(gòu)相關(guān)的內(nèi)存管理代碼位于arch/*/kernel目錄下。/net目錄,里面是核心的網(wǎng)絡(luò)部分代碼,其每個子目錄對應(yīng)于網(wǎng)絡(luò)的一個方面。其他目錄,Documentation目錄存放了許多文檔。scripts目錄存放配置內(nèi)核的一些腳本文件。Linux內(nèi)核移植1Linux內(nèi)核的移植主要包含啟動代碼的修改,內(nèi)核的鏈接及裝入,參數(shù)傳遞,內(nèi)核引導(dǎo)幾個部分。我們在移植工作中要改動的代碼主要集中在與體系結(jié)構(gòu)相關(guān)部分。在/arch/arm/boot/bootp目錄中,有個的ARM匯編文件,它就是引導(dǎo)Linux內(nèi)核在arm平臺上啟動的初始化代碼。它里面定義了一個全局符號_start,它定義了默認(rèn)的起始地址,同時它也是整體內(nèi)核二進(jìn)制鏡像的起始標(biāo)志。主要完成以下功能:◆定義數(shù)據(jù)、代碼段、bbs(未初始化數(shù)據(jù)段)起始地址變量并對bbs段初始化◆設(shè)置寄存器以初始化系統(tǒng)硬件◆關(guān)閉中斷◆初始化LCD顯示◆將數(shù)據(jù)段復(fù)制到內(nèi)存◆跳轉(zhuǎn)到內(nèi)核起始函數(shù)start_kernel繼續(xù)執(zhí)行◆對主寄存器的修改/****Copyright(C)2000RussellKing**Thisprogramisfreesoftware;youcanredistributeitand/ormodify*itunderthetermsoftheGNUGeneralPublicLicenseversion2as*publishedbytheFreeSoftwareFoundation.**Headerfileforsplittingkernel+initrd.Notethatwepass*r0throughtor3straightthrough.*/ .section.start,#alloc,#execinstr .type _entry,#function_entry: adr r10,initdata ldr r11,initdata sub r11,r10,r11 @workoutexecoffset b splitify .size _entry,.-_entry .type initdata,#objectinitdata: .word initdata @compiledaddressofthis .size initdata,.-initdata .textsplitify: adr r13,data ldmia r13!,{r4-r6} @movetheinitrd add r4,r4,r11 @correction bl move ldmia r13!,{r4-r6} @thenthekernel mov r12,r5 add r4,r4,r11 @correction bl move/**Setuptheinitrdparameterstopasstothekernel.Thiscaneitherbe*passedinviaaparam_structorataglist.Wespottheparam_struct*methodbylookingatthefirstword;thisshouldeitherindicateapage*sizeof4K,16Kor32K.*/ ldmia r13,{r4-r8} @getsizeandaddrofinitrd @r5=ATAG_INITRD @r6=initrdstart @r7=initrdend @r8=param_structaddress ldr r9,[r8,#0] @noparamstruct? teq r9,#0x1000 @4K? teqne r9,#0x4000 @16K? teqne r9,#0x8000 @32K? beq param_struct ldr r9,[r8,#4] @getfirsttag teq r9,r4 bne taglist @ok,wehaveataglist/**Wedidn'tfindavalidtaglist-createone.*/ str r4,[r8,#4] mov r4,#8 str r4,[r8,#0] mov r4,#0 str r4,[r8,#8]/**findtheendofthetaglist,andthenaddanINITRDtagontheend.*IfthereisalreadyanINITRDtag,thenweignoreit;thelastINITRD*tagtakesprecidence.*/taglist: ldr r9,[r8,#0] @taglength teq r9,#0 @lasttag? addne r8,r8,r9 bne taglist mov r4,#16 @lengthofinitrdtag mov r9,#0 @endoftaglistterminator stmia r8,{r4,r5,r6,r7,r9} mov pc,r12 @callkernel/**Wefoundaparamstruct.Modifytheparamstructfortheinitrd*/param_struct: add r8,r8,#16*4 stmia r8,{r6,r7} @saveinparam_struct mov pc,r12 @callkernelmove: ldmia r4!,{r7-r10} @move32-bytesatatime stmia r5!,{r7-r10} ldmia r4!,{r7-r10} stmia r5!,{r7-r10} subs r6,r6,#8*4 bcs move mov pc,lrdata: .word initrd_start .word initrd_addr .word initrd_len .word kernel_start .word kernel_addr .word kernel_len .word 0x54410001 @r4=ATAG_CORE .word 0x54420005 @r5=ATAG_INITRD .word initrd_addr @r6 .word initrd_len @r7 .word params @r8 .type kernel_start,#object .type initrd_start,#objectLinux內(nèi)核移植2修改根目錄下的Makefile,指定目標(biāo)平臺和交叉編譯器ARCH:=arm

CROSS_COMPILE=/opt/host/armv4l/bin/armv4l-unknown-linux-修改/arch/arm下的Makefile,手動增加下面內(nèi)容:ifeq($(CONFIG_ARCH_S3C2410),y)TEXTADDR =0xC0008000MACHINE =s3c2410endif

TEXTADDR決定內(nèi)核起始運行地址,從0xC0008000開始32M的空間修改/arch/arm下,makemenuconfig菜單中,在版本內(nèi)核中沒有S3C2410處理器,需要加相關(guān)信息:if["$CONFIG_ARCH_S3C2410"="y"];thencomment'S3C2410Implementation'dep_bool'SMDK(MERITECHBOARD)'CONFIG_S3C2410_SMDK$CONFIG_ARCH_S3C2410

"$CONFIG_ARCH_S3C2400"="y"-o"$CONFIG_ARCH_S3C2410"="y"-o\Linux內(nèi)核移植3還有以下文件需要修改,具體細(xì)節(jié)在此不一一列出,請查閱相關(guān)資料arch/arm/boot/Makefilearch/arm/boot/compressed/Makefilearch/arm/def-configs目錄中復(fù)制配置好的config文件arch/arm/kernel/Makefilearch/arm/kernel/debug-arch/arm/kernel/entry-arch/arm/kernel/arch/arm/mm/mm-arch/arm/math-s3c2410目錄在版內(nèi)核中沒有,這里都是C語言編寫的程序,是用戶自己添加的有關(guān)開放板上USB、電源管理等功能的相關(guān)代碼。實驗步驟1以下步驟在Linux下完成◆將所需文件copy到工作目錄

[m@RHEL~]$cp-r/arm2410s/exp/bootloader//root/embedded◆編譯生成bootloadervivi在/exp/bootloader/vivi/目錄下包含有vivi的源文件在終端下鍵入makemenuconfig,出現(xiàn)vivi的配置菜單,可根據(jù)實際情況對vivi的功能進(jìn)行添加修改,默認(rèn)的是適合本開發(fā)板的。然后鍵入make命令,會自動在當(dāng)前目錄下生成可用的bootloader文件vivi實驗步驟2◆裁減Linux內(nèi)核進(jìn)入源代碼所在的/root/embedded/kernel-2410s/目錄在終端下鍵入makemenuconfig,出現(xiàn)內(nèi)核配置菜單,可根據(jù)實際情況對內(nèi)核的功能進(jìn)行添加修改,默認(rèn)的是針對本開發(fā)板定制的選項。為了配合下次驅(qū)動程序的實驗,在配置內(nèi)核時,請將觸摸屏驅(qū)動的選項設(shè)置為[M],在makemenuconfig中位置如下:

Characterdevices>Mice>

<M>UP-NETARM2410touchscreenforADS7843support實驗步驟3◆編譯Linux內(nèi)核在./kernel-2410s/目錄下,執(zhí)行以下幾條命令:makeclean這條命令是在正式編譯內(nèi)核之前把環(huán)境清理干凈,保證沒有不正確的.o文件存在。makedep這條命令是編譯相關(guān)依賴文件makezImage這條命令就是最終的編譯命令。生成的內(nèi)核文件zImage將會在/kernel-2410s/arch/arm/boot/目錄下實驗步驟4◆編譯生成根文件系統(tǒng)首先將,/root/embedded/develop//目錄下面的兩個文件mkcramfs和拷貝到/develop/目錄下。然后,將/develop/目錄下的文件解壓 tarjxf 在/root/embedded/develop/目錄下生成了一個名為root的目錄在/root/embedded/下建立img目錄來存放將會生成的文件在/root/embedded/develop/目錄下執(zhí)行命令./,生成根文件系統(tǒng)為/root/embedded/img/目錄下的。實驗步驟5以下步驟在windows下完成◆格式化flash首先將步驟1至4生成的文件vivi、zImage和通過局域網(wǎng)samba服務(wù)器或U盤傳到旁邊的windows主機(jī)下,將此臺PC通過串口和開發(fā)板相連。Samba服務(wù)器的使用和網(wǎng)上鄰居類似將redhat的IP地址改到網(wǎng)段[root@RHEL~]ifconfigeth0add192.168.1.$機(jī)器號打開超級終端,設(shè)置好相關(guān)參數(shù):波特率為115200,數(shù)據(jù)位8,無奇偶校驗,停止位為1,無數(shù)據(jù)流控制。啟動開發(fā)板,按除了Enter外的任意鍵進(jìn)入vivi,按照以下命令格式化flash,重新分區(qū)。-注意下面的數(shù)字

vivi>bonpart0128k192k1216k4288k:m64704k實驗步驟6◆燒寫vivi這時已格式化flash,運行的是RAM中的vivi,注意不要重啟或斷電丟失數(shù)據(jù),否則會造成無法啟動開發(fā)板。在超級終端下輸入:vivi>loadflashvivix回車此時超級終端提示:ReadyfordownloaddingusingxmodemWaiting…$$$點擊超級終端任務(wù)欄上“傳送”下拉菜單中的“發(fā)送文件”,選擇Xmodem,選擇鏡像文件vivi,點擊“發(fā)送”。燒寫完成后,可以重啟開發(fā)板,重新進(jìn)入新的vivi>來燒寫kernel和root了。實驗步驟7◆燒寫內(nèi)核映像zImage在超級終端下輸入:vivi>loadflashkernelx回車此時超

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論