久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

ARM9啟動(dòng)程序分析

 歲月樓 2011-11-23

ARM9啟動(dòng)程序分析  

2010-10-07 13:45:48|  分類(lèi): 嵌入式 |  標(biāo)簽: |字號(hào) 訂閱

本文以S3C2410X 的實(shí)際應(yīng)用為例介紹了ARM9處理器的初始化過(guò)程,重點(diǎn)分析了ARM9芯片的中斷處理機(jī)制和MMU機(jī)制,,其原理和方法同樣適用于ARM720T,、ARM9、ARM10E,、ARM11、Xscale 系列等處理器,。

        ARM處理器的軟件系統(tǒng)一般包括啟動(dòng)程序,、操作系統(tǒng)、驅(qū)動(dòng)程序及應(yīng)用程序,,其中啟動(dòng)程序最先執(zhí)行,,完成一些必要的系統(tǒng)級(jí)的初始化操作,因此寫(xiě)好啟動(dòng)程序是順利完成系統(tǒng)開(kāi)發(fā)的前提,,也是調(diào)試和開(kāi)發(fā)ARM處理器的關(guān)鍵,。本文針對(duì)ARM處理器的特點(diǎn),以含MMU功能的ARM芯片為例對(duì)啟動(dòng)程序的特點(diǎn)及實(shí)現(xiàn)方法進(jìn)行了解釋?zhuān)⒃赟3C2410X芯片上進(jìn)行了具體實(shí)現(xiàn),。

1.基本原理

1.1 異常中斷處理機(jī)制

         ARM 處理器對(duì)異常中斷的響應(yīng)過(guò)程如下:①將CPSR寄存器內(nèi)容保存到SPSR 寄存器,,保存當(dāng)前狀態(tài) ②設(shè)置當(dāng)前程序狀態(tài)寄存器CPSR中的相應(yīng)位 ③寄存器lr_mode設(shè)置成返回地址 ④將程序計(jì)數(shù)器PC值設(shè)置成該異常中斷向量地址。

         ARM 體系的異常中斷如下表所示,,內(nèi)核在接受到中斷請(qǐng)求后,,總是跳轉(zhuǎn)到表中的固定地址。

ARM9處理器S3C2410X啟動(dòng)程序分析 - 老K - 老K的博客

        從表中可以看出,,地址0x20之前,,都為CPU硬件異常處理向量所使用,,每個(gè)中斷對(duì)應(yīng)4bytes 空間,一般0X0處為ROM時(shí),,用來(lái)存放一條數(shù)據(jù)讀取指令直接向程序計(jì)數(shù)器賦值,,或者存放一條跳轉(zhuǎn)指令跳到異常中斷處理程序。而實(shí)際中為了程序的易讀性和可移植性,,通常按圖一的中斷流程處理,。

ARM9處理器S3C2410X啟動(dòng)程序分析 - 老K - 老K的博客

        異常中斷發(fā)生后,系統(tǒng)首先跳轉(zhuǎn)到相應(yīng)的異常中斷向量地址,,該地址存放了一條跳轉(zhuǎn)指令,,系統(tǒng)跳到相應(yīng)的中斷函數(shù)地址解析程序,在解析程序中讀取中斷向量表,,得到目標(biāo)地址,,跳轉(zhuǎn)到該目標(biāo)地址,執(zhí)行中斷服務(wù)函數(shù),。一般中斷服務(wù)處理分兩級(jí)結(jié)構(gòu),,第一級(jí)中斷處理程序讀取中斷源,然后調(diào)用第二級(jí)中斷處理程序,,第二級(jí)中斷處理程序?qū)崿F(xiàn)功能調(diào)用,。由于使用了中斷向量表,用戶(hù)在開(kāi)發(fā)時(shí)就完全避免了中斷跳轉(zhuǎn)地址的計(jì)算,,可以方便的指定不同的函數(shù)為該中斷服務(wù),,只需把中斷處理程序的起始地址填入中斷向量表中的對(duì)應(yīng)地址即可。異常中斷處理程序返回時(shí)首先恢復(fù)被中斷程序的處理器狀態(tài),,然后返回到發(fā)生中斷指令的下一條指令開(kāi)始執(zhí)行,。復(fù)位異常中斷處理程序不需要返回。

