【嵌入式基础】内存结构(text data bss及堆栈)

【嵌入式基础】内存结构(text data bss及堆栈)

前言

内存分为:代码段(text)、数据段(data)、bss段、堆、栈段(head stack)

各段的作用

代码段(text):通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读, 某些架构也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。
① 存放可执行程序的指令,存储态和运行态都有。
② 内存分配为静态。

bss段:指那些没有初始化的和初始化为0的全局变量和静态变量,bss类型的全局变量只占运行时的内存空间,而不占文件空间。 操作系统,在加载程序时,会把所有的bss全局变量全部清零。
① 存放未初始化(未初始化或者初始化为0的全局变量和静态局部变量)的数据,存储态和运行态都有
② 内存分配为静态。

数据段(data):指那些初始化为非零、非const的全局变量或静态变量。 data类型的全局变量是即占文件空间,又占用运行时内存空间的。
① 存放已初始化(非零初始化的全局变量和静态局部变量)的数据,存储态和运行态都有
② 内存分配为静态。

只读数据段(rodata):存放常量,字符常量,const常量
但常量不一定就放在rodata里,有的立即数直接编码在指令里,存放在代码段(.text)中。
在有的嵌入式系统中,rodata放在ROM(如norflash)里,运行时直接读取ROM内存,无需要加载到RAM内存中。
在嵌入式linux系统中,通过一种叫作XIP(就地执行)的技术,也可以直接读取,而无需要加载到RAM内存中。
由于rodata在只读的内存页面(page)中,是受保护的,任何试图对它的修改都会被及时发现,这可以帮助提高程序的稳定性。

堆:堆是先进先出(FIFO)数据结构。堆的地址空间是向上增加,即当堆上保存的数据越多,堆的地址越高。动态内存分配。
① 动态分配内存,需要手动申请,手动释放,适合大块内存。如频繁的分配较小的内存,容易导致内存碎片化。运行态才有。
② 内存分配为动态。

栈:栈保存局部变量(不包括 static 修饰的局部变量),参数以及返回值。是一种后进先出(LIFO)的数据结构。在调用函数或过程后,系统会清除栈上保存的局部变量、函数调用信息及其他信息。栈的另外一个重要特征是,它的地址空间向下减少,即当栈上保存的数据越多,栈的地址越低。静态内存分配。
① 存放函数局部变量和参数以及返回值,函数返回后,由操作系统立即回收。栈空间不大,使用不当容易栈溢出。运行态才有。
② 内存分配为动态。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值