做嵌入式工程师很多年了,有的同事经常ram和flash傻傻分布清楚,只知道ram里有堆栈,不知道RO-data、RW-data和.bss段.data段有什么联系,这里我做了一个系统的归纳,仅针对微处理器的flash以及ram的内存分配进行讲解;

在讲解之前先说一下哈佛结构和冯·诺依曼架构

一、 哈佛架构和冯·诺依曼架构

为什么开题要讲一下这连个架构呢,因为不同的架构决定着实际ram和flash中内容分配有不同策略

哈佛架构

(英语:Harvard architecture)是一种将程序指令储存和数据储存分开的存储器结构。中央处理器首先到程序指令储存器中读取程序指令内容,解码后得到数据地址,再到相应的数据储存器中读取数据,并进行下一步的操作(通常是执行)。程序指令储存和数据储存分开,数据和指令的储存可以同时进行,可以使指令和数据有不同的数据宽度;

归纳一下所谓的哈弗架构其实就是将指令存储与数据存储分开,大部分的微处理器都是这种架构,程序放在flash中,而数据放在ram中,共用两条不同的总线,这种架构的优势是程序运行迅速,程序和数据加载读取分别在不同的总线上并行处理,对于小flash需求的场景非常适合;

冯·诺依曼架构

    (von Neumann architecture),也称普林斯顿结构,是一种将程序指令存储器和数据存储器合并在一起的电脑设计概念结构。本词描述的是一种实作通用图灵机的计算装置,以及一种相对于平行计算的序列式结构参考模型(referential model)。

本结构隐约指导了将储存装置与中央处理器分开的概念,因此依本结构设计出的计算机又称储存程式型电脑。

概括一下这个架构的特点,就是指令存储与数据存储是在一起的,X86、大部分soc都是这种架构,这就是为什么他们都是需要先从存储器中读取程序代码,并将程序代码加载到内存中再去运行的原因

二、微处理器RAM内容分布

上面我们已经阐述了微处理器的架构特点,那么我们考虑一下在微处理器中ram主要存放的东西是什么?---数据

数据包括什么呢?全局变量,局部变量、静态变量、常量,其中除了常量都是存放在ram中;

ram的区域定义从上到下依次是:

栈(stack)

堆(heap)

未初始化全局区(.bss)

初始化全局区(.data)

.bss段都包含那些内容呢?零数据段,存放未初始化的全局变量及局部静态变量,或者是初始化为0的全局变量以及局部静态变量;

.data段包含的内容呢?初始化数据段,存放初始化的全局变量及局部静态变量;

那么怎么看查看程序运行中内存的使用情况呢?从分析可知内存的变化主要是因为堆、栈,将固件下载到微处理器的那一刻起,.bss以及.data的大小已经基本确定,只要评估甚于堆与栈的大小就能评估当前内存的使用情况;

三、微处理器FLASH内容分布

针对MDK编译出的hex或者bin文件,IDE自主定义了几种数据段来描述flash存储内容我先介绍几个名词;

ZI-data: 零数据段

RW-data:可读写需要初始话数据段

RO-data:只读数据段;

text:代码段

所以编译好的bin文件或者是hex文件著有就是由上述的四个段构成,一般编译器都会生成.map文件可以查看每个数据段在镜像文件中的相对地址;

对于flash以及ram而言最大的区别就是数据易失性不同,所以由于这种特性可以将固件中一部分掉电可失去的数据放到ram中,对于flash而言flash真正存储的内容如下

需要初始化的数据(RW-data)

只读常量(RO-data)

代码(code)

flash size = code_size + RO-data_size + RW-data_size;

大家会发现其中并没有ZI-data数据段,flash一般不存储ZI-data数据段,而是保存一些数据段地址以及数据段大小的信息;

四、开机加载过程

前面已经详细的概述了flash以及ram中的具体组成内容,这里顺便说一下程序运行时是如何完ram内容分配的,

程序上电-》code、RO-data不搬运-》将 RW 段中的 RW-data 搬运到 RAM 的.data区-》 据编译器给出的 ZI 地址和大小分配出 ZI 段,并将这块 RAM 区域清零为.bss区-》剩下的空间为堆heap、栈stack

总结一下一定不要将镜像的存储数据段与ram的数据区概念混淆;