1.2 存儲(chǔ)器管理單元(MMU)

        基于ARM7TDMI內(nèi)核的處理器可以通過(guò)對(duì)存儲(chǔ)器控制模塊的配置寄存器編程來(lái)初始化存儲(chǔ)器系統(tǒng),,基于ARM720T,、ARM9、ARM10E,、ARM11等內(nèi)核的處理器集成有存儲(chǔ)器管理單元管理內(nèi)存空間,,支持基于段和頁(yè)的地址變換,在不需要復(fù)雜的文件系統(tǒng)時(shí),,只需用基于段的一級(jí)地址變換過(guò)程,。

        通過(guò)寫(xiě)系統(tǒng)控制協(xié)處理器的寄存器1的第0位可以允許和禁止MMU。復(fù)位后這位為0,MMU被禁止,。允許MMU之前必須在內(nèi)存中建立適當(dāng)?shù)霓D(zhuǎn)換表,,且所有相關(guān)的CP15寄存器要正確初始化。建立轉(zhuǎn)換表之前存儲(chǔ)器訪(fǎng)問(wèn)將按如下處理:

        1)由具體的芯片設(shè)計(jì)確定 MMU 禁止時(shí)是否能夠允許高速緩存和寫(xiě)緩存。

        2)沒(méi)有存儲(chǔ)器訪(fǎng)問(wèn)權(quán)限的檢查,,MMU 也不產(chǎn)生異常信號(hào),。

        3)物理地址與虛擬地址相同,即使用平坦地址映射模式,。

        禁止和允許MMU改變了虛擬地址到物理地址的映射,,故允許MMU時(shí)所有的高速緩存要被刷新,另外允許MMU的指令的物理地址和虛擬地址不同,,取指令將變得復(fù)雜化,,所以,建議允許MMU的指令具有相同的物理地址和虛擬地址,。MMU支持段和頁(yè)的存儲(chǔ)器訪(fǎng)問(wèn),,段構(gòu)成1MB的存儲(chǔ)器塊,支持允許只用一個(gè) TLB 入口去映射大的存儲(chǔ)器區(qū)間,。轉(zhuǎn)換表分一級(jí)頁(yè)表和二級(jí)頁(yè)表,。一級(jí)頁(yè)表存儲(chǔ)段轉(zhuǎn)換表和指向二級(jí)頁(yè)表的指針,二級(jí)頁(yè)表存儲(chǔ)大頁(yè)和小頁(yè)的轉(zhuǎn)換表,。

ARM9處理器S3C2410X啟動(dòng)程序分析 - 老K - 老K的博客

 

        以段為單位的地址變換過(guò)程只需要一級(jí)頁(yè)表,,而以頁(yè)為單位的地址變換過(guò)程還需要二級(jí)頁(yè)表。當(dāng)片上的TLB中不包括要求的虛擬地址入口時(shí),,轉(zhuǎn)換過(guò)程被啟動(dòng),。轉(zhuǎn)換表基址寄存器(CP15的C2寄存器)保存著第一級(jí)轉(zhuǎn)換表基址的物理地址,Bit[31:14]有效,,bit[13:0]為0,,故一級(jí)頁(yè)表必須是16KB對(duì)齊的。

2. 軟件實(shí)現(xiàn)

        啟動(dòng)代碼主要完成建立異常中斷處理向量表,,堆棧初始化,,MMU初始化,進(jìn)入主函數(shù),。啟動(dòng)程序一般分兩段,第一段完成系統(tǒng)最初的初始化,,并把第二段啟動(dòng)程序,、操作系統(tǒng)、驅(qū)動(dòng)程序及應(yīng)用程序完全搬運(yùn)到SDRAM中,,最后將 PC 值設(shè)為第二段程序入口地址,。第二段開(kāi)始部分與第一段初始化部分相同,但并不是初始化操作,,只是重復(fù)執(zhí)行一遍代碼,,然后初始化MMU,最終調(diào)用操作系統(tǒng),。

        S3C2410X有4KB內(nèi)部RAM,,調(diào)試時(shí)可直接將第一段啟動(dòng)程序映象下載到內(nèi)部RAM的初始處,,其它所有程序下載到SDRAM 中。調(diào)試完成后將所有程序下載入FLASH,,系統(tǒng)由FLASH啟動(dòng),,完成部分初始化和程序搬運(yùn)工作,在SDRAM 中完成剩余初始化任務(wù),。

