关于_map文件的全面解析

引用链接:https://www.strongerhuang.com/Keil/Keil系列教程12_map文件全面解析.html
这篇文章介绍的比较全面,摘录部分我认为比较重要的如下:

什么是map文件?
简单的说:map文件是通过编译器编译之后,集程序、数据及IO空间的一种映射文件。
很多技术牛逼的工程师在遇到内存越界,或溢出的情况,首先想到的就是分析map文件。通过map文件可以知道函数大小,入口地址等一些重要信息。

我们在Keil中最常见的就是在编译之后,编译窗口会显示类似如下一段关于程序和数据大小的信息:
Program Size: Code=1112 RO-data=320 RW-data=0 ZI-data=1632

这一段提示信息其实是汇总了程序和数据的信息,这些信息其实是单个模块汇总而成,在map文件里有详细列表。
关于_map文件的全面解析
keil 主要包含配置:
Memory Map:内存映射
Callgraph:图像映射
Symbols:符号
Cross Reference:交叉引用
Size Info:大小信息
Totals Info:统计信息
Unused Section Info:未调用模块信息
Veneers Info:装饰信息

2.3 map文件内容分类
从上面输出配置可以看得出来map文件大概包含了哪些信息。map文件将其分为如下五大类:
1.Section Cross References:模块、段(入口)交叉引用

2.Removing Unused input sections from the image:移除未调用模块

3.Image Symbol Table:映射符号表

4.Memory Map of the image:内存(映射)分布

5.Image component sizes:存储组成大小

我们编译工程后,在编译窗口一般会看到类似如下一段信息:
Program Size: Code=1112 RO-data=320 RW-data=0 ZI-data=1632

Code:指代码的大小;
Ro-data:指除了内联数据(inline data)之外的常量数据;
RW-data:指可读写(RW)、已初始化的变量数据;
ZI-data:指未初始化(ZI)的变量数据;

提醒:
A.Code、Ro-data:位于FLASH中;
B.RW-data、ZI-data:位于RAM中;
C.RW-data已初始化的数据会存储在Flash中,上电会从FLASH搬移至RAM。

关系如下:
RO Size = Code + RO Data
RW Size = RW Data + ZI Data
ROM Size = Code + RO Data + RW Data