keil中map文件的重新看法

1、首先map文件中包含了五個部分:

引用部分——指明各個文件段之間的鏈接關係,

remove部分——移除了文件中沒有用的部分,

符號定義部分,局部變量和全局變量,定義了地址變量和所有文件中的以上的兩種變量,

映像文件的內存分佈——Memory Map of the image,定義了映像文件(也即是最終生成的燒錄文件在加載區和執行區的地址映射)所有各類文件的各種成分的大小。

2、重要作用:

用戶在啓動代碼中調用了__main.o模塊中的__main函數,__main又調用了kernel.o中的__rt_entry函數,最後kernel.o又調用了用戶定義的main主函數。(鏈接文件)

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

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

程序進入_rt_entry後,還要對heapstack進行處理。

在這之前都是程序調試無法涉及的部分,應該是啓動文件中的定義內容。

IMPORT  SystemInit
                 LDR     R0, =SystemInit
                 BLX     R0
                 LDR     R0, =__main
                 BX      R0
                 ENDP

    0x08000000   0x000000ec   Data   RO          318    RESET               startup_stm32f10x_md.o
    0x080000ec   0x00000008   Code   RO         3598  * !!!main             c_w.l(__main.o)
    0x080000f4   0x00000034   Code   RO         3754    !!!scatter          c_w.l(__scatter.o)
    0x08000128   0x0000001a   Code   RO         3756    !!handler_copy      c_w.l(__scatter_copy.o)
    0x08000142   0x00000002   PAD
    0x08000144   0x0000001c   Code   RO         3758    !!handler_zi        c_w.l(__scatter_zi.o)
    0x08000160   0x00000002   Code   RO         3625    .ARM.Collect$$libinit$$00000000  c_w.l(libinit.o)
    0x08000162   0x00000000   Code   RO         3632    .ARM.Collect$$libinit$$00000002  c_w.l(libinit2.o)
    0x08000162   0x00000000   Code   RO         3634    .ARM.Collect$$libinit$$00000004  c_w.l(libinit2.o)
    0x08000162   0x00000000   Code   RO         3637    .ARM.Collect$$libinit$$0000000A  c_w.l(libinit2.o)
    0x08000162   0x00000000   Code   RO         3639    .ARM.Collect$$libinit$$0000000C  c_w.l(libinit2.o)
    0x08000162   0x00000000   Code   RO         3641    .ARM.Collect$$libinit$$0000000E  c_w.l(libinit2.o)
    0x08000162   0x00000000   Code   RO         3644    .ARM.Collect$$libinit$$00000011  c_w.l(libinit2.o)
    0x08000162   0x00000000   Code   RO         3646    .ARM.Collect$$libinit$$00000013  c_w.l(libinit2.o)
    0x08000162   0x00000000   Code   RO         3648    .ARM.Collect$$libinit$$00000015  c_w.l(libinit2.o)
    0x08000162   0x00000000   Code   RO         3650    .ARM.Collect$$libinit$$00000017  c_w.l(libinit2.o)
    0x08000162   0x00000000   Code   RO         3652    .ARM.Collect$$libinit$$00000019  c_w.l(libinit2.o)
    0x08000162   0x00000000   Code   RO         3654    .ARM.Collect$$libinit$$0000001B  c_w.l(libinit2.o)
    0x08000162   0x00000000   Code   RO         3656    .ARM.Collect$$libinit$$0000001D  c_w.l(libinit2.o)
    0x08000162   0x00000000   Code   RO         3658    .ARM.Collect$$libinit$$0000001F  c_w.l(libinit2.o)
    0x08000162   0x00000000   Code   RO         3660    .ARM.Collect$$libinit$$00000021  c_w.l(libinit2.o)
    0x08000162   0x00000000   Code   RO         3662    .ARM.Collect$$libinit$$00000023  c_w.l(libinit2.o)
    0x08000162   0x00000000   Code   RO         3664    .ARM.Collect$$libinit$$00000025  c_w.l(libinit2.o)
    0x08000162   0x00000000   Code   RO         3668    .ARM.Collect$$libinit$$0000002C  c_w.l(libinit2.o)
    0x08000162   0x00000000   Code   RO         3670    .ARM.Collect$$libinit$$0000002E  c_w.l(libinit2.o)
    0x08000162   0x00000000   Code   RO         3672    .ARM.Collect$$libinit$$00000030  c_w.l(libinit2.o)
    0x08000162   0x00000000   Code   RO         3674    .ARM.Collect$$libinit$$00000032  c_w.l(libinit2.o)
    0x08000162   0x00000002   Code   RO         3675    .ARM.Collect$$libinit$$00000033  c_w.l(libinit2.o)
    0x08000164   0x00000002   Code   RO         3695    .ARM.Collect$$libshutdown$$00000000  c_w.l(libshutdown.o)
    0x08000166   0x00000000   Code   RO         3709    .ARM.Collect$$libshutdown$$00000003  c_w.l(libshutdown2.o)
    0x08000166   0x00000000   Code   RO         3712    .ARM.Collect$$libshutdown$$00000006  c_w.l(libshutdown2.o)
    0x08000166   0x00000000   Code   RO         3715    .ARM.Collect$$libshutdown$$00000009  c_w.l(libshutdown2.o)
    0x08000166   0x00000000   Code   RO         3717    .ARM.Collect$$libshutdown$$0000000B  c_w.l(libshutdown2.o)
    0x08000166   0x00000000   Code   RO         3720    .ARM.Collect$$libshutdown$$0000000E  c_w.l(libshutdown2.o)
    0x08000166   0x00000002   Code   RO         3721    .ARM.Collect$$libshutdown$$0000000F  c_w.l(libshutdown2.o)
    0x08000168   0x00000000   Code   RO         3600    .ARM.Collect$$rtentry$$00000000  c_w.l(__rtentry.o)
    0x08000168   0x00000000   Code   RO         3602    .ARM.Collect$$rtentry$$00000002  c_w.l(__rtentry2.o)
    0x08000168   0x00000006   Code   RO         3614    .ARM.Collect$$rtentry$$00000004  c_w.l(__rtentry4.o)
    0x0800016e   0x00000000   Code   RO         3604    .ARM.Collect$$rtentry$$00000009  c_w.l(__rtentry2.o)
    0x0800016e   0x00000004   Code   RO         3605    .ARM.Collect$$rtentry$$0000000A  c_w.l(__rtentry2.o)
    0x08000172   0x00000000   Code   RO         3607    .ARM.Collect$$rtentry$$0000000C  c_w.l(__rtentry2.o)
    0x08000172   0x00000008   Code   RO         3608    .ARM.Collect$$rtentry$$0000000D  c_w.l(__rtentry2.o)
    0x0800017a   0x00000002   Code   RO         3629    .ARM.Collect$$rtexit$$00000000  c_w.l(rtexit.o)
    0x0800017c   0x00000000   Code   RO         3677    .ARM.Collect$$rtexit$$00000002  c_w.l(rtexit2.o)
    0x0800017c   0x00000004   Code   RO         3678    .ARM.Collect$$rtexit$$00000003  c_w.l(rtexit2.o)
    0x08000180   0x00000006   Code   RO         3679    .ARM.Collect$$rtexit$$00000004  c_w.l(rtexit2.o)
    0x08000186   0x00000002   PAD
    0x08000188   0x00000040   Code   RO          319    .text               startup_stm32f10x_md.o

從該地址往後就是reset後的第一行程序,_main函數中會繼續調用__rt_entry函數對系統的初始化和堆棧進行處理,

0x08000E24 B500      PUSH     {lr}  此處是進入int main函數的地址,在進入main函數前會對system的時鐘和中斷等進行配置。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章