1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 堆栈 BSS段 代码段 数据段/RO RW ZI

堆栈 BSS段 代码段 数据段/RO RW ZI

时间:2021-04-19 00:42:16

相关推荐

堆栈 BSS段 代码段 数据段/RO RW ZI

嵌入式_堆栈、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文件信息。该实验参见我的另一篇博客:/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,根据架构不同而不同

总结

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。