嵌入式_堆栈、BSS段、代码段、数据段/RO、RW、ZI

提示:这里只针对ARM嵌入式系统所说,PC端和其他系统不议


文章目录

  • 嵌入式_堆栈、BSS段、代码段、数据段/RO、RW、ZI
  • 前言
  • 一、代码态
  • 二、存储态
  • 三、运行态
  • 四、运行过程
  • 总结

前言

刚好做单片机的相关项目,学习到基础内容,主要写个博客帮助自己总结和梳理知识,根据自己的理解和逻辑重新梳理顺序的,欢迎指正。


一、代码态

代码态就是使用keil-MDK编译出来的准备烧录的二进制文件,现在只是文件,既没有烧录更没有运行。
例如使用keil编译的工程,打开.map文件最底下显示如图:

==============================================================================Total RO  Size (Code + RO Data)                10824 (  10.57kB)Total RW  Size (RW Data + ZI Data)              2960 (   2.89kB)Total ROM Size (Code + RO Data + RW Data)      11100 (  10.84kB)==============================================================================

Code(代码部分):一般是程序执行代码部分,编译器生成的机器指令(指令又包含操作码和操作数,此处不细说)。
RO_data(read only): 程序中用到的除了内联数据的只读数据,全局变量,典型为const修饰的全局变量,(注:要区别于下述的:RO)
RW_data(ReadWrite):可读写数据部分,初始化不为0的全局变量和static修饰的静态变量(包含全局变量和局部变量),这些数据运行时候长驻RAM区执行读写操作。
ZI_data(zero):未初始化或初始化为0的全局变量和静态变量(包含全局变量和局部变量),与RW_data的区别是初始化赋的值,运行是和RW_data一样。

实验:可以使用keil手动编写一个C语言程序,初始化和不初始化或初始化为0的全局变量,静态变量和只读变量然后查看map文件信息。该实验参见我的另一篇博客:https://blog.csdn.net/Yin_w/article/details/129541728

二、存储态

存储状态就是烧录到机器而没有运行的二进制文件,可以是Flash或ROM。
RO:Total RO Size (Code + RO Data),只读数据,存储在ROM或Flash中,运行时被加载到RAM区
RW:Total RW Size (RW Data + ZI Data),读写数据
ROM:Total ROM Size (Code + RO Data + RW Data),烧录/下载程序到Falsh或者ROM时,所占的最小空间

剩下的ZI_data不被包含到ROM中,是因为初始化值是零,只需要在RAM中执行时将ZI_data所在区域擦除即可

三、运行态

程序运行时候涉及的概念比较多,如图是在RAM中运行时的数据与存储位置的状态(根据框架不同,有些数据也在ROM中运行,此处不细说),运行时将ROM中的代码数据和只读数据分别加载到RAM的text代码段和data段中。
保留区:一般是出厂信息或者编码信息
text代码段:指令将RO中的程序代码加载到此处,
静态存储区:静态存储区分为.bss段和.data段;RO中的RO_data只读数据和RW中的RW_data数据会被加载到此处的.data段,而游离的ZI_data数据此时被加载到.bss区。
Heap堆区:用于存放进程运行中被动态分配的内存段,其大小不固定,可动态扩张或缩减。当进程调用malloc堆区域被扩张,调用free堆区被缩减。
Stack栈区:用户存放程序临时创建的局部变量。函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。由于栈的后进先出特点,所以栈特别方便用来保存/恢复调用现场
内核区:内核运行的区域,此处不细说

注意:我们一般说的堆栈是指的栈区:堆是堆,栈是栈,堆栈是栈
二者的区别总结为:
A.分配方式不同:栈由操作系统自动分配释放;堆的申请和释放工作由程序员手动控制;
B.生长方向不同:堆内存地址由低到高(向上);栈的内存地址由高到低(向下);
C.存放内容不同:栈动态存放函数返回地址、参数、局部变量和寄存器值等。堆顶一字节存放堆的大小,堆中具体内容由程序员填充。
D.存在状态不同:程序运行时候,栈区随程序运行状态而动态变化,堆区则是静态的,申请则有,改写则变,释放则无

四、运行过程

由运行态和存储态可以知道,烧录到ROM中的二进制文件和运行的程序并不一致,这就需要知道程序运行过程是怎样的。
1.首先从存储态将RW从ROM中搬到RAM中,因为RW是变量,变量不能存在ROM中。
2.将ZI所在的RAM区域全部清零,因为ZI区域并不在Image中,所以需要程序根据编译器给出的ZI地址及大小来将相应得RAM区域清零。ZI中也是变量,同理:变量不能存在ROM中
在程序运行的最初阶段,RO中的指令完成了这两项工作后C程序才能正常访问变量。否则只能运行不含变量的代码。
根据以上概念、各个阶段程序数据和存储位置的映射关系,合成理解图如图所示:
浅黄色部分的code和RO_data文字颜色为灰色,表示可能发生在ROM,也可能发生在RAM,根据架构不同而不同

