arm9教程光盤原理圖嵌入式學(xué)習(xí)bootloader技術(shù)_第1頁
arm9教程光盤原理圖嵌入式學(xué)習(xí)bootloader技術(shù)_第2頁
arm9教程光盤原理圖嵌入式學(xué)習(xí)bootloader技術(shù)_第3頁
arm9教程光盤原理圖嵌入式學(xué)習(xí)bootloader技術(shù)_第4頁
arm9教程光盤原理圖嵌入式學(xué)習(xí)bootloader技術(shù)_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

嵌入式系統(tǒng)BootLoader技術(shù)引 BootLoader的概 BootLoader的主要任務(wù)與典型結(jié)構(gòu)框 BootLoader的 為加載stage2準(zhǔn)備RAM空 拷貝stage2到RAM 設(shè)置堆棧指針 跳轉(zhuǎn)到stage2的C BootLoader的 調(diào)用內(nèi) 結(jié)束 BootLoader技術(shù)OSBootLoader引引導(dǎo)加載程序。包括在固件(firmware)中的boot代碼(可選),和BootLoader兩Flashramdisk來作為rootfs。GUIMicroWindowsMiniGUI引導(dǎo)加載程序是系統(tǒng)加電后運(yùn)行的第一段軟件代碼。回憶一下PC的體系結(jié)構(gòu)我們可以知道,PCBIOSMBROSBootLoader(比如,LILOGRUB)一起組成。BIOSMBRBootLoaderRAMOSBootLoader。BootLoaderRAM而在嵌入式系統(tǒng)中,通常并沒有像BIOS那樣的固件程序(注,有的嵌入式CPU也會(huì)內(nèi)嵌一段短小的啟動(dòng)程序,因此整個(gè)系統(tǒng)的加載啟動(dòng)任務(wù)就完全由BootLoader來完成。比如在一個(gè)基于ARM7TDMIcore的嵌入式系統(tǒng)中,系統(tǒng)在上電或復(fù)位時(shí)通常都從地址 處開始執(zhí)行,而在這個(gè)地址處安排的通常就是系統(tǒng)的BootLoader程序。BootLoaderBootLoaderBootLoader以及BootLoader的安裝等四個(gè)方面來討論嵌入式系統(tǒng)的BootLoader。BootLoader入式世界里建立一個(gè)通用的BootLoader幾乎是不可能的。盡管如此,我們?nèi)匀豢梢詫?duì)BootLoader歸納出一些通用的概念來,以指導(dǎo)用戶特定的BootLoader設(shè)計(jì)與實(shí)現(xiàn)。BootLoaderCPUCPUBootLoaderBootLoaderCPUU-BootARMMIPSCPUCPUBootLoaderBootLoaderBootLoader(Installation系統(tǒng)加電或復(fù)位后,所有的CPU通常都從某個(gè)由CPU制造商預(yù)先安排的地址上取指ARM7TDMIcoreCPU0x取它的第一條FLASH等)被映射到這個(gè)預(yù)先安排的地址上。因此在系統(tǒng)加電后,CPUBootLoader程序。下圖1就是一個(gè)同時(shí)裝有BootLoader、內(nèi)核的啟動(dòng)參數(shù)、內(nèi)核映像和根文件系統(tǒng)映像的BootLoader來進(jìn)行I/O,比如:輸出打印信息到串口,從串口用戶控制字符等。BootLoader1stage2stage1stage2BootLoaderOperation大多數(shù)BootLoader都包含兩種不同的操作模式:"啟動(dòng)加載"模式和""模式,這(Bootloading)模式這種模式也稱為"自主"(Autonomous)模式。也即BootLoader從目標(biāo)機(jī)上的某個(gè)固態(tài)設(shè)備上將操作系統(tǒng)加載到RAM中運(yùn)行,整個(gè)過程并沒有用戶的介入。這種模式是BootLoader的正常工作模式,因此在嵌入式產(chǎn)品發(fā)布的時(shí)侯,BootLoader顯然必須工作在這種模式下。(Downloading)模式:在這種模式下,目標(biāo)機(jī)上的BootLoader將通過串口連等。從主機(jī)的文件通常首先被BootLoader保存到目標(biāo)機(jī)的RAM中,然后再被BootLoaderFLASH類固態(tài)設(shè)備中。BootLoader安裝內(nèi)核與根文件系統(tǒng)時(shí)被使用;此外,以后的系統(tǒng)更新也會(huì)使用BootLoader作模式。工作于這種模式下的BootLoader通常都會(huì)向它的終端用戶提供一個(gè)簡(jiǎn)單令像BlobU-BootBootLoader而且允許用戶在這兩種工作模式之間進(jìn)行切換。比如,Blob秒內(nèi)沒有用戶按鍵,則blob繼續(xù)啟動(dòng)Linux內(nèi)核。BootLoader與主機(jī)之間進(jìn)行文件傳輸所用的通信設(shè)備及協(xié)議BootLoader因此通過以太網(wǎng)連接并借助TFTP協(xié)議來文件是個(gè)更好的選擇。來文件時(shí),主機(jī)方必須有一個(gè)軟件用來的提供TFTP服務(wù)。BootLoader像都被加載到RAM中運(yùn)行。之所以提出這樣一個(gè)假設(shè)前提是因?yàn)?,在嵌入式系統(tǒng)中內(nèi)核映像與根文件系統(tǒng)映像也可以直接在ROM或Flash這樣的固態(tài)設(shè)備中直接運(yùn)行。但這種BootLoaderCPUBootLoaderstage1stage2兩大部分。依賴于CPU體系結(jié)構(gòu)的代碼,比如設(shè)備初始化代碼等,通常都放在stage1stage2則通常用BootLoaderstage1BootLoaderstage2RAMBootLoaderstage2RAM跳轉(zhuǎn)到stage2的C點(diǎn)BootLoaderstage2檢測(cè)系統(tǒng)內(nèi)存映射(memorymapkernelflashRAMBootLoader基本的硬件初始化這是BootLoader一開始就執(zhí)行的操作,其目的是為stage2所有的中斷。為中斷提供服務(wù)通常是OS設(shè)備驅(qū)動(dòng)程序的責(zé)任,因此在Boot或狀態(tài)寄存器(比如ARM的CPSR寄存器)來完成。CPURAM初始化。包括正確地設(shè)置系統(tǒng)的內(nèi)存控制器的功能寄存器以及各內(nèi)存庫控制寄初始化LED。典型地,通過GPIO來驅(qū)動(dòng)LED,其目的是表明系統(tǒng)的狀態(tài)是OK還ErrorLEDUARTBootLoaderLogo字符信息來完成這一點(diǎn)。CPUcachestage2準(zhǔn)備RAM空stage2RAM載BootLoader的stage2準(zhǔn)備好一段可用的RAM空間范圍。由于stage2通常是C語言執(zhí)行代碼,因此在考慮空間大小時(shí),除了stage2可執(zhí)行是4KB)的倍數(shù)。一般而言,1M的RAM空間已經(jīng)足夠了。具體的地址范圍可以任意安排,比如blob就將它的stage2可執(zhí)行映像安排到從系統(tǒng)RAM起始地址0xc 開始的1M空間內(nèi)執(zhí)行。但是,將stage2安排到整個(gè)RAM空間的最頂1MB(也即(RamEnd-1MB)-把起始地址和終止地址分別記為:stage2_startstage2_end4另外,還必須確保所安排的地址范圍的的確確是可讀寫的RAM空間,因此,必須對(duì)你所安排的地址范圍進(jìn)試。具體的測(cè)試方法可以采用類似于blob的方法,也即:以memorypagememorypage開始的兩個(gè)字是否是可讀寫的。為了1memorypage3、然后,立即將這兩個(gè)字的內(nèi)容讀回。顯然,我們讀到的內(nèi)容應(yīng)該分別是0x55和和拷貝stage2RAM地址;(2)RAM空間的起始地址。堆棧指針的設(shè)置是為了執(zhí)行C語言代碼作好準(zhǔn)備。通常我們可以把sp的值設(shè)置為(stage2_end-4),也即在3.1.2節(jié)所安排的那個(gè)1MB的RAM空間的最頂端(堆棧向下生此外,在設(shè)置堆棧指針sp之前,也可以關(guān)閉led跳轉(zhuǎn)到stage2的CPC2bootloaderstage2RAMBootLoader正如前面所說,stage2C更好的代碼可讀性和可移植性。但是與普通C語言應(yīng)用程序不同的是,在編譯和bootloaderglibcmain()main()1)無法通過main()2)main()trampoline(彈簧床)的概念。也即,用匯編語言寫一段trampoline序,并將這段trampoline小程序來作為stage2可執(zhí)行映象的執(zhí)行點(diǎn)。然后我們可以在trampoline匯編小程序中用CPU跳轉(zhuǎn)指令跳入main()函數(shù)中去執(zhí)行;而當(dāng)main()思想就是:用這段trampoline小程序來作為main()函數(shù)的外部包裹(externaltrampoline程序示例(來自.text.globl_trampoline_trampoline:main/*ifmaineverreturnswejustcallitagain*/b_trampoline當(dāng)然也就重新執(zhí)行main()函數(shù),這也就是trampoline(彈簧床)一詞的意思所在。初始化本階段要使用到的硬件設(shè)備LEDmain()檢測(cè)系統(tǒng)的內(nèi)存映射 4GB的RAMSA-1100CPU0xC000,0000512M地址空間被用作RAMSamsungS3C44B0XCPU0x0c00,00000x1000,000064MRAMCPURAM,但是在搭建具體的嵌入式系統(tǒng)時(shí)卻不一定會(huì)實(shí)現(xiàn)CPURAMCPURAM分映射到RAM單元上,而讓剩下的那部分預(yù)留RAM地址空間處于未使用狀態(tài)。由于上述這個(gè)事實(shí),因此BootLoaderstage2知道CPU預(yù)留的全部RAM地址空間中的哪些被真正映射到RAM地址單元,哪些是處于"unused"狀態(tài)的。內(nèi)存映射的描述typedefstructmemory_area_structu32start;/*thebaseaddressofthememoryregion*/u32size;/*thebytenumberofthememoryregion*/intused;}memory_area_t;}基于上述memory_area_t數(shù)據(jù)結(jié)構(gòu),整個(gè)CPU預(yù)留的RAM地址空間可以用一個(gè)memory_area_tmemory_area_tmemory_map[NUM_MEM_AREAS]{[0...(NUM_MEM_AREAS-1)]=.start=.size=.used=/*for(i=0;i<NUM_MEM_AREAS;memory_map.used=0;/*firstwritea0toallmemorylocations*/for(addr=MEM_START;addr<MEM_END;addr+=PAGE_SIZE)*(u32*)addr=for(i=0,addr=MEM_START;addr<MEM_END;addr+=PAGE_SIZE)檢測(cè)從址iif(currentmemorypageisnotavalidrampage){/*noRAMhere*/iif(memory_map.used) }iif(*(u32*)addr!=0){/*alias?/*4GB*/iif(memory_map.used) }iif(memory_map.used==0)memory_map.start=addr;memory_map.size=PAGE_SIZE;memory_map.used=1;}elsememory_map.size+=}}/*endoffor(…)加載內(nèi)核映像和根文件系統(tǒng)映像(1)這里包括兩個(gè)方面:(1)內(nèi)核映像所占用的內(nèi)存范圍;(2)根文件系統(tǒng)所占用的內(nèi)存范對(duì)于內(nèi)核映像,一般將其拷貝到從(MEM_START+0x8000)這個(gè)址開始的大約1MBLinux1MB)MEM_STARTMEM_START+0x800032KBLinux內(nèi)核要在這段內(nèi)存MEM_START+0x0010,0000果用Ramdisk作為根文件系統(tǒng)映像,則其解壓后的大小一般是1MB。(2)FlashARMCPUFlash等固態(tài)設(shè)備的,因此從Flash上數(shù)據(jù)與從RAM單元中數(shù)據(jù)并沒有什么不同。用一Flashwhile(count)*dest++=*src++;/*theyareallalignedwithwordboundary*/count-=4;/*bytenumber*/設(shè)置內(nèi)核的啟動(dòng)參數(shù)核了。但是在調(diào)用內(nèi)核之前,應(yīng)該作一步準(zhǔn)備工作,即:設(shè)置Linux內(nèi)核的啟動(dòng)參數(shù)。Linux2.4.x(taggedlist)的形式來傳遞啟動(dòng)參數(shù)。啟動(dòng)參ATAG_COREATAG_NONEtag_headertagtag_header義在Linux內(nèi)核源碼的include/asm/setup.h頭文件中:/*ThelistendswithanATAG_NONEnode.#defineATAG_NONE structtag_header{u32tag;structtagstructtag_headerhdr;union{structtag_corecore;structtag_mem32structtag_texttext;structtag_ramdiskramdisk;structtag_initrdinitrd;structtag_serialnrserialnr;structtag_revisionrevision;structtag_lfblfb;structtag_cmdlinecmdline;*Acornstructtag_acorn*DC21285structtag_memclk}在嵌入式Linux系統(tǒng)中,通常需要由BootLoader設(shè)置的常見啟動(dòng)參數(shù)有:等。比如,設(shè)置ATAG_CORE的代碼如下:params(structtag*)BOOT_PARAMS;params->hdr.tag=ATAG_CORE;params->hdr.size=tag_size(tag_core);params->u.core.flags=0;params->u.core.pagesize=params->u.core.rootdev=0;params=tag_next(params);一個(gè)標(biāo)記的起始地址。注意,內(nèi)核的根文件系統(tǒng)所在的設(shè)備ID就是在這里設(shè)置的。for(i=0;i<NUM_MEM_AREAS;i++)iif(memory_map.used)params->hdr.tag=params->hdr.size=tag_size(tag_mem32);params->u.mem.start=memory_map.start;params->u.mem.size=memory_map.size;params=tag_next(params);memory_map[]ATAG_MEM比如,我們用這樣一個(gè)命令行參數(shù)字符串"console=ttyS0,115200n8"來通知內(nèi)核以ttyS0char*p; /*eatleadingwhitespace*/for(p=commandline;*p=='';p++);/*skipnon-existentcommandlinessothekernelwill*useitsdefaultcommandiif(*p=='\0')params->hdr.tag=params->hdr.size=(sizeof(structtag_header)+strlen(p)+1+4)>>2;strcpy(params->u.cmdline.cmdline,p);params=下面是設(shè)置ATAG_INITRD的示例代碼,它告訴內(nèi)核在RAMinitrdparams->hdr.tag=params->hdr.size=tag_size(tag_initrd);params->u.initrd.start=RAMDISK_RAM_BASE;params->u.initrd.size=INITRD_LEN;params=tag_next(params);ATAG_RAMDISKRamdisk(KBparams->hdr.tag=params->hdr.size=tag_size(tag_ramdisk);params->u.ramdisk.start=0;params-

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論