<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > S3C2440啟動代碼中應(yīng)用程序執(zhí)行環(huán)境的初始化

          S3C2440啟動代碼中應(yīng)用程序執(zhí)行環(huán)境的初始化

          作者: 時間:2016-11-22 來源:網(wǎng)絡(luò) 收藏

          一、基礎(chǔ)知識

          我們編寫的源文件(.c 或.s)經(jīng)過ARM 編譯器的編譯生成ELF 格式的目標(biāo)文件(后綴名為.o),目標(biāo)文件經(jīng)過ARM 連接器連接以后生成ELF 格式的映像文件(后綴名為.axf),此時的映像文件還包含一些調(diào)試信息,我們還需要通過fromelf 工具將其轉(zhuǎn)換成適合在ROM 或RAM 中運(yùn)行的二進(jìn)制代碼(后綴名為.bin),這時生成的二進(jìn)制映像文件就可以被燒寫入目標(biāo)板的ROM 或FLASH 中,當(dāng)目標(biāo)板上電后可以通過各種方式在ROM 或RAM 中運(yùn)行。
          一個可執(zhí)行程序的映像文件由一個或多個域組成,域分為兩種:一種是映像文件在存儲器中存放的地址,稱為加載域;另一種是映像文件運(yùn)行時的地址,稱為運(yùn)行域。每個域由一個或3 個輸出段組成,每個輸出段則由一個或多個輸入段組成。輸入段包含程序代碼、已經(jīng)初始化的數(shù)據(jù)、未經(jīng)初始化的存儲區(qū)、被初始化為0 的存儲區(qū),輸入段據(jù)此可分為三種屬性:RO(只讀,包括代碼和常量)、RW(可讀可寫,包括已經(jīng)初始化的全局變量和靜態(tài)變量)、ZI(未初始化的變量,需初始化為0), 連接器根據(jù)屬性將輸入段分組,組成不同的輸出段。一個輸出段是有具有相同屬性的輸入段組成的,輸出段的屬性與其中輸入段的屬性相同,因而輸出段也分為三種。域由不同屬性的輸出段組成,輸出段在域中的排列順序為RO 輸出段排在最前,然后是RW 輸出段,RW 輸出段和RO 輸出段可以不連續(xù),最后是ZI 輸出段,ZI 輸出段是緊接著RW 輸出段的(加載域只包含RO、RW 輸出段,原因見后述)。
          可執(zhí)行鏡像一開始一般是存儲在系統(tǒng)的ROM 或FLASH 中,RO 段是只讀的,在運(yùn)行的時候我們不能改變它,所以RO 段在運(yùn)行的時候可以駐留在ROM 或FLASH 中,也可以拷貝到運(yùn)行速度更快的RAM 中;RW 段在運(yùn)行的時候,我們需要對其讀寫,在運(yùn)行前這一段必須被拷貝至RAM 中;ZI 段為未初始化的全局變量段,只需要在程序運(yùn)行之前建立ZI 并將其所在區(qū)域全部清零即可,因此鏡像裝載域不必包含ZI 輸出段,但在運(yùn)行域需要包含ZI,并且ZI 必須處于RAM。
          通過以上說明,我們知道如果某個鏡像只有RO 段的話,程序可以不必拷貝至RAM,但是如果程序包含RW 段的話,RW 段是必需要拷貝至RAM 中的,如果有必要的話還需在RAM 中創(chuàng)建ZI 段,并將其清零。為保證程序的正確執(zhí)行,而進(jìn)行必要的數(shù)據(jù)拷貝和清零,就是應(yīng)用程序執(zhí)行環(huán)境的初始化。

          二、S3C2440啟動的基本原理

          Nand Flash啟動

          當(dāng)S3C2440 開發(fā)板采用的是Nand Flash 啟動,鏡像一開始是存儲在Nand Flash 中,而Nand Flash只能作為存儲程序和數(shù)據(jù)之用,無法在其中運(yùn)行程序,所以S3C2440 開發(fā)板啟動代碼中應(yīng)用環(huán)境初始化這一步和上述步驟稍有不同。S3C2440 鏡像文件加載和運(yùn)行時的地址映射關(guān)系如下圖所示:
          S3C2440 沒有上電之前映像文件存儲在Nand Flash 中,Nand Flash 有專門的控制器控制,不占用存儲器BANK。當(dāng)開發(fā)板上電時,Nand Flash 的前4K 被復(fù)制到S3C2440 芯片內(nèi)部的一塊容量為4K 的SRAM(被稱為“Steppingstone”),然后這塊SRAM 被映射到地址0x00000000 處,程序從此處開始運(yùn)行。因為Nand Flash 中不能運(yùn)行程序,所以在這4K 的代碼中必須包含一段代碼將Nand Flash 中的程序拷貝至S3C2440 的SDRAM 中(0x30000000 開始)。應(yīng)用環(huán)境初始化應(yīng)該包含這段代碼。
          Nand Flash 中的映像文件被拷貝至從0x30000000 開始的SDRAM,這時候映像文件還沒有真正被執(zhí)行,此時是加載狀態(tài),加載域如上圖所示,包括所有RO 屬性的輸出段和RW 屬性的輸出段,ZI 屬性的輸出段此時還不存在。在映像文件運(yùn)行時,會生成3 個運(yùn)行域,如上圖所示,RO 和RW 屬性的運(yùn)行域的起始地址和加載時是相同的,所以在應(yīng)用程序執(zhí)行環(huán)境初始化中不需要對其進(jìn)行拷貝,ZI 運(yùn)行域則需要在映像開始被執(zhí)行前建立并被初始化為0,所以應(yīng)用程序執(zhí)行環(huán)境初始化中也要包含這類代碼。(注意:RO 和RW 屬性的運(yùn)行域的起始地址和加載時是相同的,即拷貝到SDRAM后就不用再移動了。ADS中設(shè)置的RO Base和RW Base決定了程序的鏈接地址)

          Nor Flash啟動

          當(dāng)S3C2440采用Nor Flash啟動時,代碼可以在上面直接運(yùn)行。但為了運(yùn)行的效率,還是把程序拷貝到SDRRAM中運(yùn)行。加載時地址關(guān)系和運(yùn)行時地址關(guān)系和Nand Flash的基本相似。Nand Flash啟動時,會將RO段和RW段同時拷貝到SDRAM中,然后再建立ZI段。從Nor Flash啟動時是先拷貝RO段,然后再拷貝RW段,最后建立ZI段。

          三、相關(guān)啟動代碼分析

          [plain]view plaincopy
          print?
          1. ;一個arm程序是由R0,RW,ZI三個段組成。其中R0為代碼段,RW是已經(jīng)初始化的全局變量,ZI是未
          2. ;初始化的全局變量,啟動代碼要將RO段和RW段復(fù)制到RAM中并將ZI段清零。編譯器使用下列變量
          3. ;來記錄各段的起始地址和結(jié)束地址。這些標(biāo)號的值是通過編譯器的設(shè)定來確定的如ADS中對ro-base和
          4. ;rw-base的設(shè)定。
          5. IMPORT|Image$RO$Base|;BaseofROMcode
          6. IMPORT|Image$RO$Limit|;EndofROMcode(=startofROMdata)
          7. IMPORT|Image$RW$Base|;BaseofRAMtoinitialise
          8. IMPORT|Image$ZI$Base|;Baseandlimitofarea
          9. IMPORT|Image$ZI$Limit|;tozeroinitialise
          10. ;===========================================================
          11. ldrr0,=BWSCON
          12. ldrr0,[r0]
          13. andsr0,r0,#6;通過判斷OM[1:0]!=0,得知是NORFLashboot
          14. bnecopy_proc_beg;不用讀取nandflash
          15. adrr0,ResetEntry;OM[1:0]==0,從NANDFLash啟動
          16. cmpr0,#0;再比較入口是否為0地址處,如果不是則用了仿真器
          17. bnecopy_proc_beg;用仿真器的情況也不要用nandflash啟動
          18. ;nop
          19. ;===========================================================
          20. nand_boot_beg;這一段代碼完成從NAND讀代碼到RAM
          21. [{TRUE}
          22. blRdNF2SDRAM
          23. ]
          24. ldrpc,=copy_proc_beg;此時的PC已經(jīng)在0x30000000以后,是copy_proc_beg連接時的地址
          25. ;這個標(biāo)號下面的代碼完成的功能就是把norflash的內(nèi)容拷貝到ram當(dāng)中。
          26. ;===========================================================
          27. copy_proc_beg
          28. adrr0,ResetEntry;裝載地址,ResetEntry值->r0
          29. ldrr2,BaseOfROM;BaseOfROM值
          30. cmpr0,r2;比較RO,R2
          31. ldreqr0,TopOfROM;如果相等的話(說明在內(nèi)存中運(yùn)行),TopOfROM->r0當(dāng)從NandFlash中啟動時r0=r2,當(dāng)從NorFlash啟動時則不相等
          32. beqInitRam;同時跳到InitRam
          33. ;下面這個是針對代碼在NORFLASH時的拷貝方法
          34. ;功能為把從ResetEntry起,TopOfROM-BaseOfROM大小的數(shù)據(jù)拷到BaseOfROM
          35. ;TopOfROM和BaseOfROM為|Image$RO$Limit|和|Image$RO$Base|
          36. ;|Image$RO$Limit|和|Image$RO$Base|由連接器生成為生成的代碼的代碼段運(yùn)行時的起啟和終止地址
          37. ;BaseOfBSS和BaseOfZero為|Image$RW$Base|和|Image$ZI$Base|
          38. ;|Image$RW$Base|和|Image$ZI$Base|也是由連接器生成,兩者之間就是初始化數(shù)據(jù)的存放地放
          39. ldrr3,TopOfROM
          40. 0
          41. ldmiar0!,{r4-r7}
          42. stmiar2!,{r4-r7}
          43. cmpr2,r3
          44. bcc%B0
          45. subr2,r2,r3;這兩句代碼是修正字非對齊的情況,因為是按4個字節(jié)拷貝的,但RO段大小不一定是4個字節(jié)對齊的
          46. subr0,r0,r2
          47. InitRam
          48. ldrr2,BaseOfBSS
          49. ldrr3,BaseOfZero
          50. 0
          51. cmpr2,r3
          52. ldrccr1,[r0],#4
          53. strccr1,[r2],#4
          54. bcc%B0;這一段是對ResetEntry里面定義好的數(shù)據(jù)拷貝到RW段。
          55. movr0,#0
          56. ldrr3,EndOfBSS
          57. 1
          58. cmpr2,r3
          59. strccr0,[r2],#4
          60. bcc%B1;初始化ZI段
          61. ldrpc,=%F2;gotocompileraddress
          62. 2
          63. ;[CLKDIV_VAL>1;meansFclk:Hclkisnot1:1.
          64. ;blMMU_SetAsyncBusMode
          65. ;|
          66. ;blMMU_SetFastBusMode;defaultvalue.
          67. ;]
          68. [:LNOT:THUMBCODE
          69. blMain;不要用main()因為main()是ADS默認(rèn)入口,編譯器會添加其他代碼
          70. b.;跳轉(zhuǎn)到Main不成功則掛起
          71. ]
          72. [THUMBCODE;forstart-upcodeforThumbmode
          73. orrlr,pc,#1
          74. bxlr
          75. CODE16
          76. blMain;Donotusemain()because......
          77. b.
          78. CODE32
          79. ]
          80. BaseOfROMDCD|Image$RO$Base|
          81. TopOfROMDCD|Image$RO$Limit|
          82. BaseOfBSSDCD|Image$RW$Base|
          83. BaseOfZeroDCD|Image$ZI$Base|
          84. EndOfBSSDCD|Image$ZI$Limit|



          評論


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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();