在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于ARM-Linux嵌入式系統(tǒng)引導(dǎo)程序的設(shè)計(jì)

            基于ARM-Linux嵌入式系統(tǒng)引導(dǎo)程序的設(shè)計(jì)

            作者: 時(shí)間:2012-11-01 來(lái)源:網(wǎng)絡(luò) 收藏

              (a)建立中斷向量表,當(dāng)程序出現(xiàn)異常后可跳轉(zhuǎn)到相應(yīng)子程序執(zhí)行。如
            bResetAddr;
            bUndefAddr;handlerforUndefinedmode0x4
            bSWI_Addr;handlerforSWIinterrupt0x8
            bPreAbortAddr;handlerforPreAbort0xC
            bDataAbortAddr;handlerforDataAbort0x10
            b.;reserved0x14
            bIRQ_Addr;handlerforIRQinterrupt0x18
            bFIQ_Addr;handlerforFIQinterrupt0x1C
              (b)屏蔽所有的中斷。為中斷提供服務(wù)通常是操作系統(tǒng)設(shè)備驅(qū)動(dòng)程序的責(zé)任,因此在的執(zhí)行全過(guò)程中可以不必響應(yīng)任何中斷??梢酝ㄟ^(guò)寫的寄存器INTMSK、INTSUBMSK來(lái)完成;
              (c)設(shè)置CPU的速度和時(shí)鐘頻率。可以通過(guò)寫寄存器LOCKTIME、MPLLCON、UPLLCON來(lái)實(shí)現(xiàn);
              (d)RAM初始化。包括正確地設(shè)置系統(tǒng)的內(nèi)存控制器的功能寄存器BWSCON以及各內(nèi)存控制寄存器等。
              (e)初始化LED。典型地,通過(guò)GPIO來(lái)驅(qū)動(dòng)LED,其目的是表明系統(tǒng)的狀態(tài)是正常還是出現(xiàn)錯(cuò)誤。

            3.1.2為加載Stage2準(zhǔn)備RAM空間,拷貝Stage2到RAM中。
              為了獲得更快的執(zhí)行速度,通常把Stage2加載到RAM空間中來(lái)執(zhí)行,因此必須為加載的Stage2準(zhǔn)備好一段可用的RAM空間范圍。具體的地址范圍可以任意安排,比如我們習(xí)慣將Stage2可執(zhí)行映像安排到RAM地址最頂部1MB開始的空間內(nèi)執(zhí)行??截悤r(shí)要確定兩點(diǎn):Stage2的可執(zhí)行映像存放在Flash中的起始地址和終止地址;以及RAM空間的起始地址。

            3.1.3設(shè)置堆棧指針sp。
              堆棧指針的設(shè)置是為了執(zhí)行C語(yǔ)言代碼作好準(zhǔn)備,通常我們可以把sp(Userstack)設(shè)置在上面所安排的那個(gè)1MBRAM空間的最頂端(堆棧向下生長(zhǎng))。此外,在設(shè)置堆棧指針sp之前,也可以關(guān)閉LED燈,以提示我們準(zhǔn)備跳轉(zhuǎn)到Stage2。

            3.1.4跳轉(zhuǎn)到Stage2的C入口點(diǎn)。
              在上述一切都就緒后,就可以跳轉(zhuǎn)到的Stage2去執(zhí)行了。比如通過(guò)修改PC寄存器為合適的地址來(lái)實(shí)現(xiàn)。

            3.2Bootloader的Stage2通常依次執(zhí)行以下主要步驟:

            3.2.1進(jìn)入Stage2的入口程序
              Stage2的代碼通常用C語(yǔ)言來(lái)實(shí)現(xiàn),但是與普通C語(yǔ)言應(yīng)用程序不同的是,在編譯和鏈接bootloader這樣的程序時(shí),我們無(wú)法使用glibc庫(kù)中的任何支持函數(shù)。這就需要我們利用匯編語(yǔ)言寫一段trampoline(彈簧床)小程序,并將這段trampoline小程序來(lái)作為Stage2可執(zhí)行映象的執(zhí)行入口點(diǎn)。然后我們可以在trampoline小程序中用CPU跳轉(zhuǎn)指令跳入main()函數(shù)中去執(zhí)行;而當(dāng)main()函數(shù)返回時(shí),CPU執(zhí)行路徑顯然再次回到了trampoline程序。具體程序如下:
            .text
            .globl_trampoline
            _trampoline:
            blmain
            b_trampoline

            3.2.2初始化本階段要使用到的硬件設(shè)備
              這通常包括:初始化至少一個(gè)串口,以便和終端用戶進(jìn)行I/O輸出信息;初始化計(jì)時(shí)器等。在初始化這些設(shè)備之前,也可以重新把LED燈點(diǎn)亮,以表明我們已經(jīng)進(jìn)入main()函數(shù)執(zhí)行。設(shè)備初始化完成后,可以輸出一些打印信息,程序名字字符串、版本號(hào)等。

            3.2.3檢測(cè)系統(tǒng)的內(nèi)存映射(Memorymap)
              所謂內(nèi)存映射就是指在整個(gè)4GB物理地址空間中有哪些地址范圍被分配用來(lái)尋址系統(tǒng)的RAM單元。CPU通常預(yù)留出一段足夠大的地址空間給系統(tǒng)RAM,但是在搭建具體的嵌入式系統(tǒng)時(shí)不一定會(huì)實(shí)現(xiàn)CPU預(yù)留的全部RAM地址空間。而是往往只把CPU預(yù)留的全部RAM地址空間中的一部分映射到RAM單元上,而讓剩下的那部分預(yù)留RAM地址空間處于未使用狀態(tài)。如使用的RAM空間僅為0x30000000-0x33ffffff。

            3.2.4加載內(nèi)核映像和根文件系統(tǒng)映像并從Flash上拷貝
              規(guī)劃內(nèi)存占用的布局。這里包括兩個(gè)方面:(1)內(nèi)核映像所占用的內(nèi)存范圍;(2)根文件系統(tǒng)所占用的內(nèi)存范圍。對(duì)于內(nèi)核映像,一般將其拷貝到從(MEM_START+0x8000)這個(gè)基地址開始的大約1MB大小的內(nèi)存范圍內(nèi)(嵌入式Linux的內(nèi)核一般都不超過(guò)1MB)。從MEM_START到MEM_START+0x8000這段32KB大小的內(nèi)存之所以被空出,是因?yàn)長(zhǎng)inux內(nèi)核要在這段內(nèi)存中放置一些全局?jǐn)?shù)據(jù)結(jié)構(gòu),如:?jiǎn)?dòng)參數(shù)和內(nèi)核頁(yè)表等信息。而對(duì)于根文件系統(tǒng)映像,則一般將其拷貝到MEM_START+0x0010,0000開始的地方。若采用Ramdisk作為根文件系統(tǒng)映像,則其解壓后的大小一般為1MB。
            由于像ARM這樣的嵌入式CPU通常都是在統(tǒng)一的內(nèi)存地址空間中尋址Flash等固態(tài)存儲(chǔ)設(shè)備,因此從Flash上讀取數(shù)據(jù)與從RAM單元中讀取數(shù)據(jù)并沒(méi)有什么不同。用一個(gè)簡(jiǎn)單的循環(huán)就可以完成從Flash設(shè)備上拷貝映像的工作。如:
            count=kernelsize
            while(count>0){
            *dest++=*src++;/*theyareallalignedwithwordboundary*/
            count-=4;/*bytenumber*/
            };

            3.2.5設(shè)置內(nèi)核的啟動(dòng)參數(shù)
              將內(nèi)核映像和根文件系統(tǒng)映像拷貝到RAM空間后,設(shè)置Linux內(nèi)核的啟動(dòng)參數(shù),如ATAG_CORE、ATAG_MEM、ATAG_CMDLINE、ATAG_RAMDISK、ATAG_INITRD等,然后就可以準(zhǔn)備啟動(dòng)Linux內(nèi)核了。

            3.2.6調(diào)用內(nèi)核。
              Bootloader調(diào)用Linux內(nèi)核的方法是直接跳轉(zhuǎn)到內(nèi)核的第一條指令處,也即直接跳轉(zhuǎn)到MEM_START+0x8000地址處。此時(shí),還需要設(shè)置CPU寄存器、CPU模式、Cache和MMU。


            3.結(jié)束語(yǔ)
              Bootloader是依賴于硬件而實(shí)現(xiàn)的,每個(gè)目標(biāo)板的硬件配置都不完全一樣,因此Bootloader程序也都不會(huì)完全一樣。本文以Samsung公司的的開發(fā)板為平臺(tái),闡述了Bootloader運(yùn)行的主要步驟和關(guān)鍵技術(shù),為實(shí)現(xiàn)引導(dǎo)Linux操作系統(tǒng)內(nèi)核運(yùn)行提供合適的環(huán)境。文章后面關(guān)于Linux內(nèi)核啟動(dòng)參數(shù)的具體設(shè)置及如何調(diào)用內(nèi)核是和具體操作系統(tǒng)密切關(guān)系的,未做詳細(xì)論述。此外,設(shè)計(jì)與實(shí)現(xiàn)一個(gè)優(yōu)秀的Bootloader程序是一個(gè)龐大復(fù)雜的過(guò)程,在程序中如能多利用LED和串口輸出信息會(huì)是幫助我們調(diào)試的好方法。

            參考文獻(xiàn):

            [1].ARM920Tdatasheethttp://www.dzsc.com/datasheet/ARM920T_139814.html.
            [2].ROMdatasheethttp://www.dzsc.com/datasheet/ROM_1188413.html.


            上一頁(yè) 1 2 下一頁(yè)

            評(píng)論


            相關(guān)推薦

            技術(shù)專區(qū)

            關(guān)閉