STM32 MAP文件结合固件文件分析

news2024/10/5 18:30:28

文章目录

    • 加载域的结束地址并不是固件的结束地址?
      • ROM中执行域的描述
      • RAM中执行域的描述
      • 问题分析
    • 中断向量表在固件中的存储位置
    • 代码段在固件中的位置
    • 只读数据
      • Regin$$Table
    • RW Data段
      • 其中的内部机理
    • 总结

MAP 文件分析可以参考之前的文章

程序代码在未运行时在存储器空间内称为加载域,在运行时在存储器空间内称为运行域。

加载域的结束地址并不是固件的结束地址?

在这里插入图片描述
在这里我们根据加载域的描述可以知道加载域的空间结束位置应该为0x08020000+0x00010978=0x08030978的位置。从下面的固件我们可以知道固件的实际结束位置应该是0x080305E8。这里的俩个位置并不一致是什么原因呢?我们继续往下逐步分析。

在这里插入图片描述

ROM中执行域的描述

在这里插入图片描述

上图内容的最后一行:结束地址为0x080304e0+0x20=0x08030500,和第一行中的描述一致。
根据类型和属性可以知道这一部分的内容为代码段(Code)只读数据段(RO Data)
起始的第一个段为只读数据段,这个段的内容为中断向量表的数据。

这里我们根据上图计算下:
代码段大小:0x0802f754-0x08020188= 0x000f5cc对应于十进制为62924
只读数据段大小:0x08030500-0x0802f754+0x188=0xf34对应于十进制为3892
在这里插入图片描述
计算结果刚好和MAP文件中固件信息汇总处的结果一致

RAM中执行域的描述

在这里插入图片描述
根据类型和属性信息我们可以知道这一部分内容为RW DataZI Data
这里我们根据上图计算:
RW Data大小:0x478对应于十进制为1144
ZI Data:0x49b0+0x2000-0x478=0x6538对应于十进制为25912
在这里插入图片描述
Grand Totals - 显示映像文件的真实大小
ELF Image Totals - 可执行链接格式映像文件大小(如果使用RW数据压缩来优化ROM大小,则最终镜像的大小会发生变化)
ROM Totals - 显示包含镜像所需的ROM的最小大小
上面的计算结果和真实映像文件的大小是对应的,由于对RW数据进行了压缩,导致实际的RW空间会比上面的计算值小。
知识点:linker默认会将重复的RW数据压缩。

上图中最后一行0x200049b0+0x2000=0x200069b0刚好和栈顶地址一致:
在这里插入图片描述

问题分析

至此我们基本知道了原因,由于链接时会将重复的RW数据进行压缩,所以实际的固件大小会小于加载数据的大小,差值刚好为被压缩掉的RW数据空间的大小

中断向量表在固件中的存储位置

在MAP文件中我们可以知道 ,向量表的起始地址为0x08020000结束地址为0x08020188
在这里插入图片描述
对应于固件中的信息:
在这里插入图片描述
首地址为栈顶地址,
在这里插入图片描述
第二数据为复位函数的入口地址
在这里插入图片描述
后续内容依次为中断向量表中各个中断函数的入口地址。

代码段在固件中的位置

中断向量表的内容结束后便是代码段的内容
从MAP文件中可以看出0x08020188位置开始到0x0802f754位置结束存储的内容便为代码段的程序代码
在这里插入图片描述
如下图红框中的位置开始后续便为程序代码的数据
在这里插入图片描述

在这里插入图片描述
上图为代码段结束部分的位置

只读数据

代码段内容结束后紧跟着就是只读数据段
从下面的map文件可知0x0802f754到0x0803500之间存储的便是只读数据
在这里插入图片描述
这里我们去上图长框位置的CRC32Table的数据进行查看,对应固件位置如下图所示:
在这里插入图片描述
上图红框位置开始后续的数据和下面表中的数据是完全一致的。
在这里插入图片描述

Regin$$Table

之前的文章中有分析这个数据表,往RAM空间加载数据依据的便是这个表提供的信息。
在这里插入图片描述

RW Data段

单纯从MAP文件看RW Data数据需要0x478字节的空间
在这里插入图片描述