总结

如有错误,欢迎指正,原创不易,转载留名!

堆栈、BSS段、代码段、数据段/RO、RW、ZI相关推荐

  1. 实例说明代码段(.text)、数据段(.data)、bss段、只读数据段(.rodata)、堆栈的划分依据

    目录 程序实例介绍各个段内容.分析段(segment)分布 分析代码段(.text).数据段(.data).bss段.只读数据段(.rodata)划分依据 程序实例介绍各个段内容.分析段(segmen ...

  2. linux硬盘ro改为rw,RO,RW,ZI 和scatter file详解(转载)

    要了解RO,RW和ZI需要首先了解以下知识: (1) ARM程序的组成 此处所说的"ARM程序"是指在 ARM系统中正在执行的程序,而非保存在ROM中的bin映像(image)文件 ...

  3. RO,RW,ZI 和scatter file详解(转载)

    要了解RO,RW和ZI需要首先了解以下知识:       (1) ARM程序的组成             此处所说的"ARM程序"是指在 ARM系统中正在执行的程序,而非保存在R ...

  4. RO,RW,ZI,FLASH,RAM前世今生

    好久没写博客,-.-. 因为接触两个新的平台,芯翼和OPL,又发现对内存和flash分布的一些疑问,或许是自己根基不够稳吧,如果要搞清楚这些的意义,需要以下几个步骤: 2.RO,RW,ZI 是什么 3 ...

  5. RO/RW/ZI区别及在mcu中的存储分配

    1 前言 本文所解决的问题是:KEIL编译出来的文件信息中包含RO RW ZI 大小,该信息到底是flash 还是ram大小? 2 ARM程序的组成 此处所说的"ARM程序"是指在 ...

  6. code ro rw zi 编译的一个ARM的程序,编译结果中的一句话

    code ro rw zi 编译的一个ARM的程序,编译结果中的一句话 Program Size: Code=8044 RO-data=52 RW-data=56 ZI-data=5184 其中: C ...

  7. 日常技术积累-ARM中RO/RW/ZI

    ARM中RO/RW/ZI 背景 定义 LINUX内存为例 ARM程序烧录 总结 背景 一直以来,对ARM体系中的RO/RW/ZI不是很清楚,只是知道有这些东西存在.有时看资料.项目中也会看到这些字眼. ...

  8. C.2#【数据段】—2.数据段data、bss、rodata

    1.1 data 段 用来存储已经初始化的全局变量,也属于静态内存分配区,会占用程序文件空间. 与bss相比,data就容易明白多了,它的名字就暗示着里面存放着数据.当然,如果数据全是零,为了优化考虑 ...

  9. RO,RW,ZI概念

    RO: RO=read-only RW: RW=read-write ZI: ZI=zero-initialized 各部分在空间上的分配结构如下图: When you compile a stand ...

  10. python提取数据段_python提取数据段 python数据分析

    如何在python中用slice分段取数据? 执行以下操作:&gt&gt a=range(6)&gt&gt a[0, 1, 2, 3, 4,5]&gt& ...

最新文章

  1. 干货丨手把手带你玩转机器学习和深度学习
  2. [收藏] 微软850位顶级人才不做Windows研发
  3. vue动态生成下拉框_vue+elementui 动态创建下拉框
  4. TcxComboBox控件说明
  5. 剖析Caffe源码之ImageDataLayer
  6. 如何解决安卓项目在Android Studio无法打开
  7. 配置springcloud配置中心读取github上的配置文件报错:com.jcraft.jsch.JSchException: Auth fail解决方案
  8. printf输出字符串_c语言入门 第十二章 字符串
  9. 闲话WPF之二一(WPF中的数据处理 [3])
  10. Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
  11. 运行PCL代码出现C2988,C2143,C2913等错误
  12. java中的内部类_Java中成员内部类的使用
  13. 麦肯锡:数字化转型四步法!
  14. ISO 9000 质量认证
  15. 安川e1000中文说明书_安川E1000变频器维修故障代码说明书
  16. linux木马查杀工具,【Kali】linux木马查杀
  17. 第二章(1) SCADA/EMS系统的概述
  18. 如何在linux下运行python程序
  19. 优先使用TimeUnit类中的sleep()(转自 ImportNew - 刘志军 翻译自 javarevisited)
  20. File类(Java)

热门文章

  1. 使用74LS90和74LS16进行5和6进制计数器的设计实验
  2. 创业者需要的哪些优秀品质?
  3. 【Python】音乐下载器(for QQ music)
  4. 12. 计划任务(crontab)
  5. 微软禁止员工购买苹果Mac iPad系列产品
  6. 陈天奇《Introduction to Boosted Trees》PPT 缩略版笔记
  7. 大白菜装机教程win10_【技术】Win10系统U盘启动盘制作教程(重装系统必备)
  8. pdf怎么转换成jpg或png格式的图片?
  9. java序列化的隐藏方法
  10. 【MPI并行计算】计算cosx在a~b的积分