嵌入式第三章課件_第1頁
嵌入式第三章課件_第2頁
嵌入式第三章課件_第3頁
嵌入式第三章課件_第4頁
嵌入式第三章課件_第5頁
已閱讀5頁,還剩167頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

3.1Bootloader簡介Bootloader是指操作系統(tǒng)的啟動加載程序通常引導(dǎo)加載程序包括固化在固件(firmware)中的boot代碼(可選),和Bootloader兩大部分,是系統(tǒng)加電后運行的第一段軟件代碼相對于操作系統(tǒng)內(nèi)核來說,它是一個硬件抽象層3.1Bootloader簡介Bootloader是指操作PC機中的引導(dǎo)加載程序兩部分組成:BIOS(其本質(zhì)就是一段固件程序)位于硬盤MBR(MainBootRecord,主引導(dǎo)記錄)中的操作系統(tǒng)Bootloader(如LILO和GRUB等)流程:BIOS在完成硬件檢測和資源分配后,將硬盤MBR中的Bootloader讀到系統(tǒng)的RAM中,然后將控制權(quán)交給操作系統(tǒng)BootloaderBootloader的主要運行任務(wù)就是將內(nèi)核映象從硬盤上讀到RAM中,然后跳轉(zhuǎn)到內(nèi)核的入口點去運行,即開始啟動操作系統(tǒng)。PC機中的引導(dǎo)加載程序兩部分組成:嵌入式系統(tǒng)中引導(dǎo)加載程序嵌入式系統(tǒng)中通常沒有BIOS那樣的固件程序少數(shù)嵌入式CPU也會內(nèi)嵌一段短小的啟動程序系統(tǒng)的加載啟動任務(wù)就完全由Bootloader來完成例如ARM7TDMI中,系統(tǒng)在上電或復(fù)位時從地址0x00000000處開始執(zhí)行這個地址存放的是BootLoader程序嵌入式系統(tǒng)中引導(dǎo)加載程序嵌入式系統(tǒng)中通常沒有BIOS那樣的固典型的嵌入式系統(tǒng)BootloaderBlob:Bootloaderobject的縮寫開源,遵循GPL,很好的Linuxloader,主要針對ARMU-Boot:universalBootloader的縮寫開源,遵循GPL,支持ARM,MIPS,X86,Nios等處理器可啟動VxWorks,QNX,Linux等多種操作系統(tǒng)vivi最初是為S3C2410編寫的,用于啟動Linux,目前版本是0.1.4典型的嵌入式系統(tǒng)BootloaderBootloader的概念

在操作系統(tǒng)內(nèi)核運行之前運行的一段小程序功能:初始化硬件設(shè)備初始化內(nèi)存空間調(diào)整系統(tǒng)的軟硬件環(huán)境,以便操作系統(tǒng)內(nèi)核啟動Bootloader不通用:依賴于硬件依賴于具體的板級配置不同的CPU有不同的Bootloader有些Bootloader支持多種CPU,如U-Boot支持ARM和MIPSBootloader的概念在操作系統(tǒng)內(nèi)核運行之前運行的一段Bootloader所處的層次位置Bootloader啟動參數(shù)內(nèi)核根文件系統(tǒng)Bootloader所處的層次位置Bootloader啟動參3.2Bootloader的啟動流程3.2.1進入Bootloader3.2.2Bootloader的輸入輸出3.2.3Bootloader的啟動過程3.2.4Bootloader的操作模式3.2.5Bootloader與主機之間的文件傳輸3.2Bootloader的啟動流程3.2.1進入Boo3.2.1進入Bootloader系統(tǒng)第一條指令51:100h8086:FFFF:0000ARM:地址0x00000000嵌入式系統(tǒng)通常把固態(tài)存儲設(shè)備(比如:ROM、EEPROM或FLASH等)映射到這個預(yù)先安排的地址上,而Bootloader就放在這里所以,系統(tǒng)加電后,CPU將首先執(zhí)行Bootloader程序3.2.1進入Bootloader系統(tǒng)第一條指令嵌入式第三章課件3.2.2Bootloader的輸入輸出主機和目標機之間一般可通過串口建立連接,沒有串口的機器需要通過一條USB轉(zhuǎn)串口的電纜才能完成連接Bootloader執(zhí)行時通常會通過串口進行I/O輸出打印信息到串口從串口讀取用戶控制字符等串口的參數(shù)要事先約定,如115200,n,8,1,無流控3.2.2Bootloader的輸入輸出主機和目標機之間一3.2.3Bootloader的啟動過程一般采用多階段的Bootloader,它能提供更為復(fù)雜的功能,以及更好的可移植性從固態(tài)存儲設(shè)備上啟動的Bootloader大多都是2階段的啟動過程,啟動過程分為stage1和stage2兩部分Bootloader的2部分:匯編部分執(zhí)行簡單的硬件初始化C語言部分負責復(fù)制OS數(shù)據(jù),設(shè)置OS啟動參數(shù),通過串口通信顯示信息等功能3.2.3Bootloader的啟動過程一般采用多階段的BBOOTLOADER的生命周期:1.初始化硬件,如設(shè)置CPU主頻,設(shè)置RAM刷新頻率并檢測,設(shè)置UART(至少設(shè)置一個)等2.設(shè)置啟動參數(shù),告訴內(nèi)核硬件的信息,如用哪個啟動界面,使用的缺省串口控制臺及其波特率3.跳轉(zhuǎn)到操作系統(tǒng)的首地址4.消亡BOOTLOADER的生命周期:3.2.4Bootloader的操作模式1啟動加載模式:又叫自主(Autonomous)模式從目標機上的某個固態(tài)存儲設(shè)備上將操作系統(tǒng)加載到RAM中運行Bootloader的正常工作模式,沒有外界輸入時的缺省模式3.2.4Bootloader的操作模式1啟動加載模式:2下載模式:通過串口連接或網(wǎng)絡(luò)連接等通信手段連接主機(Host),能下載文件,如下載內(nèi)核映像和根文件系統(tǒng)映像等。從主機下載的文件通常首先被Bootloader保存到目標機的RAM中,然后再被BootLoader寫到目標機上的FLASH類固態(tài)存儲設(shè)備中。這種模式通常在第一次安裝內(nèi)核與根文件系統(tǒng)時被使用,當然系統(tǒng)更新也會使用Bootloader的這種工作模式下載模式下通常都會向它的終端用戶提供一個簡單的命令行接口2下載模式:vivi、Blob或U-Boot等功能強大的Bootloader通常同時支持這兩種工作模式,允許用戶在這兩種工作模式之間進行切換如Blob、uBoot、vivi在啟動時都處于正常的啟動加載模式,但是會延時(通常為10秒左右)等待終端用戶按下任意鍵以切換到下載模式。如在這段時間內(nèi)沒有用戶按鍵,則繼續(xù)啟動操作系統(tǒng),如Linuxvivi、Blob或U-Boot等功能強大的Boot3.2.5Bootloader與主機之間

的文件傳輸通常目標機上的Bootloader通過串口與主機之間進行文件傳輸串口傳輸協(xié)議(vivi的常用方式,uBoot也支持)通常是xmodem/ymodem/zmodem協(xié)議中的一種速度有限,一般傳輸文件不能太大可通過以太網(wǎng)連接并借助TFTP協(xié)議來下載文件(U-Boot的常用方式)解決了串口傳輸速度有限的問題要求主機提供TFTP服務(wù)3.2.5Bootloader與主機之間

的文件傳輸通常目3.3Bootloader的主要任務(wù)stage1

通常包括以下步驟:硬件設(shè)備初始化為加載Bootloader的stage2準備RAM空間拷貝Bootloader的stage2到RAM空間中設(shè)置好堆棧跳轉(zhuǎn)到stage2的C入口點stage2通常包括以下步驟:初始化本階段要使用到的硬件設(shè)備檢測系統(tǒng)內(nèi)存映射將kernel