在固件文件中从0x0803500一直到程序的结束存储的便是RW Data数据的内容,共占0xE8字节的空间,从上面的分析中可以知道,实际生成固件中的RW Data是压缩过后的数据,其中去掉了重复数据,等程序运行时在RAM中再将数据展开,这样有助于节省ROM空间。
在这里插入图片描述

其中的内部机理

对于没有赋初值或初始化为0的全局变量,会等到程序运行时再在RAM中划分出一块区域并初始化为0,这时你可能会纳闷程序代码中怎么知道变量在RAM中划分区域的位置呢?答案是程序实际就是知道,并且程序中每次需要访问变量的位置在程序代码中变量指向的空间就是RAM中对应的位置。你可能会感觉很神奇,但结合之前的Regin$$Table分析你可能就会感到豁然了,毕竟RAM中的空间分配早就在固件生成时都定义好了,固件中也已经记录了这些信息。
那对于RW Data而言其实道理也是一样的,只不过RW Data对应的数据是有初值的。这里我们只需将全部全局变量的值记录下来并去掉重复数据后存储到固件中,在程序运行时在RAM中创建了对应的全局变量空间后将初值赋值给对应的变量即可。不过这好像还有个疑问:运行时怎么知道将那个值赋值给哪个变量呢?后续再继续探究下。

总结

固件各段在Flash中的存放顺序,以及运行时加载到SRAM中的顺序如下:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1688697.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

漫谈企业信息化安全 - 勒索软件攻击

一、引言 首先,网络攻击是一个非常广泛的话题,网络攻击从一般分类上包含了恶意软件攻击、钓鱼攻击、拒绝服务攻击(DoS/DDoS)、中间人攻击、SQL注入、跨站脚本、0-Day攻击、供应链攻击、密码攻击等等,勒索软件攻击只是…

EfficientSAM分割对象后求其中图像中的高

1 分割对象 EfficientSAM https://github.com/yformer/EfficientSAM 2 计算在图像中最高点即y值最小点 import os import cv2def read_images(folder_path):image_files [f for f in os.listdir(folder_path) iff.endswith(".jpg") or f.endswith(".png&quo…

OSPF状态机及网络接口类型

、OSPF 状态机 Down一旦接收到hello 包进人下一个状态机 Init 初始化接收到的hello 包中,若存在本地的 RID,进入下一状态 2way 双向通讯--邻居关系建立的标志 条件匹配:点到点网络直接进入下一个状态机 MA 网络将进行 DR/BDR 选举(40S) 非 DR…

安卓数据存储(键值对、数据库、存储卡、应用组件Application、共享数据)

键值对 此小节介绍Android的键值对存储方式的使用方法,其中包括:如何将数据保存到共享参数,如何从共享参数读取数据,如何使用共享参数实现登陆页面的记住密码功能,如何使用Jetpack集成的数据仓库。 共享参数的用法 …

Linux笔记之命令行JSON处理器jq

Linux笔记之命令行JSON处理器jq code review! 文章目录 Linux笔记之命令行JSON处理器jq1.安装2.jq 基本用法3.例程3.1. 示例JSON文件3.2. 读取特定字段3.3. 管道过滤器(Pipe Filters)3.4. 映射过滤器(Map Filters)3.5. 条件过滤…

python使用jsonpath来查找key并赋值

目录 一、引言 二、JsonPath简介 三、Python中的JsonPath库 四、使用JsonPath查找JSON Key 五、使用JsonPath赋值JSON Key 六、高级用法 七、结论 一、引言 在数据驱动的现代应用中,JSON(JavaScript Object Notation)已成为一种广泛使…

使用echarts配置中国地图

使用echarts配置中国地图 首先要下载地图的geoJSON数据,有两个方式下载,一种是去echarts的github资源文件里面,一种是去阿里云的datav网站。 1.1 echarts文档下载中国地图json数据 1.2 阿里云datav 新建项目,新建index.html,下…

HeyGen AI是什么?怎样使用HeyGen AI?