微处理器flash及ram内容详解相关推荐

  1. 思科网络设备 show version命令输出内容详解

    show version show version命令可用于检验和检修启动过程中使用的一些基本硬件和软件组件.验证设备的内存.接口和许可 Router#show version Cisco IOS S ...

  2. STM32CubeMX GCC工程Makefile内容详解

    STM32CubeMX GCC工程Makefile内容详解 基础介绍 因为项目原因,需要对编译系统进行一些比较复杂的使用,但是我对于编译系统这一块并不是非常精通了解,所以需要进行一下学习.正巧,众所周 ...

  3. SQL Server DBA工作内容详解

    原文:SQL Server DBA工作内容详解 在Microsoft SQL Server 2008系统中,数据库管理员(Database Administration,简称为DBA)是最重要的角色. ...

  4. matlab的NLP功能,pyhanlp 共性分析与短语提取内容详解

    pyhanlp 共性分析与短语提取内容详解 简介 HanLP中的词语提取是基于互信息与信息熵.想要计算互信息与信息熵有限要做的是 文本分词进行共性分析.在作者的原文中,有几个问题,为了便于说明,这里首 ...

  5. java json path_Java使用JSONPath解析JSON完整内容详解

    JsonPath是一种简单的方法来提取给定JSON文档的部分内容. JsonPath有许多编程语言,如Javascript,Python和PHP,Java. JsonPath提供的json解析非常强大 ...

  6. 通过draggable实现布局_营销推广引流之百度霸屏内容详解 如何通过百度霸屏布局实现立体打法!...

    本篇文章主要讲一讲如何通过百度霸屏布局实现立体打法! 百度霸屏的内容详解 百度霸屏个人好做吗 营销推广引流之百度霸屏? 百度霸屏简单的讲就是当用户从百度搜索某个和你业务相关的关键词,如果页的位置可以出 ...

  7. Proxy和Reflect内容详解

    ES6中的Proxy和Reflect内容详解 监听对象的操作 我们先来看一个需求:有一个对象,我们希望监听这个对象中的属性被设置或获取的过程 通过我们前面所学的知识,能不能做到这一点呢? 其实是可以的 ...

  8. 《方块方舟》自定义服务器工具,方舟方块世界怎么自建服务器 自建服务器方法内容详解-游侠网...

    方块方舟怎么自建服务器?很多玩家都想要自建立一个服务器,之前刚刚有了一个解决方案.小编就为大家整理好了方舟方块世界自建服务器方法内容详解,正在苦恼的玩家们还不快点进来看看? 游戏自建服务器方法内容解析 ...

  9. 命运2服务器维护2021,命运2 2021年3月17日更新内容详解 冰影系列削弱一览[多图]...

    命运2官方将在2021年3月17日的更新中对冰影系列进行削弱,部分玩家可能还不清楚,下面一起来看看命运2 2021年3月17日更新内容详解吧. 命运2 2021年3月17日更新内容详解 在3月17日即 ...

  10. 不思议迷宫 服务器维护,不思议迷宫精英服为什么进不去了 不思议迷宫精英服12月1日更新内容详解...

    不思议迷宫精英服为什么进不去了,很多玩家发现今天进不去精英服务器了,这是为什么呢?其实是因为更新,那么这次都有那些更新呢?很多玩家还不是特别清楚,今天小编便给大家带来不思议迷宫手游精英服务器12月1日 ...

最新文章

  1. ubuntu多节点安装kubernetes
  2. 做创业者的老婆,一定要注意股权分配的3个坑
  3. oralce group by字符串拼接
  4. sharepoint页面嵌入_在SharePoint 2010页面中嵌入SWF文件
  5. MPEG2、H.263、H.264协议效率对比
  6. TensorFlow载入VGG并可视化每层
  7. python whl安装 缺少dll 查看具_解决Python安装时报缺少DLL问题【两种解决方法】
  8. 【第一部分】04Leetcode刷题
  9. SAS 146GB*8 RAID5数据恢复过程(HP 双循环)
  10. OracleRAC基本概念及入门
  11. PP视频(PPTV聚力)web接口分析
  12. 八大算法实现(Java)
  13. 人人商城二次开发 各个装修模块diypage的自定义样式
  14. 和合信诺牵手招行私人银行,构建智能合规知识引擎
  15. Scratch 与C语言实现数据结构静态链表的建立及操作
  16. 3D建模师的需求到底有多大?以前想都不敢想
  17. Specification 参数的用法
  18. 数据结构笔记(持续更新)
  19. 如何追踪大户操作,暴躁兔链上数据复盘StepN
  20. 缓冲技术之三:Linux下I/O操作buffer缓冲块使用流程

热门文章

  1. 数据分析师必备的六大技能,你都掌握了吗?
  2. 4G 全网通DTU是什么 有哪些功能应用
  3. 12、vue-awsome-swiper与轮播图组件
  4. 手写朴素贝叶斯文本分类
  5. 解决翻译论文时出现的换行问题-网页翻译-谷歌插件-翻译助手
  6. 财务分析中三张财务报表计算公式
  7. drupal主题开发_开发人员充满了Drupal的活力和活力
  8. keil c语言字符型变量的值,Keil C语言
  9. keil5工程函数无法跳转到函数定义解决方法
  10. 为了相同的前缀-麦迪时刻