当前位置:网站首页>Keil软件中map文件解析
Keil软件中map文件解析
2022-07-30 05:51:00 【电子龙】
写在前面
什么是map文件?
简单的说:map文件是通过编译器编译之后,集程序、数据及IO空间的一种映射文件。
很多技术牛逼的工程师在遇到内存越界,或溢出的情况,首先想到的就是分析map文件。通过map文件可以知道函数大小,入口地址等一些重要信息。
我们在Keil中最常见的就是在编译之后,编译窗口会显示类似如下一段关于程序和数据大小的信息:
Program Size: Code=1112 RO-data=320 RW-data=0 ZI-data=1632
这一段提示信息其实是汇总了程序和数据的信息,这些信息其实是单个模块汇总而成,在map文件里有详细列表。
关于Keil中的map文件
2.1 如何打开map文件
最直接,也是最简单的办法:双击工程目标,出现map文件(注意双击的工程目标,不要双击到工程,或文件组)。如下图:
当然,可以找到map文件位置(Listings文件夹),用编辑器工具打开。
2.2 map文件输出内容配置
在之前文章《Keil系列教程05_工程目标选项配置(一)》中的Listing 列表章节有提到map文件。
map文件输出信息的配置位于:Project -> Options for Target -> Listing,如下图:
主要包含配置:
Memory Map:内存映射
Callgraph:图像映射
Symbols:符号
Cross Reference:交叉引用
Size Info:大小信息
Totals Info:统计信息
Unused Section Info:未调用模块信息
Veneers Info:装饰信息
我们可根据自己情况,想要输出什么信息,勾选对应信息即可。
提示:
A.默认情况,输出所有信息;
B.这些配置是一个组合关系;
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:存储组成大小
下面章节针对Keil DMK-ARM、 ARM Compiler 5组件生成的map文件五大类内容展开详细讲述。
Section Cross References
Section Cross References:模块、段(入口)交叉引用
配置中需勾选:Cross Reference
Section Cross References:模块、段(入口)交叉引用,指的是各个源文件生成的模块、段(定义的入口)之间相互引用的关系。
比如:
main.o(i.System_Initializes) refers to bsp.o(i.BSP_Initializes) for BSP_Initializes
意思是:
main模块(main.o)中的System_Initializes函数(i.System_Initializes),引用(或者说调用)了bsp模块(bsp.o)中的BSP_Initializes函数。
提示:
A.main.o是main.c源文件生成的目标文件模块;
B.I.System_Initializes是System_Initializes函数的入口。
Removing Unused input sections from the image
Removing Unused input sections from the image:移除未调用模块
配置中需勾选:Unuaed Sections Info

