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的时钟和中断等进行配置。