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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值