新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > KEIL MDK輸出map文件分析01

        KEIL MDK輸出map文件分析01

        作者: 時間:2016-11-28 來源:網絡 收藏

        果然,在剛開始執行程序時,R10和R11的值就已經被賦值成了這兩個值。

        很快就將0x08002dc0到0x08002dcf處的16個字節,4個雙字加載到了R0-R3,我們可以分析一下里面的內容,R0就是程序加載視圖的RW區的起始地址(0x08002de0),R1就是要輸出的執行視圖的RW區的地址(0x20000000),R2就是要復制的RW數據的個數,R3是復制函數(__scatterload_copy)的地址,類似于一個回調函數。接下來就要用了:0x0800011E 4718BXr3這條指令去執行復制工作。


        下來又將0x08002dd0到0x08002ddf處的16個字節,4個雙字加載到了R0-R3,我們可以分析一下里面的內容,R0就是程序加載視圖的RW區的起始地址(0x08002de0+0x20=0x08002e00),R1就是要輸出的執行視圖的RW區的地址(0x20000020),R2就是要復制的RW數據的個數,R3是ZI區域建立函數(__scatterload_zeroinit)的地址。


        執行完成后,程序就會進入BL.W__rt_entry處進行庫的初始化工作。

        經過這么一分析,現在我對于程序的加載映像和執行映像有了較深的理解:程序的RO_Code加上RO_Data總共是0x2dc0這么大,地址范圍0x0800,0000到0x8000,2dbf。然后在0x0800,2dc0-2dcf共16個字節放了RW加載映像地址(0x0800,2de0)、執行映像地址(0x2000,0000)、RW長度(0x20)和將該段數據從加載映像復制到執行映像的函數地址。在0x0800,2dd0-2ddf共16個字節放了ZI加載映像地址(0x0800,2e00)、執行映像地址(0x2000,0020)、ZI長度(0x480)和建立ZI、HEAP和STACK執行映像的函數地址。

        在上面的第二個階段,將ZI清零階段,程序的ZI長度實際上只有0x20,而庫代碼留出了0x60的長度。因此數據區的頂端為0x2000,00a0-1。接下來從0x2000,00a0開始為堆的起始地址,堆長度加上程序棧長度為0x2000,04a0,這就是堆棧頂端,也是__initial_SP的初始值。

        程序進入_rt_entry后,還要對heapstack進行處理,但我沒有看到有什么用的變化。從中對庫留出的ZI數據區進行了一些處理,我暫時也看不明白。好了,調試就到這里,回到map文件分析的正途。

        5、第五部分:

        Memory Map of the image


        //映像的內存分布


        Image Entry point : 0x080000ed


        //程序的入口點:這里應該是RESET_Handler的地址



        關鍵詞: KEILMDKmap文

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 河津市| 额敏县| 阿合奇县| 荆门市| 平罗县| 射阳县| 莱西市| 拉孜县| 嘉峪关市| 龙里县| 大方县| 汉寿县| 锦州市| 哈巴河县| 定结县| 哈尔滨市| 曲沃县| 黄平县| 沧源| 罗田县| 房产| 新干县| 罗平县| 怀柔区| 金山区| 珠海市| 香河县| 阜新市| 含山县| 武夷山市| 蕲春县| 南宁市| 定结县| 宜川县| 大方县| 汉寿县| 万荣县| 张北县| 巴东县| 哈尔滨市| 白水县|