这一类很好理解,就是我们代码中,没有被调用的模块(或者说函数)会在map文件中生成一个列表。
比如:
Removing stm32f10x_gpio.o(i.GPIO_AFIODeInit), (20 bytes).
意思是:
stm32f10x_gpio.c文件中GPIO_AFIODeInit模块(函数)未被调用,其代码大小20字节。
最后还有一个统计信息:
52 unused section(s) (total 2356 bytes) removed from the image.
1.总共有52段没有被调用;
2.没有被调用的大小为2356 字节;
Image Symbol Table
Image Symbol Table:映射符号表
配置中需勾选:Symbols
Image Symbol Table:映射符号表,也就是各个段所存储对应地址的表(图片删除了中间部分内容)。
5.1 Symbol分为两大类
1.Local Symbols:局部
2.Global Symbols:全局
5.2 Symbol内容要点
**1.Symbol Name:**符号名称
名称命名及分类请看最后给出的官方参考文档。
**2.Value:**存储对应的地址
大家会发现有0x0800xxxx、0x2000xxxx这样的地址。
0x0800xxxx指存储在FLASH里面的代码、变量等。
0x2000xxxx指存储在内存RAM中的变量Data等。
**3.Ov Type:**符号对应的类型
符号类型大概有几种:Number、Section、Thumb Code、Data等;
细心的朋友会发现:全局、静态变量等位于0x2000xxxx的内存RAM中。
**4.Size:**存储大小
这个容易理解,就是当前行Symbol占用大小。
**5.Object(Section):**段目标
这里一般指所在模块(源文件)。
Memory Map of the image
Memory Map of the image:内存(映射)分布
配置中需勾选:Memory Map
**Memory Map of the image:**内存(映射)分布,内容相对较多,比较重要的一项。
6.1 主要介绍
Image Entry point : 0x08000131:指映射入口地址。
Load Region LR_IROM1 (Base: 0x08000000, Size: 0x00000598, Max: 0x00080000, ABSOLUTE):
指加载区域位于LR_IROM1开始地址0x08000000,大小有0x00000598,这块区域最大为0x00080000.
执行区域:
A.Execution Region ER_IROM1
B.Execution Region RW_IRAM1
这个区域,其实就是对应我们目标配置中的区域,如下如:
6.2 内容要点
1.Base Addr:存储地址
0x0800xxxxFLASH地址和0x2000xxxx内存RAM地址。
**2.Size:**存储大小
**3.Type:**类型
**Data:**数据类型
**Code:**代码类型
**Zero:**未初始化变量类型
PAD:这个类型在map文件中放在这个位置,其实它不能算这里的类型。要翻译的话,只能说的“补充类型”。
ARM处理器是32位的,如果定义一个8位或者16位变量就会剩余一部分,这里就是指的“补充”的那部分,会发现后面的其他几个选项都没有对应的值。
**4.Attr:**属性
**RO:**存储与ROM中的段
**RW:**存储与RAM中的段
**5.Section Name:**段名
这里也可以说为入口分类名,与第一章节“Section Cross References”指的模块、段一样。
大概包含:RESET、.ARM、 .text、 i、 .data、 .bss、 HEAP、 STACK等。
**6.Object:**目标
Image component sizes
Image component sizes:存储组成大小
配置中需勾选:Size Info
**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
上面map信息是比较全面的汇总,如果不想看那些模块的详细,只看汇总统计的信息,可以在配置中只勾选“Totals Info”,对比信息:
最后提示:
本文内容请参看Keil自带的一篇PDF文章《ARM Compiler v5.06 for µVision armlink User Guide》
边栏推荐
- Required request body is missing problem solving
- The introduction of AI meta-learning into neuroscience, the medical effect is expected to improve accurately
- 适合程序员的输入法
- debian problem
- 手机端滚动至页面指定位置
- Vue项目通过node连接MySQL数据库并实现增删改查操作
- sizeof
- AI可通过X光片识别种族,但没人知道为什么
- How to understand plucker coordinates (geometric understanding)
- Electron日常学习笔记
猜你喜欢

华为发布“十大发明”,包含计算、智能驾驶等新领域

From catching up to surpassing, domestic software shows its talents

VR机器人教你如何正确打乒乓球

Huawei released "ten inventions", including computing, intelligent driving and other new fields

Playing script killing with AI: actually more involved than me

空间顶点到平面的距离计算的证明及其源码

Vue项目通过node连接MySQL数据库并实现增删改查操作

让百度地图生成器里的“标注”内容展开--解决方案

export , export default, import complete usage

STL源码剖析:迭代器的概念理解,以及代码测试。
随机推荐
sizeof
相机坐标系,世界坐标系,像素坐标系三者转换,以及OPENGLDEFocal Length和Opengl 的 Fov转换
The CTO said I was not advised to use SELECT *, why is that?
AI元学习引入神经科学,医疗效果有望精准提升
如何理解普吕克坐标(几何理解)
Electron中设置菜单(Menu),主进程向渲染进程共享数据
Electron使用romote报错 : Uncaught TypeError: Cannot read property ‘BrowserWindow‘ of undefined
mysql高阶语句(一)
The calculation proof of the intersection of the space line and the plane and its source code
Go 使用mencached缓存
debian problem
UDP和TCP使用同一个端口,可行吗?
头条二面:MySQL中有几种常见的 SQL 错误用法?
Calculate the inverse source of the matrix (using the adjoint matrix, a 3x3 matrix)
手机端滚动至页面指定位置
Electron之初出茅庐——搭建环境并运行第一个程序
[GO语言基础] 一.为什么我要学习Golang以及GO语言入门普及
bin文件夹下的roslyn文件夹
向量的导数运算和向量叉乘以及点乘的导数运算
Camera coordinate system, world coordinate system, pixel coordinate system conversion, and Fov conversion of OPENGLDEFocal Length and Opengl