S3C2440啟動代碼中應用程式執行環境的初始化

來源:互聯網
上載者:User
S3C2440啟動代碼中應用程式執行環境的初始化一、基礎知識          我們編寫的源檔案(.c 或.s)經過ARM 編譯器的編譯產生ELF 格式的目標檔案(尾碼名為.o),目標檔案經過ARM 連接器串連以後產生ELF 格式的映像檔案(尾碼名為.axf),此時的映像檔案還包含一些調試資訊,我們還需要通過fromelf 工具將其轉換成適合在ROM 或RAM 中啟動並執行二進位代碼(尾碼名為.bin),這時產生的二進位映像檔案就可以被燒寫入目標板的ROM 或FLASH 中,當目標板上電後可以通過各種方式在ROM 或RAM 中運行。一個可執行程式的映像檔案由一個或多個域組成,域分為兩種:一種是映像檔案在儲存空間中存放的地址,稱為載入域;另一種是映像檔案運行時的地址,稱為運行域。每個域由一個或3 個輸出段組成,每個輸出段則由一個或多個輸入段組成。輸入段包含程式碼、已經初始化的資料、未經初始化的儲存區、被初始化為0 的儲存區,輸入段據此可分為三種屬性:RO(唯讀,包括代碼和常量)、RW(可讀可寫,包括已經初始化的全域變數和靜態變數)、ZI(未初始化的變數,需初始化為0), 連接器根據屬性將輸入段分組,組成不同的輸出段。一個輸出段是有具有相同屬性的輸入段組成的,輸出段的屬性與其中輸入段的屬性相同,因而輸出段也分為三種。域由不同屬性的輸出段組成,輸出段在域中的排列順序為RO 輸出段排在最前,然後是RW 輸出段,RW 輸出段和RO 輸出段可以不連續,最後是ZI 輸出段,ZI 輸出段是緊接著RW 輸出段的(載入域只包含RO、RW 輸出段,原因見後述)。可執行鏡像一開始一般是儲存在系統的ROM 或FLASH 中,RO 段是唯讀,在啟動並執行時候我們不能改變它,所以RO 段在啟動並執行時候可以駐留在ROM 或FLASH 中,也可以拷貝到運行速度更快的RAM 中;RW 段在啟動並執行時候,我們需要對其讀寫,在運行前這一段必須被拷貝至RAM 中;ZI 段為未初始化的全域變數段,只需要在程式運行之前建立ZI 並將其所在地區全部清零即可,因此鏡像裝載域不必包含ZI 輸出段,但在運行域需要包含ZI,並且ZI 必須處於RAM。通過以上說明,我們知道如果某個鏡像只有RO 段的話,程式可以不必拷貝至RAM,但是如果程式包含RW 段的話,RW 段是必需要拷貝至RAM 中的,如果有必要的話還需在RAM 中建立ZI 段,並將其清零。為保證程式的正確執行,而進行必要的資料拷貝和清零,就是應用程式執行環境的初始化。二、S3C2440啟動的基本原理Nand Flash啟動當S3C2440 開發板採用的是Nand Flash 啟動,鏡像一開始是儲存在Nand Flash 中,而Nand Flash只能作為儲存程式和資料之用,無法在其中運行程式,所以S3C2440 開發板啟動代碼中應用環境初始化這一步和上述步驟稍有不同。S3C2440 鏡像檔案載入和運行時的地址映射關係如所示:S3C2440 沒有上電之前映像檔案儲存體在Nand Flash 中,Nand Flash 有專門的控制器控制,不佔用儲存空間BANK。當開發板上電時,Nand Flash 的前4K 被複製到S3C2440 晶片內部的一塊容量為4K 的SRAM(被稱為“Steppingstone”),然後這塊SRAM 被映射到地址0x00000000 處,程式從此處開始運行。因為Nand Flash 中不能運行程式,所以在這4K 的代碼中必須包含一段代碼將Nand Flash 中的程式拷貝至S3C2440 的SDRAM 中(0x30000000 開始)。應用環境初始化應該包含這段代碼。Nand Flash 中的映像檔案被拷貝至從0x30000000 開始的SDRAM,這時候映像檔案還沒有真正被執行,此時是載入狀態,載入域如所示,包括所有RO 屬性的輸出段和RW 屬性的輸出段,ZI 屬性的輸出段此時還不存在。在映像檔案運行時,會產生3 個運行域,如所示,RO 和RW 屬性的運行域的起始地址和載入時是相同的,所以在應用程式執行環境初始化中不需要對其進行拷貝,ZI 運行域則需要在映像開始被執行前建立並被初始化為0,所以應用程式執行環境初始化中也要包含這類代碼。 (注意:RO 和RW 屬性的運行域的起始地址和載入時是相同的,即拷貝到SDRAM後就不用再移動了。ADS中設定的RO Base和RW Base決定了程式的連結地址)Nor Flash啟動當S3C2440採用Nor Flash啟動時,代碼可以在上面直接運行。但為了啟動並執行效率,還是把程式拷貝到SDRRAM中運行。載入時地址關係和運行時地址關係和Nand Flash的基本相似。Nand Flash啟動時,會將RO段和RW段同時拷貝到SDRAM中,然後再建立ZI段。從Nor Flash啟動時是先拷貝RO段,然後再拷貝RW段,最後建立ZI段。三、相關啟動程式碼分析
;一個arm 程式是由R0,RW,ZI 三個段組成。其中R0 為程式碼片段,RW 是已經初始化的全域變數,ZI 是未;初始化的全域變數,啟動代碼要將RO段和RW段複製到RAM 中並將ZI 段清零。編譯器使用下列變數;來記錄各段的起始地址和結束位址。這些標號的值是通過編譯器的設定來確定的如ADS中對ro-base 和;rw-base 的設定。IMPORT  |Image$RO$Base|; Base of ROM codeIMPORT  |Image$RO$Limit|  ; End of ROM code (=start of ROM data)IMPORT  |Image$RW$Base|   ; Base of RAM to initialiseIMPORT  |Image$ZI$Base|   ; Base and limit of areaIMPORT  |Image$ZI$Limit|  ; to zero initialise;===========================================================ldrr0, =BWSCONldrr0, [r0]andsr0, r0, #6;通過判斷OM[1:0] != 0, 得知是NOR FLash bootbnecopy_proc_beg;不用讀取 nand flashadrr0, ResetEntry;OM[1:0] == 0, 從NAND FLash 啟動cmpr0, #0;再比較入口是否為0地址處,如果不是則用了模擬器bnecopy_proc_beg;用模擬器的情況也不要用 nand flash啟動;nop;===========================================================nand_boot_beg  ;這一段程式碼完成從NAND讀代碼到RAM[ {TRUE}bl RdNF2SDRAM]ldrpc, =copy_proc_beg  ;此時的PC已經在0x30000000以後,是copy_proc_beg串連時的地址;這個標號下面的程式碼完成的功能就是把nor flash 的內容拷貝到ram 當中。;===========================================================copy_proc_begadrr0, ResetEntry  ;裝載地址,ResetEntry值->r0ldrr2, BaseOfROM  ;BaseOfROM值cmpr0, r2   ;比較RO,R2ldreqr0, TopOfROM  ;如果相等的話(說明在記憶體中運行),TopOfROM->r0   當從Nand Flash中啟動時r0=r2,當從Nor Flash啟動時則不相等beqInitRam         ;同時跳到InitRam;下面這個是針對代碼在NOR FLASH時的拷貝方法;功能為把從ResetEntry起,TopOfROM-BaseOfROM大小的資料拷到BaseOfROM;TopOfROM和BaseOfROM為|Image$RO$Limit|和|Image$RO$Base|;|Image$RO$Limit|和|Image$RO$Base|由連接器產生為產生的程式碼的程式碼片段運行時的起啟和終止地址;BaseOfBSS和BaseOfZero為|Image$RW$Base|和|Image$ZI$Base|;|Image$RW$Base|和|Image$ZI$Base|也是由連接器產生,兩者之間就是初始化資料的存放地放ldr r3, TopOfROM0ldmiar0!, {r4-r7}stmiar2!, {r4-r7}cmpr2, r3bcc%B0subr2, r2, r3  ;這兩句代碼是修正字非對齊的情況,因為是按4個位元組拷貝的,但RO段大小不一定是4個位元組對齊的subr0, r0, r2InitRamldrr2, BaseOfBSSldrr3, BaseOfZero0cmpr2, r3ldrccr1, [r0], #4strccr1, [r2], #4bcc%B0;這一段是對ResetEntry 裡面定義好的資料拷貝到RW 段。movr0,#0ldrr3,EndOfBSS1cmpr2,r3strccr0, [r2], #4bcc%B1    ;初始化ZI段ldrpc, =%F2;goto compiler address2;[ CLKDIV_VAL>1 ; means Fclk:Hclk is not 1:1.;blMMU_SetAsyncBusMode;|;bl MMU_SetFastBusMode; default value.;]    [ :LNOT:THUMBCODE blMain;不要用main()因為main()是ADS預設入口,編譯器會添加其他代碼 b.      ;跳轉到Main不成功則掛起    ]    [ THUMBCODE ;for start-up code for Thumb mode orrlr,pc,#1 bxlr CODE16 blMain;Do not use main() because ...... b.CODE32    ]BaseOfROMDCD|Image$RO$Base|TopOfROMDCD|Image$RO$Limit|BaseOfBSSDCD|Image$RW$Base|BaseOfZeroDCD|Image$ZI$Base|EndOfBSSDCD|Image$ZI$Limit|

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.