映像和根文件系統(tǒng)映像從flash上讀到RAM空間中為內(nèi)核設(shè)置啟動參數(shù)調(diào)用內(nèi)核3.3Bootloader的主要任務(wù)stage1

通常包括stage2

的代碼通常用C語言來實現(xiàn)(stage1的代碼通常用匯編語言來實現(xiàn)),下面的論述針對stage2。要注意代碼的可讀性和可移植性不能使用glibc庫中的任何支持函數(shù)沒有直接把main地址直接作為stage2的入口點1)無法傳遞函數(shù)參數(shù);2)無法處理函數(shù)返回stage2

的代碼通常用C語言來實現(xiàn)(stage1的代碼通trampoline(彈簧床)編程方式:用匯編語言寫一段trampoline小程序,并將這段trampoline小程序來作為stage2可執(zhí)行映象的執(zhí)行入口點在trampoline匯編小程序中用CPU跳轉(zhuǎn)指令跳入main()函數(shù)中去執(zhí)行當main()函數(shù)返回時,CPU執(zhí)行路徑顯然再次回到trampoline程序。用trampoline小程序來作為main()函數(shù)的外部包裹(externalwrapper)trampoline(彈簧床)編程方式:blob的trampoline程序示例:

.text .globl_trampoline _trampoline: blmain /*ifmaineverreturnswejustcallitagain*/ b_trampolinevivi的trampoline程序示例:

@getreadtocallCfunctions ldr sp,DW_STACK_START @setupstackpointer movfp,#0 @nopreviousframe,sofp=0 mova2,#0 @setargvtoNULL blmain @callmain; movpc,#FLASH_BASE @otherwise,rebootblob的trampoline程序示例:串口終端調(diào)試手段:打印信息到串口終端串口終端顯示亂碼或根本沒有顯示(1)Bootloader對串口的初始化設(shè)置不正確。(2)運行在host端的終端仿真程序?qū)Υ诘脑O(shè)置不正確,這包括:波特率、奇偶校驗、數(shù)據(jù)位和停止位等方面的設(shè)置串口終端調(diào)試手段:打印信息到串口終端基本的硬件初始化

目的:為stage2的執(zhí)行以及隨后的kernel的執(zhí)行準備好一些基本的硬件環(huán)境1.屏蔽所有的中斷為中斷提供服務(wù)通常是OS設(shè)備驅(qū)動程序的責任,Bootloader的執(zhí)行全過程中可以不必響應(yīng)任何中斷中斷屏蔽可以通過寫CPU的中斷屏蔽寄存器或狀態(tài)寄存器(如ARM的CPSR寄存器)來完成2.設(shè)置CPU的速度和時鐘頻率。3.RAM初始化包括正確地設(shè)置系統(tǒng)的內(nèi)存控制器的功能寄存器以及各內(nèi)存控制寄存器等?;镜挠布跏蓟康模簽閟tage2的執(zhí)行以及隨后的ker4.初始化

LED通過GPIO來驅(qū)動LED,其目的是表明系統(tǒng)的狀態(tài)是OK還是Error如板子上沒有LED,那么也可以通過初始化UART向串口打印Bootloader的Logo字符信息5.關(guān)閉CPU內(nèi)部指令/數(shù)據(jù)cache4.初始化

LED為加載stage2準備RAM空間

通常把stage2加載到RAM空間中來執(zhí)行stage2通常是C語言執(zhí)行代碼,考慮堆??臻g,空間大小最好是存儲器頁大小(通常是4KB)的倍數(shù)一般1MRAM空間已經(jīng)足夠,地址范圍可以任意安排如blob就將stage2可執(zhí)行映像從系統(tǒng)RAM起始地址開始的1M空間內(nèi)執(zhí)行將stage2安排到RAM空間的最頂1MB也是一種值得推薦的方法。stage2_end=stage2_start+stage2_size為加載stage2準備RAM空間通常把stage2加載到對所安排的地址范圍進行測試必須確保所安排的地址范圍為可讀寫的RAM空間測試方法可以采用類似于blob的方法以存儲器的頁為被測試單位,測試每個頁開始的兩個字是否是可讀寫的對所安排的地址范圍進行測試拷貝stage2到RAM中

拷貝時需要用到下列地址:stage2的可執(zhí)行映象在固態(tài)存儲設(shè)備的存放起始地址和終止地址RAM空間的起始地址??截恠tage2到RAM中拷貝時需要用到下列地址:設(shè)置堆棧指針sp通常把sp的值設(shè)置為(stage2_end-4)1MB的RAM空間的最頂端(堆棧向下生長)在設(shè)置堆棧指針sp之前,也可以關(guān)閉led燈,以提示用戶我們準備跳轉(zhuǎn)到stage2設(shè)置堆棧指針sp通常把sp的值設(shè)置為(stage2_end跳轉(zhuǎn)到stage2的C入口點

最后跳轉(zhuǎn)到Bootloader的stage2去執(zhí)行如在ARM系統(tǒng)中,這可以通過修改PC寄存器為合適的地址來實現(xiàn)跳轉(zhuǎn)到stage2的C入口點最后跳轉(zhuǎn)到Bootloader初始化本階段要使用到的硬件設(shè)備

初始化至少一個串口,以便終端用戶進行I/O輸出信息初始化定時器等在初始化這些設(shè)備之前,也可以重新把LED燈點亮,以表明我們已經(jīng)進入main()函數(shù)執(zhí)行設(shè)備初始化完成后,可以輸出一些打印信息,程序名字字符串、版本號等初始化本階段要使用到的硬件設(shè)備初始化至少一個串口,以便終端檢測系統(tǒng)的內(nèi)存映射確定在物理地址空間中哪些地址范圍被分配用來尋址系統(tǒng)的RAM單元如SA-1100中,從0xC0000000開始的512M空間被用作系統(tǒng)的RAM空間在S3C44B0中,從0x0c000000到0x10000000之間的64M地址空間被用作系統(tǒng)的RAM地址空間在S3C2410中,從0x3000,0000到0x4000,0000之間的256M地址空間被用作系統(tǒng)的RAM地址空間檢測系統(tǒng)的內(nèi)存映射確定在物理地址空間中哪些地址范圍被分配用來嵌入式系統(tǒng)往往只把CPU預(yù)留的全部RAM地址空間中的一部分映射到RAM單元上,而讓剩下的那部分預(yù)留RAM地址空間處于未使用狀態(tài)Bootloader的stage2必須檢測整個系統(tǒng)的內(nèi)存映射情況必須知道CPU預(yù)留的全部RAM地址空間中的哪些被真正映射到RAM地址單元,哪些是處于"unused"狀態(tài)的嵌入式系統(tǒng)往往只把CPU預(yù)留的全部RAM地址空間中的一部分映加載內(nèi)核映像和根文件系統(tǒng)映像

規(guī)劃內(nèi)存占用的布局內(nèi)核映像所占用的內(nèi)存范圍根文件系統(tǒng)所占用的內(nèi)存范圍從Flash上拷貝加載內(nèi)核映像和根文件系統(tǒng)映像規(guī)劃內(nèi)存占用的布局設(shè)置內(nèi)核的啟動參數(shù)

Linux2.4.x以后的內(nèi)核都以標記列表(taggedlist)的形式來傳遞啟動參數(shù)啟動參數(shù)標記列表以標記ATAG_CORE開始,以標記ATAG_NONE結(jié)束每個標記由標識被傳遞參數(shù)的tag_header結(jié)構(gòu)以及隨后的參數(shù)值數(shù)據(jù)結(jié)構(gòu)來組成在嵌入式Linux系統(tǒng)中,通常需要由Bootloader設(shè)置的常見啟動參數(shù):ATAG_CORE、

ATAG_MEM、ATAG_CMDLINE、ATAG_RAMDISK、ATAG_INITRD等設(shè)置內(nèi)核的啟動參數(shù)Linux2.4.x以后的內(nèi)核都以標記調(diào)用內(nèi)核

直接跳轉(zhuǎn)到內(nèi)核的第一條指令處在跳轉(zhuǎn)時,下列條件要滿足1.CPU寄存器的設(shè)置R0=0;@R1=機器類型ID;@R2=啟動參數(shù)標記列表在RAM中起始基地址2.CPU模式必須禁止中斷(IRQs和FIQs);CPU必須SVC模式(超級用戶模式);3.Cache和MMU的設(shè)置MMU必須關(guān)閉;指令Cache可以打開也可以關(guān)閉;數(shù)據(jù)Cache必須關(guān)調(diào)用內(nèi)核直接跳轉(zhuǎn)到內(nèi)核的第一條指令處3.4幾種Bootloader介紹3.4.1WinCE的Bootloader3.4.2Redboot3.4.3Vivi3.4.4U-Boot3.4幾種Bootloader介紹3.4.1WinCE的3.4.1WinCE的Bootloader有3種:ROMBootloaderBIOSBootloaderMSDOS+Loadcepc3.4.1WinCE的Bootloader有3種:ROMBootloader又叫RomBoot存放在Flash/EEPROM中,原來BIOS的位置上電后CPU到固定地址執(zhí)行RomBoot的代碼對整個硬件系統(tǒng)進行初始化和檢測支持通過網(wǎng)卡從遠程機器上下載或者從本地IDE/ATA硬盤的活動分區(qū)中尋找nk.bin文件加載優(yōu)點:引導(dǎo)并且加載速度快,不需要BIOS、MSDOS和Loadcepc了缺點:需要CE開發(fā)者讀懂它的源碼并修改CE提供了RomBoot的所有源碼ROMBootloader又叫RomBootBIOSBootloader不需要MSDOS操作系統(tǒng),但需要BIOS和FAT文件系統(tǒng)系統(tǒng)上電后BIOS執(zhí)行完硬件初始化和配置后,BIOS檢查引導(dǎo)設(shè)備的啟動順序,如果引導(dǎo)設(shè)備是硬盤、CF卡這類的存儲設(shè)備,那么就加載這些存儲器上的主引導(dǎo)扇區(qū)(MasterBootSector)中的實模式代碼(MBR)到內(nèi)存,然后執(zhí)行這些代碼MBR首先在分區(qū)表(同樣位于主引導(dǎo)扇區(qū))中尋找活動分區(qū),如果存在,就加載位于活動分區(qū)的第一個扇區(qū)(引導(dǎo)扇區(qū))上的代碼到內(nèi)存,然后執(zhí)行。引導(dǎo)扇區(qū)上的代碼的功能是找到并且加載BIOSBootloader,BIOSBootloader再加載nk.bin。對于BIOSBootloader,CE提供了Setupdisk.144和Bootdisk.144兩個文件BIOSBootloaderBIOSBootloader不需要MSDOS操作系統(tǒng),但需BIOSBootloader和MSDOS+Loadcepc兩種方式差不多在MSDOS啟動后再執(zhí)行l(wèi)oadcepc.exe,讓loadcepc加載nk.bin到內(nèi)存后再把CPU控制權(quán)交給CE內(nèi)核程序MSDOS+LoadcepcBIOSBootloader和MSDOS+Loadcepc3.4.4U-Boot簡介主要功能特點主要目錄結(jié)構(gòu)調(diào)試方法移植的主要步驟主要命令3.4.4U-Boot簡介簡介德國DENX軟件工程中心的WolfgangDenk全稱UniversalBootloader遵循GPL條款的開放源碼項目從FADSROM、8xxROM、PPCBOOT發(fā)展而來其源碼目錄、編譯形式與Linux內(nèi)核很相似源碼就是相應(yīng)Linux內(nèi)核源程序的簡化,尤其是設(shè)備驅(qū)動程序支持:嵌入式Linux/NetBSD/VxWorks/QNX/LynxOS等PowerPC、MIPS、x86、ARM、XScale等對PowerPC系列處理器/對Linux的支持最完善簡介德國DENX軟件工程中心的WolfgangDenk主要功能主要功能特點①開放源碼;②支持多種嵌入式操作系統(tǒng)內(nèi)核;③支持多個處理器系列;④較高的可靠性和穩(wěn)定性;⑤高度靈活的功能設(shè)置,適合U-Boot調(diào)試、操作系統(tǒng)不同引導(dǎo)要求、產(chǎn)品發(fā)布等;⑥豐富的設(shè)備驅(qū)動源碼;⑦較豐富的開發(fā)調(diào)試文檔與強大的網(wǎng)絡(luò)支持。特點①開放源碼;主要目錄結(jié)構(gòu)Board:目標板相關(guān)文件,主要包含SDRAM、FLASH驅(qū)動;Common:獨立于處理器體系結(jié)構(gòu)的通用代碼,如內(nèi)存大小探測與故障檢測;Cpu:與處理器相關(guān)的文件。如mpc8xx子目錄下含串口、網(wǎng)口、LCD驅(qū)動及中斷初始化等文件;Driver:通用設(shè)備驅(qū)動,如CFIFLASH驅(qū)動(目前對INTELFLASH支持較好)Doc:U-Boot的說明文檔;主要目錄結(jié)構(gòu)Board:目標板相關(guān)文件,主要包含SDRAM、Include:U-Boot頭文件;尤其configs子目錄下與目標板相關(guān)的配置頭文件是移植過程中經(jīng)常要修改的文件;lib_xxx:處理器體系相關(guān)的文件,如lib_ppc,lib_arm目錄分別包含與PowerPC、ARM體系結(jié)構(gòu)相關(guān)的文件;net:與網(wǎng)絡(luò)功能相關(guān)的文件目錄,如bootp,nfs,tftp;Post:上電自檢文件目錄。尚有待于進一步完善;Tools:用于創(chuàng)建U-BootS-RECORD和BIN鏡像文件的工具;Rtc:RTC驅(qū)動程序。Include:U-Boot頭文件;尤其configs子目錄調(diào)試方法大致分為兩種:先用仿真器創(chuàng)建目標板初始運行環(huán)境,將U-Boot鏡像文件U-Boot.bin下載到目標板RAM中的指定位置,然后進行跟蹤調(diào)試好處:不用將Uboot鏡像文件燒寫到Flash中去弊端:對移植開發(fā)人員的移植調(diào)試技能要求較高,調(diào)試器的配置文件較為復(fù)雜用調(diào)試器先將U-Boot鏡像文件燒寫到Flash中去,然后用GDB調(diào)試器調(diào)試所用的調(diào)試器配置文件較為簡單,調(diào)試過程與U-Boot移植后運行過程相吻合U-Boot先從Flash中運行,再重載至RAM中相應(yīng)位置,并從那里正式投入運行需要不斷燒寫Flash調(diào)試方法大致分為兩種:移植的主要步驟以S3C2410為例,說明U-Boot的主要移植步驟:1.修改Makefile文件 whhit2410_config

:

unconfig

@./mkconfig$(@:_config=)armarm920twhhit2410NULLs3c24x0各項的意思如下:arm:CPU的架構(gòu)(ARCH)arm920t:CPU的類型(CPU),其對應(yīng)于cpu/arm920t子目錄。whhit2410:開發(fā)板的型號(BOARD),對應(yīng)于board/whhit2410目錄。NULL:開發(fā)者/或經(jīng)銷商(vender)。s3c24x0:片上系統(tǒng)(SOC)。移植的主要步驟以S3C2410為例,說明U-Boot的主要移2.建立board/whhit2410目錄,拷貝board/smdk2410下的文件到board/whhit2410目錄,將smdk2410.c更名為whhit2410.c3.cpinclude/configs/smdk2410.hinclude/configs/whhit2410.h4.將arm-linux-gcc的目錄加入到PATH環(huán)境變量中5.測試編譯能否成功:

makewhhit2410_config

makeallARCH=arm

生成U-Boot.bin就OK了2.建立board/whhit2410目錄,拷貝board6.依照你自己開發(fā)板的內(nèi)存地址分配情況修改board/whhit2410/memsetup.S文件7.在board/whhit2410加入NANDFlash讀函數(shù),建立nand_read.c。8.修改board/whhit2410/Makefile9.修改cpu/arm920t/start.S文件10.修改include/configs/whhit2410.h文件11.重新編譯U-Boot

makeallARCH=arm12.通過jtag將U-Boot燒寫到flash6.依照你自己開發(fā)板的內(nèi)存地址分配情況修改board/wh主要命令打印環(huán)境變量列表:

printenv設(shè)置tftp服務(wù)器的ip地址

setenvserverip6設(shè)置本機(開發(fā)板)的ip地址

setenvipaddr1保存前面對環(huán)境變量所做的修改

saveenv通過tftp下載內(nèi)核(串口下載命令為loady)

tftp0x30008000uImage nanderase0x800000x200000 nandwrite0x300080000x800000x200000主要命令打印環(huán)境變量列表:

printenv3.4.2RedbootRedhat公司隨eCos發(fā)布的一個開源BOOT支持:ARM,MIPS,MN10300,PowerPC,RenesasSHx,v850,x86使用X-modem或Y-modem協(xié)議經(jīng)由串口下載,也可以經(jīng)由以太網(wǎng)口通過BOOTP/DHCP服務(wù)獲得IP參數(shù),使用TFTP方式下載程序映像文件,常用于調(diào)試支持和系統(tǒng)初始化Redboot可以通過串口和以太網(wǎng)口與GDB進行通信,調(diào)試程序,能中斷被GDB運行的應(yīng)用程序Redboot提供了一個交互式命令行接口,用來從TFTP服務(wù)器或者從Flash下載映像文件、加載系統(tǒng)的引導(dǎo)腳本文件,它保存在Flash上3.4.2RedbootRedhat公司隨eCos發(fā)布的3.4.3vivivivi是由韓國mizi公司設(shè)計為ARM處理器系列設(shè)計的一個bootloader,支持使用串口和主機通信。vivi與其它Bootloader相比,增加了對分區(qū)的命令支持vivi程序流程編譯vivivivi的使用3.4.3vivivivi是由韓國mizi公司設(shè)計為A系統(tǒng)復(fù)位禁止看門狗關(guān)閉中斷初始化系統(tǒng)時鐘跳到stage2入口執(zhí)行輸出vivi版本號開發(fā)板初始化內(nèi)存映射并拷貝vivi代碼到SDRAM中初始化堆棧初始化MTD設(shè)備初始化私有數(shù)據(jù)初始化內(nèi)置命令啟動vivi-boot_or_vivi系統(tǒng)復(fù)位禁止看門狗關(guān)閉中斷初始化系統(tǒng)時鐘跳到stage2入口編譯vivi首先,進入vivi源代碼目錄:#cd/vivi然后配置和編譯它,執(zhí)行:#makemenuconfig,實際上,你不需要自己手工選擇配置它,已經(jīng)配置好了,只需裝載一個缺省的配置文件即可,使用這個配置文件生成的vivi正好適合于目標板,這個配置文件在vivi/arch/def-configs目錄中,該目錄包含了一些適合于各種板的配置文件。裝載“arch/def-configs/smdk2410”后保存該設(shè)置,并執(zhí)行#make命令編譯vivi#cd/vivi#makemenuconfig將出現(xiàn)下面窗口:編譯vivi首先,進入vivi源代碼目錄:#cd/viv在跳出的窗口中選擇“LoadonAlternateConfigurationFile”菜單,然后輸入“arch/def-configs/smdk2410”。在跳出的窗口中選擇“LoadonAlternateC再選擇“OK”,前一個界面又會出現(xiàn)一次,這時選擇退出,然后選擇“Yes”保存剛才的配置。再選擇“OK”,前一個界面又會出現(xiàn)一次,這時選擇退出,然后選保存完畢,執(zhí)行以下命令:#make如果編譯過程順利,將會在當前目錄下生成vivi二進制映象文件保存完畢,執(zhí)行以下命令:vivi的使用Vivi的使用可以查看mizi公司的vivi使用手冊,下面會介紹其中幾個經(jīng)常使用的命令使用JTAG接口下載vivivivi的load命令參數(shù)設(shè)定命令vivi的使用Vivi的使用可以查看mizi公司的vivi使使用JTAG接口下載vivi使用JTAG接口下載程序需要JTAG小板、連接電纜和燒寫程序。把JTAG小板和電纜連接S3C2410開發(fā)板和主機的并口,然后打開目標板電源開關(guān)燒寫程序有2種:PC端windows環(huán)境下的燒寫程序PC端linux環(huán)境下的燒寫程序Mizi公司提供了下載軟件,Jflash是Linux的下載程序在Linux下執(zhí)行以下命令可以查看Jflash的使用方法: #./Jflash–s3c2410--help使用JTAG接口下載vivi使用JTAG接口下載程序需要對應(yīng)不同類型的Flash,Jflash程序使用不同的選項參數(shù),如使用64M三星NandFlash,則“/t=5”,可執(zhí)行以下命令開始燒寫vivi。 #./Jflash-s3c2410vivi/t=5對應(yīng)不同類型的Flash,Jflash程序使用不同的選項當vivi燒入Flash,并能正常啟動,連接好串口,運行minicom終端程序,就會進入vivi的命令提示符下。當vivi燒入Flash,并能正常啟動,連接好串口,運行m嵌入式第三章課件vivi的load命令命令格式如下: loadflashkernelx其中:load–vivi的下載命令flash–把文件下載到flash中kernel–要下載的文件是kernel類型,和分區(qū)參數(shù)同名,還可以是vivi,rootx–使用超級終端的xmdoem協(xié)議下載。使用mincom時,先按下“Ctrl”,不要松開,再按下“a”鍵,然后同時松開,再按下“s”鍵,進入下載模式,選擇xmodem協(xié)議方式下載。vivi的load命令命令格式如下:嵌入式第三章課件嵌入式第三章課件按回車,再按回車輸入要下載的文件,注意最好把要下載的文件復(fù)制到/root目錄。按回車,再按回車輸入要下載的文件,注意最好把要下載的文件復(fù)制嵌入式第三章課件發(fā)送文件結(jié)束,vivi將自動保存所下載的文件到flash中此時,如果輸入“boot”命令,vivi將會啟動剛剛下載的內(nèi)核發(fā)送文件結(jié)束,vivi將自動保存所下載的文件到flash參數(shù)設(shè)定命令paramsetlinuxcommandlineis:"noinitrdroot=/dev/mtdblock/0init=/linuxrcconsole=ttyS0"paramsetlinuxcommandlineis:"noinitrdroot=/dev/bon/2init=/linuxrcconsole=ttyS0"paramsetlinux_cmd_line“console=ttyS0root=/dev/nfsnfsroot=:/hit/rootip=9::::localhost:eth0:off"paramshowparamsave參數(shù)設(shè)定命令paramsetlinuxcommand3.5終端仿真一般嵌入式操作系統(tǒng)在調(diào)試開發(fā)的時候,沒有像PC那樣的VGA輸出,一般都是通過串口來查看信息,在嵌入式Linux中,這被稱作“串口終端”。主要有2種串口終端,使用它們登錄Linux系統(tǒng)是一樣的效果:

3.5.1Linux下的minicom3.5.2Windows下的超級終端3.5終端仿真一般嵌入式操作系統(tǒng)在調(diào)試開發(fā)的時候,沒有像P3.5.1Linux下的minicom一般完全安裝大部分發(fā)行版的Linux時都會包含它minicom,它的使用方法如下:使用minicom之前的設(shè)置選擇串口設(shè)置波特率設(shè)置無流控制保存設(shè)置3.5.1Linux下的minicom一般完全安裝大部分發(fā)使用minicom之前的設(shè)置輸入命令進行設(shè)置:minicom–s使用minicom之前的設(shè)置輸入命令進行設(shè)置:minicom選擇串口選擇菜單中的“Serialportsetup”,按回車,然后按“A”以設(shè)置“SerialDevice”(若使用串口1,則輸入/dev/ttyS0,使用串口2,則輸入/dev/ttyS1)。選擇串口選擇菜單中的“Serialportsetup”,設(shè)置波特率按“E”鍵進入設(shè)置“bps/par/Bits”(波特率)界面,再按“I”以設(shè)置波特率為115200。設(shè)置波特率按“E”鍵進入設(shè)置“bps/par/Bits”(波設(shè)置無流控制按“F”鍵設(shè)置“HardwareFlowControl”為“NO”設(shè)置無流控制按“F”鍵設(shè)置“HardwareFlowCo保存設(shè)置選擇“Exit”退出設(shè)置模式。剛才的設(shè)置被保存到“/etc/minirc.dfl”。設(shè)置完畢,如果此時打開目標板電源的電源開關(guān),就會看到vivi的啟動信息當Linux啟動以后,minicom就等于相當于虛擬終端,你就能通過它來操作目標板了。要退出minicom,同時按下“Ctrl+A”鍵,送開后緊接著再按下“Q”鍵,在跳出的窗口中,選擇“Yes”,保存設(shè)置選擇“Exit”退出設(shè)置模式。剛才的設(shè)置被保存到“嵌入式第三章課件3.5.2Windows下的超級終端打開超級終端安裝選擇設(shè)置名字選擇串口設(shè)置串口保存設(shè)置3.5.2Windows下的超級終端打開超級終端打開超級終端超級終端程序通常位于附件中的通訊中,它是一個文件夾,點開始按鈕直至找到該項點擊打開該目錄打開超級終端超級終端程序通常位于附件中的通訊中,它是一個文件安裝選擇"Hypertrm"圖標所指即是超級終端程序,當該程序第一次運行時,會詢問你是否要安裝一個Modem,點“否”按鈕。安裝選擇"Hypertrm"圖標所指即是超級終端程序,當該設(shè)置名字為連接取一個名字,比如”ttyS0”設(shè)置名字為連接取一個名字,比如”ttyS0”選擇串口當你命名完以后,需要選擇連接目標板的串口選擇串口當你命名完以后,需要選擇連接目標板的串口設(shè)置串口設(shè)置串口,選擇無流控制,波特率是115200,設(shè)置串口設(shè)置串口,選擇無流控制,波特率是115200,精品課件!精品課件!精品課件!精品課件!保存設(shè)置選擇超級終端“文件”菜單下的“另存為…”,保存該連接設(shè)置,以后再連接時就不必重新執(zhí)行以上設(shè)置了保存設(shè)置選擇超級終端“文件”菜單下的“另存為…”,保存該3.1Bootloader簡介Bootloader是指操作系統(tǒng)的啟動加載程序通常引導(dǎo)加載程序包括固化在固件(firmware)中的boot代碼(可選),和Bootloader兩大部分,是系統(tǒng)加電后運行的第一段軟件代碼相對于操作系統(tǒng)內(nèi)核來說,它是一個硬件抽象層3.1Bootloader簡介Bootloader是指操作PC機中的引導(dǎo)加載程序兩部分組成:BIOS(其本質(zhì)就是一段固件程序)位于硬盤MBR(MainBootRecord,主引導(dǎo)記錄)中的操作系統(tǒng)Bootloader(如LILO和GRUB等)流程:BIOS在完成硬件檢測和資源分配后,將硬盤MBR中的Bootloader讀到系統(tǒng)的RAM中,然后將控制權(quán)交給操作系統(tǒng)BootloaderBootloader的主要運行任務(wù)就是將內(nèi)核映象從硬盤上讀到RAM中,然后跳轉(zhuǎn)到內(nèi)核的入口點去運行,即開始啟動操作系統(tǒng)。PC機中的引導(dǎo)加載程序兩部分組成:嵌入式系統(tǒng)中引導(dǎo)加載程序嵌入式系統(tǒng)中通常沒有BIOS那樣的固件程序少數(shù)嵌入式CPU也會內(nèi)嵌一段短小的啟動程序系統(tǒng)的加載啟動任務(wù)就完全由Bootloader來完成例如ARM7TDMI中,系統(tǒng)在上電或復(fù)位時從地址0x00000000處開始執(zhí)行這個地址存放的是BootLoader程序嵌入式系統(tǒng)中引導(dǎo)加載程序嵌入式系統(tǒng)中通常沒有BIOS那樣的固典型的嵌入式系統(tǒng)BootloaderBlob:Bootloaderobject的縮寫開源,遵循GPL,很好的Linuxloader,主要針對ARMU-Boot:universalBootloader的縮寫開源,遵循GPL,支持ARM,MIPS,X86,Nios等處理器可啟動VxWorks,QNX,Linux等多種操作系統(tǒng)vivi最初是為S3C2410編寫的,用于啟動Linux,目前版本是0.1.4典型的嵌入式系統(tǒng)BootloaderBootloader的概念

在操作系統(tǒng)內(nèi)核運行之前運行的一段小程序功能:初始化硬件設(shè)備初始化內(nèi)存空間調(diào)整系統(tǒng)的軟硬件環(huán)境,以便操作系統(tǒng)內(nèi)核啟動Bootloader不通用:依賴于硬件依賴于具體的板級配置不同的CPU有不同的Bootloader有些Bootloader支持多種CPU,如U-Boot支持ARM和MIPSBootloader的概念在操作系統(tǒng)內(nèi)核運行之前運行的一段Bootloader所處的層次位置Bootloader啟動參數(shù)內(nèi)核根文件系統(tǒng)Bootloader所處的層次位置Bootloader啟動參3.2Bootloader的啟動流程3.2.1進入Bootloader3.2.2Bootloader的輸入輸出3.2.3Bootloader的啟動過程3.2.4Bootloader的操作模式3.2.5Bootloader與主機之間的文件傳輸3.2Bootloader的啟動流程3.2.1進入Boo3.2.1進入Bootloader系統(tǒng)第一條指令51:100h8086:FFFF:0000ARM:地址0x00000000嵌入式系統(tǒng)通常把固態(tài)存儲設(shè)備(比如:ROM、EEPROM或FLASH等)映射到這個預(yù)先安排的地址上,而Bootloader就放在這里所以,系統(tǒng)加電后,CPU將首先執(zhí)行Bootloader程序3.2.1進入Bootloader系統(tǒng)第一條指令嵌入式第三章課件3.2.2Bootloader的輸入輸出主機和目標機之間一般可通過串口建立連接,沒有串口的機器需要通過一條USB轉(zhuǎn)串口的電纜才能完成連接Bootloader執(zhí)行時通常會通過串口進行I/O輸出打印信息到串口從串口讀取用戶控制字符等串口的參數(shù)要事先約定,如115200,n,8,1,無流控3.2.2Bootloader的輸入輸出主機和目標機之間一3.2.3Bootloader的啟動過程一般采用多階段的Bootloader,它能提供更為復(fù)雜的功能,以及更好的可移植性從固態(tài)存儲設(shè)備上啟動的Bootloader大多都是2階段的啟動過程,啟動過程分為stage1和stage2兩部分Bootloader的2部分:匯編部分執(zhí)行簡單的硬件初始化C語言部分負責復(fù)制OS數(shù)據(jù),設(shè)置OS啟動參數(shù),通過串口通信顯示信息等功能3.2.3Bootloader的啟動過程一般采用多階段的BBOOTLOADER的生命周期:1.初始化硬件,如設(shè)置CPU主頻,設(shè)置RAM刷新頻率并檢測,設(shè)置UART(至少設(shè)置一個)等2.設(shè)置啟動參數(shù),告訴內(nèi)核硬件的信息,如用哪個啟動界面,使用的缺省串口控制臺及其波特率3.跳轉(zhuǎn)到操作系統(tǒng)的首地址4.消亡BOOTLOADER的生命周期:3.2.4Bootloader的操作模式1啟動加載模式:又叫自主(Autonomous)模式從目標機上的某個固態(tài)存儲設(shè)備上將操作系統(tǒng)加載到RAM中運行Bootloader的正常工作模式,沒有外界輸入時的缺省模式3.2.4Bootloader的操作模式1啟動加載模式:2下載模式:通過串口連接或網(wǎng)絡(luò)連接等通信手段連接主機(Host),能下載文件,如下載內(nèi)核映像和根文件系統(tǒng)映像等。從主機下載的文件通常首先被Bootloader保存到目標機的RAM中,然后再被BootLoader寫到目標機上的FLASH類固態(tài)存儲設(shè)備中。這種模式通常在第一次安裝內(nèi)核與根文件系統(tǒng)時被使用,當然系統(tǒng)更新也會使用Bootloader的這種工作模式下載模式下通常都會向它的終端用戶提供一個簡單的命令行接口2下載模式:vivi、Blob或U-Boot等功能強大的Bootloader通常同時支持這兩種工作模式,允許用戶在這兩種工作模式之間進行切換如Blob、uBoot、vivi在啟動時都處于正常的啟動加載模式,但是會延時(通常為10秒左右)等待終端用戶按下任意鍵以切換到下載模式。如在這段時間內(nèi)沒有用戶按鍵,則繼續(xù)啟動操作系統(tǒng),如Linuxvivi、Blob或U-Boot等功能強大的Boot3.2.5Bootloader與主機之間

的文件傳輸通常目標機上的Bootloader通過串口與主機之間進行文件傳輸串口傳輸協(xié)議(vivi的常用方式,uBoot也支持)通常是xmodem/ymodem/zmodem協(xié)議中的一種速度有限,一般傳輸文件不能太大可通過以太網(wǎng)連接并借助TFTP協(xié)議來下載文件(U-Boot的常用方式)解決了串口傳輸速度有限的問題要求主機提供TFTP服務(wù)3.2.5Bootloader與主機之間

的文件傳輸通常目3.3Bootloader的主要任務(wù)stage1

通常包括以下步驟:硬件設(shè)備初始化為加載Bootloader的stage2準備RAM空間拷貝Bootloader的stage2到RAM空間中設(shè)置好堆棧跳轉(zhuǎn)到stage2的C入口點stage2通常包括以下步驟:初始化本階段要使用到的硬件設(shè)備檢測系統(tǒng)內(nèi)存映射將kernel

映像和根文件系統(tǒng)映像從flash上讀到RAM空間中為內(nèi)核設(shè)置啟動參數(shù)調(diào)用內(nèi)核3.3Bootloader的主要任務(wù)stage1

通常包括stage2

的代碼通常用C語言來實現(xiàn)(stage1的代碼通常用匯編語言來實現(xiàn)),下面的論述針對stage2。要注意代碼的可讀性和可移植性不能使用glibc庫中的任何支持函數(shù)沒有直接把main地址直接作為stage2的入口點1)無法傳遞函數(shù)參數(shù);2)無法處理函數(shù)返回stage2

的代碼通常用C語言來實現(xiàn)(stage1的代碼通trampoline(彈簧床)編程方式:用匯編語言寫一段trampoline小程序,并將這段trampoline小程序來作為stage2可執(zhí)行映象的執(zhí)行入口點在trampoline匯編小程序中用CPU跳轉(zhuǎn)指令跳入main()函數(shù)中去執(zhí)行當main()函數(shù)返回時,CPU執(zhí)行路徑顯然再次回到trampoline程序。用trampoline小程序來作為main()函數(shù)的外部包裹(externalwrapper)trampoline(彈簧床)編程方式:blob的trampoline程序示例:

.text .globl_trampoline _trampoline: blmain /*ifmaineverreturnswejustcallitagain*/ b_trampolinevivi的trampoline程序示例:

@getreadtocallCfunctions ldr sp,DW_STACK_START @setupstackpointer movfp,#0 @nopreviousframe,sofp=0 mova2,#0 @setargvtoNULL blmain @callmain; movpc,#FLASH_BASE @otherwise,rebootblob的trampoline程序示例:串口終端調(diào)試手段:打印信息到串口終端串口終端顯示亂碼或根本沒有顯示(1)Bootloader對串口的初始化設(shè)置不正確。(2)運行在host端的終端仿真程序?qū)Υ诘脑O(shè)置不正確,這包括:波特率、奇偶校驗、數(shù)據(jù)位和停止位等方面的設(shè)置串口終端調(diào)試手段:打印信息到串口終端基本的硬件初始化

目的:為stage2的執(zhí)行以及隨后的kernel的執(zhí)行準備好一些基本的硬件環(huán)境1.屏蔽所有的中斷為中斷提供服務(wù)通常是OS設(shè)備驅(qū)動程序的責任,Bootloader的執(zhí)行全過程中可以不必響應(yīng)任何中斷中斷屏蔽可以通過寫CPU的中斷屏蔽寄存器或狀態(tài)寄存器(如ARM的CPSR寄存器)來完成2.設(shè)置CPU的速度和時鐘頻率。3.RAM初始化包括正確地設(shè)置系統(tǒng)的內(nèi)存控制器的功能寄存器以及各內(nèi)存控制寄存器等?;镜挠布跏蓟康模簽閟tage2的執(zhí)行以及隨后的ker4.初始化

LED通過GPIO來驅(qū)動LED,其目的是表明系統(tǒng)的狀態(tài)是OK還是Error如板子上沒有LED,那么也可以通過初始化UART向串口打印Bootloader的Logo字符信息5.關(guān)閉CPU內(nèi)部指令/數(shù)據(jù)cache4.初始化

LED為加載stage2準備RAM空間

通常把stage2加載到RAM空間中來執(zhí)行stage2通常是C語言執(zhí)行代碼,考慮堆??臻g,空間大小最好是存儲器頁大小(通常是4KB)的倍數(shù)一般1MRAM空間已經(jīng)足夠,地址范圍可以任意安排如blob就將stage2可執(zhí)行映像從系統(tǒng)RAM起始地址開始的1M空間內(nèi)執(zhí)行將stage2安排到RAM空間的最頂1MB也是一種值得推薦的方法。stage2_end=stage2_start+stage2_size為加載stage2準備RAM空間通常把stage2加載到對所安排的地址范圍進行測試必須確保所安排的地址范圍為可讀寫的RAM空間測試方法可以采用類似于blob的方法以存儲器的頁為被測試單位,測試每個頁開始的兩個字是否是可讀寫的對所安排的地址范圍進行測試拷貝stage2到RAM中

拷貝時需要用到下列地址:stage2的可執(zhí)行映象在固態(tài)存儲設(shè)備的存放起始地址和終止地址RAM空間的起始地址??截恠tage2到RAM中拷貝時需要用到下列地址:設(shè)置堆棧指針sp通常把sp的值設(shè)置為(stage2_end-4)1MB的RAM空間的最頂端(堆棧向下生長)在設(shè)置堆棧指針sp之前,也可以關(guān)閉led燈,以提示用戶我們準備跳轉(zhuǎn)到stage2設(shè)置堆棧指針sp通常把sp的值設(shè)置為(stage2_end跳轉(zhuǎn)到stage2的C入口點

最后跳轉(zhuǎn)到Bootloader的stage2去執(zhí)行如在ARM系統(tǒng)中,這可以通過修改PC寄存器為合適的地址來實現(xiàn)跳轉(zhuǎn)到stage2的C入口點最后跳轉(zhuǎn)到Bootloader初始化本階段要使用到的硬件設(shè)備

初始化至少一個串口,以便終端用戶進行I/O輸出信息初始化定時器等在初始化這些設(shè)備之前,也可以重新把LED燈點亮,以表明我們已經(jīng)進入main()函數(shù)執(zhí)行設(shè)備初始化完成后,可以輸出一些打印信息,程序名字字符串、版本號等初始化本階段要使用到的硬件設(shè)備初始化至少一個串口,以便終端檢測系統(tǒng)的內(nèi)存映射確定在物理地址空間中哪些地址范圍被分配用來尋址系統(tǒng)的RAM單元如SA-1100中,從0xC0000000開始的512M空間被用作系統(tǒng)的RAM空間在S3C44B0中,從0x0c000000到0x10000000之間的64M地址空間被用作系統(tǒng)的RAM地址空間在S3C2410中,從0x3000,0000到0x4000,0000之間的256M地址空間被用作系統(tǒng)的RAM地址空間檢測系統(tǒng)的內(nèi)存映射確定在物理地址空間中哪些地址范圍被分配用來嵌入式系統(tǒng)往往只把CPU預(yù)留的全部RAM地址空間中的一部分映射到RAM單元上,而讓剩下的那部分預(yù)留RAM地址空間處于未使用狀態(tài)Bootloader的stage2必須檢測整個系統(tǒng)的內(nèi)存映射情況必須知道CPU預(yù)留的全部RAM地址空間中的哪些被真正映射到RAM地址單元,哪些是處于"unused"狀態(tài)的嵌入式系統(tǒng)往往只把CPU預(yù)留的全部RAM地址空間中的一部分映加載內(nèi)核映像和根文件系統(tǒng)映像

規(guī)劃內(nèi)存占用的布局內(nèi)核映像所占用的內(nèi)存范圍根文件系統(tǒng)所占用的內(nèi)存范圍從Flash上拷貝加載內(nèi)核映像和根文件系統(tǒng)映像規(guī)劃內(nèi)存占用的布局設(shè)置內(nèi)核的啟動參數(shù)

Linux2.4.x以后的內(nèi)核都以標記列表(taggedlist)的形式來傳遞啟動參數(shù)啟動參數(shù)標記列表以標記ATAG_CORE開始,以標記ATAG_NONE結(jié)束每個標記由標識被傳遞參數(shù)的tag_header結(jié)構(gòu)以及隨后的參數(shù)值數(shù)據(jù)結(jié)構(gòu)來組成在嵌入式Linux系統(tǒng)中,通常需要由Bootloader設(shè)置的常見啟動參數(shù):ATAG_CORE、

ATAG_MEM、ATAG_CMDLINE、ATAG_RAMDISK、ATAG_INITRD等設(shè)置內(nèi)核的啟動參數(shù)Linux2.4.x以后的內(nèi)核都以標記調(diào)用內(nèi)核

直接跳轉(zhuǎn)到內(nèi)核的第一條指令處在跳轉(zhuǎn)時,下列條件要滿足1.CPU寄存器的設(shè)置R0=0;@R1=機器類型ID;@R2=啟動參數(shù)標記列表在RAM中起始基地址2.CPU模式必須禁止中斷(IRQs和FIQs);CPU必須SVC模式(超級用戶模式);3.Cache和MMU的設(shè)置MMU必須關(guān)閉;指令Cache可以打開也可以關(guān)閉;數(shù)據(jù)Cache必須關(guān)調(diào)用內(nèi)核直接跳轉(zhuǎn)到內(nèi)核的第一條指令處3.4幾種Bootloader介紹3.4.1WinCE的Bootloader3.4.2Redboot3.4.3Vivi3.4.4U-Boot3.4幾種Bootloader介紹3.4.1WinCE的3.4.1WinCE的Bootloader有3種:ROMBootloaderBIOSBootloaderMSDOS+Loadcepc3.4.1WinCE的Bootloader有3種:ROMBootloader又叫RomBoot存放在Flash/EEPROM中,原來BIOS的位置上電后CPU到固定地址執(zhí)行RomBoot的代碼對整個硬件系統(tǒng)進行初始化和檢測支持通過網(wǎng)卡從遠程機器上下載或者從本地IDE/ATA硬盤的活動分區(qū)中尋找nk.bin文件加載優(yōu)點:引導(dǎo)并且加載速度快,不需要BIOS、MSDOS和Loadcepc了缺點:需要CE開發(fā)者讀懂它的源碼并修改CE提供了RomBoot的所有源碼ROMBootloader又叫RomBootBIOSBootloader不需要MSDOS操作系統(tǒng),但需要BIOS和FAT文件系統(tǒng)系統(tǒng)上電后BIOS執(zhí)行完硬件初始化和配置后,BIOS檢查引導(dǎo)設(shè)備的啟動順序,如果引導(dǎo)設(shè)備是硬盤、CF卡這類的存儲設(shè)備,那么就加載這些存儲器上的主引導(dǎo)扇區(qū)(MasterBootSector)中的實模式代碼(MBR)到內(nèi)存,然后執(zhí)行這些代碼MBR首先在分區(qū)表(同樣位于主引導(dǎo)扇區(qū))中尋找活動分區(qū),如果存在,就加載位于活動分區(qū)的第一個扇區(qū)(引導(dǎo)扇區(qū))上的代碼到內(nèi)存,然后執(zhí)行。引導(dǎo)扇區(qū)上的代碼的功能是找到并且加載BIOSBootloader,BIOSBootloader再加載nk.bin。對于BIOSBootloader,CE提供了Setupdisk.144和Bootdisk.144兩個文件BIOSBootloaderBIOSBootloader不需要MSDOS操作系統(tǒng),但需BIOSBootloader和MSDOS+Loadcepc兩種方式差不多在MSDOS啟動后再執(zhí)行l(wèi)oadcepc.exe,讓loadcepc加載nk.bin到內(nèi)存后再把CPU控制權(quán)交給CE內(nèi)核程序MSDOS+LoadcepcBIOSBootloader和MSDOS+Loadcepc3.4.4U-Boot簡介主要功能特點主要目錄結(jié)構(gòu)調(diào)試方法移植的主要步驟主要命令3.4.4U-Boot簡介簡介德國DENX軟件工程中心的WolfgangDenk全稱UniversalBootloader遵循GPL條款的開放源碼項目從FADSROM、8xxROM、PPCBOOT發(fā)展而來其源碼目錄、編譯形式與Linux內(nèi)核很相似源碼就是相應(yīng)Linux內(nèi)核源程序的簡化,尤其是設(shè)備驅(qū)動程序支持:嵌入式Linux/NetBSD/VxWorks/QNX/LynxOS等PowerPC、MIPS、x86、ARM、XScale等對PowerPC系列處理器/對Linux的支持最完善簡介德國DENX軟件工程中心的WolfgangDenk主要功能主要功能特點①開放源碼;②支持多種嵌入式操作系統(tǒng)內(nèi)核;③支持多個處理器系列;④較高的可靠性和穩(wěn)定性;⑤高度靈活的功能設(shè)置,適合U-Boot調(diào)試、操作系統(tǒng)不同引導(dǎo)要求、產(chǎn)品發(fā)布等;⑥豐富的設(shè)備驅(qū)動源碼;⑦較豐富的開發(fā)調(diào)試文檔與強大的網(wǎng)絡(luò)支持。特點①開放源碼;主要目錄結(jié)構(gòu)Board:目標板相關(guān)文件,主要包含SDRAM、FLASH驅(qū)動;Common:獨立于處理器體系結(jié)構(gòu)的通用代碼,如內(nèi)存大小探測與故障檢測;Cpu:與處理器相關(guān)的文件。如mpc8xx子目錄下含串口、網(wǎng)口、LCD驅(qū)動及中斷初始化等文件;Driver:通用設(shè)備驅(qū)動,如CFIFLASH驅(qū)動(目前對INTELFLASH支持較好)Doc:U-Boot的說明文檔;主要目錄結(jié)構(gòu)Board:目標板相關(guān)文件,主要包含SDRAM、Include:U-Boot頭文件;尤其configs子目錄下與目標板相關(guān)的配置頭文件是移植過程中經(jīng)常要修改的文件;lib_xxx:處理器體系相關(guān)的文件,如lib_ppc,lib_arm目錄分別包含與PowerPC、ARM體系結(jié)構(gòu)相關(guān)的文件;net:與網(wǎng)絡(luò)功能相關(guān)的文件目錄,如bootp,nfs,tftp;Post:上電自檢文件目錄。尚有待于進一步完善;Tools:用于創(chuàng)建U-BootS-RECORD和BIN鏡像文件的工具;Rtc:RTC驅(qū)動程序。Include:U-Boot頭文件;尤其configs子目錄調(diào)試方法大致分為兩種:先用仿真器創(chuàng)建目標板初始運行環(huán)境,將U-Boot鏡像文件U-Boot.bin下載到目標板RAM中的指定位置,然后進行跟蹤調(diào)試好處:不用將Uboot鏡像文件燒寫到Flash中去弊端:對移植開發(fā)人員的移植調(diào)試技能要求較高,調(diào)試器的配置文件較為復(fù)雜用調(diào)試器先將U-Boot鏡像文件燒寫到Flash中去,然后用GDB調(diào)試器調(diào)試所用的調(diào)試器配置文件較為簡單,調(diào)試過程與U-Boot移植后運行過程相吻合U-Boot先從Flash中運行,再重載至RAM中相應(yīng)位置,并從那里正式投入運行需要不斷燒寫Flash調(diào)試方法大致分為兩種:移植的主要步驟以S3C2410為例,說明U-Boot的主要移植步驟:1.修改Makefile文件 whhit2410_config

:

unconfig

@./mkconfig$(@:_config=)armarm920twhhit2410NULLs3c24x0各項的意思如下:arm:CPU的架構(gòu)(ARCH)arm920t:CPU的類型(CPU),其對應(yīng)于cpu/arm920t子目錄。whhit2410:開發(fā)板的型號(BOARD),對應(yīng)于board/whhit2410目錄。NULL:開發(fā)者/或經(jīng)銷商(vender)。s3c24x0:片上系統(tǒng)(SOC)。移植的主要步驟以S3C2410為例,說明U-Boot的主要移2.建立board/whhit2410目錄,拷貝board/smdk2410下的文件到board/whhit2410目錄,將smdk2410.c更名為whhit2410.c3.cpinclude/configs/smdk2410.hinclude/configs/whhit2410.h4.將arm-linux-gcc的目錄加入到PATH環(huán)境變量中5.測試編譯能否成功:

makewhhit2410_config

makeallARCH=arm

生成U-Boot.bin就OK了2.建立board/whhit2410目錄,拷貝board6.依照你自己開發(fā)板的內(nèi)存地址分配情況修改board/whhit2410/memsetup.S文件7.在board/whhit2410加入NANDFlash讀函數(shù),建立nand_read.c。8.修改board/whhit2410/Makefile9.修改cpu/arm920t/start.S文件10.修改include/configs/whhit2410.h文件11.重新編譯U-Boot

makeallARCH=arm12.通過jtag將U-Boot燒寫到flash6.依照你自己開發(fā)板的內(nèi)存地址分配情況修改board/wh主要命令打印環(huán)境變量列表:

printenv設(shè)置tftp服務(wù)器的ip地址

setenvserverip6設(shè)置本機(開發(fā)板)的ip地址

setenvipaddr1保存前面對環(huán)境變量所做的修改

saveenv通過tftp下載內(nèi)核(串口下載命令為loady)

tftp0x30008000uImage nanderase0x800000x200000 nandwrite0x300080000x800000x200000主要命令打印環(huán)境變量列表:

printenv3.4.2RedbootRedhat公司隨eCos發(fā)布的一個開源BOOT支持:ARM,MIPS,MN10300,PowerPC,RenesasSHx,v850,x86使用X-modem或Y-modem協(xié)議經(jīng)由串口下載,也可以經(jīng)由以太網(wǎng)口通過BOOTP/DHCP服務(wù)獲得IP參數(shù),使用TFTP方式下載程序映像文件,常用于調(diào)試支持和系統(tǒng)初始化Redboot可以通過串口和以太網(wǎng)口與GDB進行通信,調(diào)試程序,能中斷被GDB運行的應(yīng)用程序Redboot提供了一個交互式命令行接口,用來從TFTP服務(wù)器或者從Flash下載映像文件、加載系統(tǒng)的引導(dǎo)腳本文件,它保存在Flash上3.4.2RedbootRedhat公司隨eCos發(fā)布的3.4.3vivivivi是由韓國mizi公司設(shè)計為ARM處理器系列設(shè)計的一個bootloader,支持使用串口和主機通信。vivi與其它Bootloader相比,增加了對分區(qū)的命令支持vivi程序流程編譯vivivivi的使用3.4.3vivivivi是由韓國mizi公司設(shè)計為A系統(tǒng)復(fù)位禁止看門狗關(guān)閉中斷初始化系統(tǒng)時鐘跳到stage2入口執(zhí)行輸出vivi版本號開發(fā)板初始化內(nèi)存映射并拷貝vivi代碼到SDRAM中初始化堆棧初始化MTD設(shè)備初始化私有數(shù)據(jù)初始化內(nèi)置命令啟動vivi-boot_or_vivi系統(tǒng)復(fù)位禁止看門狗關(guān)閉中斷初始化系統(tǒng)時鐘跳到stage2入口編譯vivi首先,進入vivi源代碼目錄:#cd/vivi然后配置和編譯它,執(zhí)行:#makemenuconfig,實際上,你不需要自己手工選擇配置它,已經(jīng)配置好了,只需裝載一個缺省的配置文件即可,使用這個配置文件生成的vivi正好適合于目標板,這個配置文件在vivi/arch/def-configs目錄中,該目錄包含了一些適合于各種板的配置文件。裝載“arch/def-configs/smdk2410”后保存該設(shè)置,并執(zhí)行#make命令編譯vivi#cd/vivi#makemenuconfig將出現(xiàn)下面窗口:編譯vivi首先,進入vivi源代碼目錄:#cd/viv在跳出的窗口中選擇“LoadonAlternateConfigurationFile”菜單,然后輸入“arch/def-configs/smdk2410”。在跳出的窗口中選擇“LoadonAlternateC再選擇“OK”,前一個界面又會出現(xiàn)一次,這時選擇退出,然后選擇“Yes”保存剛才的配置。再選擇“OK”,前一個界面又會出現(xiàn)一次,這時選擇退出,然后選保存完畢,執(zhí)行以下命令:#make如果編譯過程順利,將會在當前目錄下生成vivi二進制映象文件保存完畢,執(zhí)行以下命令:vivi的使用Vivi的使用可以查看mizi公司的vivi使用手冊,下面會介紹其中幾個經(jīng)常使用的命令使用JTAG接口下載vivivivi的load命令參數(shù)設(shè)定命令vivi的使用

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論