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

下載本文檔

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

文檔簡(jiǎn)介

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

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

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

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

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

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

通常包括stage2

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

的代碼通常用C語(yǔ)言來(lái)實(shí)現(xiàn)(stage1的代碼通trampoline(彈簧床)編程方式:用匯編語(yǔ)言寫(xiě)一段trampoline小程序,并將這段trampoline小程序來(lái)作為stage2可執(zhí)行映象的執(zhí)行入口點(diǎn)在trampoline匯編小程序中用CPU跳轉(zhuǎn)指令跳入main()函數(shù)中去執(zhí)行當(dāng)main()函數(shù)返回時(shí),CPU執(zhí)行路徑顯然再次回到trampoline程序。用trampoline小程序來(lái)作為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)試手段:打印信息到串口終端串口終端顯示亂碼或根本沒(méi)有顯示(1)Bootloader對(duì)串口的初始化設(shè)置不正確。(2)運(yùn)行在host端的終端仿真程序?qū)Υ诘脑O(shè)置不正確,這包括:波特率、奇偶校驗(yàn)、數(shù)據(jù)位和停止位等方面的設(shè)置串口終端調(diào)試手段:打印信息到串口終端基本的硬件初始化

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

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

LED為加載stage2準(zhǔn)備RAM空間

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

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

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

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

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

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

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

:

unconfig

@./mkconfig$(@:_config=)armarm920twhhit2410NULLs3c24x0各項(xiàng)的意思如下:arm:CPU的架構(gòu)(ARCH)arm920t:CPU的類(lèi)型(CPU),其對(duì)應(yīng)于cpu/arm920t子目錄。whhit2410:開(kāi)發(fā)板的型號(hào)(BOARD),對(duì)應(yīng)于board/whhit2410目錄。NULL:開(kāi)發(fā)者/或經(jīng)銷(xiāo)商(vender)。s3c24x0:片上系統(tǒng)(SOC)。移植的主要步驟以S3C2410為例,說(shuō)明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.測(cè)試編譯能否成功:

makewhhit2410_config

makeallARCH=arm

生成U-Boot.bin就OK了2.建立board/whhit2410目錄,拷貝board6.依照你自己開(kāi)發(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.通過(guò)jtag將U-Boot燒寫(xiě)到flash6.依照你自己開(kāi)發(fā)板的內(nèi)存地址分配情況修改board/wh主要命令打印環(huán)境變量列表:

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

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

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

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

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

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

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

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

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

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

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

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

通常包括stage2

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

的代碼通常用C語(yǔ)言來(lái)實(shí)現(xiàn)(stage1的代碼通trampoline(彈簧床)編程方式:用匯編語(yǔ)言寫(xiě)一段trampoline小程序,并將這段trampoline小程序來(lái)作為stage2可執(zhí)行映象的執(zhí)行入口點(diǎn)在trampoline匯編小程序中用CPU跳轉(zhuǎn)指令跳入main()函數(shù)中去執(zhí)行當(dāng)main()函數(shù)返回時(shí),CPU執(zhí)行路徑顯然再次回到trampoline程序。用trampoline小程序來(lái)作為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)試手段:打印信息到串口終端串口終端顯示亂碼或根本沒(méi)有顯示(1)Bootloader對(duì)串口的初始化設(shè)置不正確。(2)運(yùn)行在host端的終端仿真程序?qū)Υ诘脑O(shè)置不正確,這包括:波特率、奇偶校驗(yàn)、數(shù)據(jù)位和停止位等方面的設(shè)置串口終端調(diào)試手段:打印信息到串口終端基本的硬件初始化

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

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

LED為加載stage2準(zhǔn)備RAM空間

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

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

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

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

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

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

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

:

unconfig

@./mkconfig$(@:_config=)armarm920twhhit2410NULLs3c24x0各項(xiàng)的意思如下:arm:CPU的架構(gòu)(ARCH)arm920t:CPU的類(lèi)型(CPU),其對(duì)應(yīng)于cpu/arm920t子目錄。whhit2410:開(kāi)發(fā)板的型號(hào)(BOARD),對(duì)應(yīng)于board/whhit2410目錄。NULL:開(kāi)發(fā)者/或經(jīng)銷(xiāo)商(vender)。s3c24x0:片上系統(tǒng)(SOC)。移植的主要步驟以S3C2410為例,說(shuō)明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.測(cè)試編譯能否成功:

makewhhit2410_config

makeallARCH=arm

生成U-Boot.bin就OK了2.建立board/whhit2410目錄,拷貝board6.依照你自己開(kāi)發(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.通過(guò)jtag將U-Boot燒寫(xiě)到flash6.依照你自己開(kāi)發(fā)板的內(nèi)存地址分配情況修改board/wh主要命令打印環(huán)境變量列表:

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

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

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

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

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

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

溫馨提示

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

評(píng)論

0/150

提交評(píng)論