色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 深入分析S3C2440啟動代碼中大小端問題

          深入分析S3C2440啟動代碼中大小端問題

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

          一、ADS1.2中關(guān)于大小端的設(shè)置以及對編譯后的代碼的影響

          下面是一段代碼在線段模式下編譯,生成的二進(jìn)制文件的內(nèi)容
          大端模式下編譯,生成二進(jìn)制文件的內(nèi)容
          根據(jù)上面的內(nèi)容可以看出:它們的字節(jié)序是相反的,也就是說,ADS1.2中對大小端的設(shè)置會影響最終生成的二進(jìn)制文件的字節(jié)序。

          二、S3C2440啟動代碼中與大小管相關(guān)的代碼

          Option.inc中相關(guān)代碼

          本文引用地址:http://cafeforensic.com/article/201611/319967.htm
          [plain]view plaincopy
          print?
          1. GBLLENDIAN_CHANGE
          2. NDIAN_CHANGESETL{FALSE}
          3. GBLAENTRY_BUS_WIDTH
          4. NTRY_BUS_WIDTHSETA16


          2440init.s中相關(guān)代碼
          [plain]view plaincopy
          print?
          1. AREAInit,CODE,READONLY
          2. ENTRY
          3. EXPORT__ENTRY
          4. __ENTRY
          5. ResetEntry
          6. ;1)Thecode,whichconvertstoBig-endian,shouldbeinlittleendiancode.
          7. ;2)ThefollowinglittleendiancodewillbecompiledinBig-Endianmode.
          8. ;Thecodebyteordershouldbechangedasthememorybuswidth.
          9. ;3)Thepseudoinstruction,DCDcannotbeusedherebecausethelinkergenerateserror.
          10. ASSERT:DEF:ENDIAN_CHANGE
          11. [ENDIAN_CHANGE
          12. ASSERT:DEF:ENTRY_BUS_WIDTH
          13. [ENTRY_BUS_WIDTH=32
          14. bChangeBigEndian;DCD0xea000007
          15. ]
          16. [ENTRY_BUS_WIDTH=16
          17. andeqr14,r7,r0,lsl#20;DCD0x0007ea00
          18. ]
          19. [ENTRY_BUS_WIDTH=8
          20. streqr0,[r0,-r10,ror#1];DCD0x070000ea
          21. ]
          22. |
          23. bResetHandler
          24. ]
          25. bHandlerUndef;handlerforUndefinedmode
          26. bHandlerSWI;handlerforSWIinterrupt
          27. bHandlerPabort;handlerforPAbort
          28. bHandlerDabort;handlerforDAbort
          29. b.;reserved
          30. bHandlerIRQ;handlerforIRQinterrupt
          31. bHandlerFIQ;handlerforFIQinterrupt
          32. ;@0x20
          33. bEnterPWDN;Mustbe@0x20.
          34. ChangeBigEndian
          35. ;@0x24
          36. [ENTRY_BUS_WIDTH=32
          37. DCD0xee110f10;0xee110f10=>mrcp15,0,r0,c1,c0,0
          38. DCD0xe3800080;0xe3800080=>orrr0,r0,#0x80;//Big-endian
          39. DCD0xee010f10;0xee010f10=>mcrp15,0,r0,c1,c0,0
          40. ]
          41. [ENTRY_BUS_WIDTH=16
          42. DCD0x0f10ee11
          43. DCD0x0080e380
          44. DCD0x0f10ee01
          45. ]
          46. [ENTRY_BUS_WIDTH=8
          47. DCD0x100f11ee
          48. DCD0x800080e3
          49. DCD0x100f01ee
          50. ]
          51. DCD0xffffffff;swinv0xffffffissimilarwithNOPandrunwellinbothendianmode.
          52. DCD0xffffffff
          53. DCD0xffffffff
          54. DCD0xffffffff
          55. DCD0xffffffff
          56. bResetHandler
          我們可以看到,在Option.inc將ENDIAN_CHANGE設(shè)置FALSE,程序?qū)⒅苯舆\(yùn)行b ResetHandler,S3C2440默認(rèn)是處于小端模式,ADS1.2中的設(shè)置默認(rèn)也是小段模式,一切風(fēng)平浪靜。
          現(xiàn)在,我們在ADS1.2中設(shè)為打斷模式,并把ENDIAN_CHANGE設(shè)置FALSE設(shè)為TURE,現(xiàn)在問題就來了,請看下面的分析。
          在編譯程序時,根據(jù)ENTRY_BUS_WIDTH宏會將下面三條指令的之一放在0地址處
          b ChangeBigEndian ;DCD 0xea000007
          andeq r14,r7,r0,lsl #20 ;DCD 0x0007ea00
          streq r0,[r0,-r10,ror #1] ;DCD 0x070000ea
          其實這三條指令的功能都是一樣,只是根據(jù)數(shù)據(jù)帶寬調(diào)整了字節(jié)序,都是跳轉(zhuǎn)到0x24處的ChangeBigEndian執(zhí)行,ChangeBigEndian的作用就是通過協(xié)處理CP15中的寄存器C1來改變S3C2440的大小端模式。
          先來看一下這三條指令。因為我們已經(jīng)在ADS中設(shè)置為大端模式,所以這些指令是以大端模式進(jìn)行編譯的,而S3C2440此時還是小端模式,S3C2440怎么能執(zhí)行大端模式下的指令呢,比如b ChangeBigEndian ;DCD 0xea000007???
          原因如下:
          如果一個基于 ARM 芯片將存儲器系統(tǒng)配置為其中一種存儲器格式(如小端) ,而實際連接的存儲器系統(tǒng)配置為相反的格式(如大端) ,那么只有以字為單位的指令取指、數(shù)據(jù)裝載和數(shù)據(jù)保存能夠可靠實現(xiàn)。其它的存儲器訪問將出現(xiàn)不可預(yù)期的結(jié)果。也就就是說在32位模式下,大小端模式對指令取指、數(shù)據(jù)裝載和數(shù)據(jù)保存沒有影響。(注意:如果實際的存儲器格式與芯片的存儲器格式不符時,只有以字為單位的數(shù)據(jù)存取才正確,否則將出現(xiàn)不可預(yù)期的結(jié)果。)
          b ChangeBigEndian在大端模式下機(jī)器碼是0xea000007,這是32位模式下,其四個字節(jié)從低到高分別是:07 00 00 ea。那沒b ChangeBigEndian這條指令在8位模式下,要被小端模式的S3C2440執(zhí)行,就要人為的修改為0x070000ea。在存儲器中存儲的順序:從低地址到高地址分別是 07 00 00 ea,S3C2440按小端模式取指令時,取得是0xea000007。
          b ChangeBigEndian這條指令在16位模式下,要被小端模式的S3C2440執(zhí)行,就要人為的修改為0x0007ea00。在存儲器中存儲的順序:從低地址到高地址分別是 0007 ea00,S3C2440按小端模式取指令時,取得是0xea000007。
          后面修改協(xié)處理CP15中的寄存器C1的代碼時類似的。


          關(guān)鍵詞: S3C2440啟動代碼大小

          評論


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

          關(guān)閉