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的時鐘和中斷等進行配置。