2.1 設(shè)置入口指針

        啟動(dòng)程序必須定義入口指針,,而且整個(gè)應(yīng)用程序只有一個(gè)入口指針。編譯前要設(shè)置好相關(guān)的編譯選項(xiàng),,包括程序入口所在的目標(biāo)文件和文件中具體的模塊區(qū)域,。入口指針定義如下:


AREA boot,CODE,READONLY

ENTRY


2.2 設(shè)置中斷向量

         由地址0X0開(kāi)始存入下面程序,其中保留中斷指向一個(gè)只含返回指令的啞函數(shù),,用來(lái)防止錯(cuò)誤中斷引起系統(tǒng)的混亂,。


B  ResetHandler

B  HandlerUndef

B  HandlerSWI

B  HandlerPabort

B  HandlerDabort

B  .

B  HandlerIRQ

B  HandlerFIQ


        異常中斷地址解析程序每一個(gè)中斷源都要使用,采用了宏定義,,若采用子程序可以節(jié)約存儲(chǔ)空間,,但要保存和恢復(fù)相關(guān)寄存器和子程序現(xiàn)場(chǎng),這增加了額外的開(kāi)銷(xiāo),,故此處采用宏匯編技術(shù),。主要作用是讀中斷向量表,并使 PC 跳轉(zhuǎn)到向量表中的目標(biāo)地址,。


MACRO

$HandlerLabel HANDLER $HandleLabel

$HandlerLabel

sub     sp,sp,#4

stmfd  sp!,{r0}

ldr       r0,=$HandleLabel       //讀中斷向量表

ldr       r0,[r0]                                  