在数字时代,视频内容为王。无论是在社交媒体还是网站上,视频都以其独特的方式吸引着人们的眼球。然而,制作出专业水准的视频往往需要大量的时间和技术知识。HeyGen AI正是为了解决这一难题而诞生的。 HeyGen AI简介 HeyGen AI是一个创新的视…

做抖音小店需要清楚的5个核心点!

大家好,我是喷火龙。 不管你是在做抖音小店,还是在做其他的电商平台,如果已经做了一段时间了,但还是没有拿到什么结果,我所指的结果不是什么大结果,而是连温饱都解决不了,甚至说还在亏钱。 有…

ICLR 2024现场精彩回顾 机器学习大牛们的“踩高跷秀”嗨翻全场

会议之眼 快讯 2024年5月7-11日,第12届ICLR(International Conference on Learning Representations)即国际学习表征会议已经在奥地利维也纳展览中心圆满结束!国际学习表征会议(ICLR)作为机器学习领域的顶级会议之一,…

Threejs路径规划_基于A*算法案例V2

路径规划算法中有两种算法使用最普遍,第一个是Dijkstr算法,第二个是A*算法,两个算法各有千秋,Dijkstra算法可以保证最优解,但是复杂度较高,尤其当点数量较多时,A*算法是一种启发式搜索算法&…

Offline RL : Beyond Reward: Offline Preference-guided Policy Optimization

ICML 2023 paper code preference based offline RL,基于HIM,不依靠额外学习奖励函数 Intro 本研究聚焦于离线偏好引导的强化学习(Offline Preference-based Reinforcement Learning, PbRL),这是传统强化学习&#x…

设计模式13——桥接模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用,主要是下面的UML图可以起到大作用,在你学习过一遍以后可能会遗忘,忘记了不要紧,只要看一眼UML图就能想起来了。同时也请大家多多指教。 桥接模式(Bridge&a…

Hsql每日一题 | day02

前言 就一直向前走吧,沿途的花终将绽放~ 题目:主播同时在线人数问题 如下为某直播平台主播开播及关播时间,根据该数据计算出平台最高峰同时在线的主播人数。 id stt edt 1001,2021-06-14 12:12:12,2021-06-14 18:1…

makefile 编写规则

1.概念 1.1 什么是makefile Makefile 是一种文本文件,用于描述软件项目的构建规则和依赖关系,通常用于自动化软件构建过程。它包含了一系列规则和指令,告诉构建系统如何编译和链接源代码文件以生成最终的可执行文件、库文件或者其他目标文件…

【杂七杂八】Huawei Gt runner手表系统降级

文章目录 Step1:下载安装修改版华为运动与健康Step2:在APP里进行配置Step3:更新固件(时间会很长) 目前在使用用鸿蒙4 111版本的手表系统,但是感觉睡眠检测和运动心率检测一言难尽,于是想到是否能回退到以前的版本&…

NFT Insider #131:Mocaverse NFT市值破3.5万ETH,The Sandbox 参加NFCsummit

引言:NFT Insider由NFT收藏组织WHALE Members(https://twitter.com/WHALEMembers)、BeepCrypto (https://twitter.com/beep_crypto)联合出品,浓缩每周NFT新闻,为大家带来关于NFT最全面、最新鲜、…

element-ui手机区号+手机号

需求场景 项目开发中对方要求手机号带上全球区号 需求分析 项目使用的是若依前端框架,element-ui的框架。尝试使用已经网上的组件vue-country-intl等发现不怎么适配element-ui的样式等。这还不是关键的,关键的是弹窗中使用这些组件发现区号的下拉展示框…

OpenFeign快速入门 替代RestTemplate

1.引入依赖 <!--openFeign--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><!--负载均衡器--><dependency><groupId>org.spr…

本特利330103-03-09-10-02-00 PLC模块技术分析与应用探讨

本特利330103-03-09-10-02-00 PLC模块技术分析与应用探讨 一、引言 在工业自动化领域中&#xff0c;可编程逻辑控制器&#xff08;PLC&#xff09;作为核心控制设备&#xff0c;其性能的稳定性和可靠性直接关系到整个生产线的运行效率。本特利&#xff08;Bentley&#xff09;…