str       r0,[sp,#4]

ldmfd   sp!,{r0,pc}                 //至目標(biāo)地址

MEND


       下面是宏定義的展開(kāi),,使各中斷與向量表的地址對(duì)應(yīng)起來(lái)。


HandlerFIQ      HANDLER    HandleFIQ

HandlerIRQ      HANDLER    HandleIRQ


        復(fù)位中斷的服務(wù)程序總在最初的啟動(dòng)程序里面,,系統(tǒng)復(fù)位后從地址0跳到地址ResetHandler,,開(kāi)始系統(tǒng)初始化,包括使無(wú)效快表和cache,,并把第二段程序代碼完整拷貝到SDRAM的指定空間中,,代碼如下面所示。復(fù)位中斷服務(wù)程序結(jié)束時(shí)使PC值指向該指定空間的起始位置,,按照下面代碼,,該位置地址為0X31000000。


ldr      r1,=PHYBASE                 //將要拷貝代碼的物理地址

ldr      r2, = 0x31000000         //拷貝代碼在SDRAM 的目的地址
ldr      r3, =0x40000               // 要拷貝的代碼數(shù)
13      ldr  r4, [r1], #4                        

str      r4, [r2], #4

subs   r3, r3, #1

bne    %B13


        其它中斷服務(wù)的初始化,,即把它們的中斷服務(wù)程序起始地址填入中斷向量表的操作,,既可在第一段啟動(dòng)程序中進(jìn)行,也可在后繼程序中進(jìn)行,。在FIQ和IRQ中斷服務(wù)程序中首先要判斷中斷請(qǐng)求狀態(tài)寄存器,,根據(jù)狀態(tài)位決定中斷類(lèi)型,啟動(dòng)該類(lèi)型的服務(wù)任務(wù)。

2.3 初始化堆棧

        系統(tǒng)堆棧初始化取決于用戶(hù)使用了哪些處理器模式,,以及系統(tǒng)需要處理哪些錯(cuò)誤類(lèi)型,。對(duì)于將要用到的每一種模式,都應(yīng)該定義好堆棧指針,。此步驟和下面的一些操作可在第一段啟動(dòng)程序中進(jìn)行,,也可在第二段啟動(dòng)程序中進(jìn)行,這依賴(lài)程序員的設(shè)計(jì),,沒(méi)有固定的格式,。為了減小初始化時(shí)間,我把盡可能多的程序放在了第二段啟動(dòng)代碼中,。

2.4 MMU初始化

        在MMU初始化之前應(yīng)先建立數(shù)據(jù)緩沖池,,一般把數(shù)據(jù)緩沖池放在程序的末尾,程序如下,,第一列為虛擬地址,,第二列為物理地址,第三列為段大小,。


      OEMAddressTable

      DCD 0x8C000000, 0x08000000, 32      //32 MB SROM(SRAM/ROM) BANK 1

      DCD 0x84000000, 0x10000000, 32      //32 MB SROM(SRAM/ROM) BANK 2


      下面是基于一級(jí)頁(yè)表的MMU初始化程序,。


       PTs       EQU      0x31010000      //一級(jí)頁(yè)表基地址  ,必須是 16KB 對(duì)齊的

       ldr     r0,=OEMAddressTable

       mov r11,r0                                   //r0 為物理地址到虛擬地址的映射表

       ldr  r10, =PTs                              //r10 裝入頁(yè)表基地址

       mov r0, #0x02 

       orr r0, r0, #0x400                      //設(shè)置讀寫(xiě)位

20   mov r1, r11                                //(r1) = 存儲(chǔ)陣列指針

25   ldr  r2, [r1], #4                          //(r2) = 虛擬地址

       ldr  r3, [r1], #4                          //(r3) = 物理地址

       ldr  r4, [r1], #4                          //(r4) = 對(duì)應(yīng)塊的大小

       cmp r4, #0                                //判斷是否結(jié)束

       beq %F29

       ldr r5, =0xFFF00000

      and  r2, r2, r5                          

      and  r3, r3, r5                            

      Add r2, r10, r2, LSR #18           //虛擬地址右移18 位,在加上頁(yè)表基地址,,作為一級(jí)描述符地址,,這個(gè)地址用于索引頁(yè)表中的頁(yè)表項(xiàng)

      Add r0, r0, r3                            //r0 為頁(yè)表項(xiàng)內(nèi)容(實(shí)際物理地址的高 12 位加上訪(fǎng)問(wèn)控制屬性)

28  str  r0, [r2], #4                         //把頁(yè)表項(xiàng)內(nèi)容存儲(chǔ)到對(duì)應(yīng)的頁(yè)表項(xiàng)地址中

      add r0, r0, #0x00100000         //因?yàn)槭且患?jí)地址變換,所以進(jìn)行下一個(gè)條目變換要把內(nèi)容加1M

      sub  r4, r4, #1                            

      cmp r4, #0

      bne  %B28                               //建立下 1MB 的地址對(duì)應(yīng)關(guān)系

      bic r0, r0, #0xF0000000    

      bic  r0, r0, #0x0FF00000    

      b     %B25                                //配置下一段


        在建立地址映射關(guān)系時(shí),,一般使允許MMU的指令的物理地址和虛擬地址相同,,完成MMU初始化后使能MMU和Caches。

2.5 初始化必要的I/O狀態(tài)

        某些要求嚴(yán)格的 I/O 和用戶(hù)需要在調(diào)用主程序前完成的狀態(tài)控制,,需要在啟動(dòng)程序里面完成初始化,,特別是一些輸出設(shè)備,上電后往往呈現(xiàn)出一種隨機(jī)態(tài),,需要及時(shí)加以控制,。

2.6 調(diào)用主程序

        初始化程序結(jié)束時(shí)調(diào)用主程序,把系統(tǒng)控制權(quán)移交給操作系統(tǒng),。


    ldr r0,=0x31000000

    mov pc,r0


       上面各步操作順序并非固定不變,,可以由程序員適當(dāng)調(diào)整。

3.總結(jié)

        本文主要介紹了ARM9處理器S3C2410X 的初始化過(guò)程,,重點(diǎn)講述ARM9芯片的中斷處理機(jī)制和MMU機(jī)制,雖然以S3C2410X 為例,,但對(duì)ARM720T,、ARM9、ARM10E、Xscale等處理器同樣適用,。本文涉及的程序都經(jīng)作者實(shí)際使用,,沒(méi)有出現(xiàn)問(wèn)題。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶(hù)發(fā)布,,不代表本站觀(guān)點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買(mǎi)等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多