Text、Data、BSS、Heap、Stack

本文详细介绍了程序中的.text、.data、.bss和.constdata等不同段的作用及其存储特性,并对比了栈和堆的区别。此外,还解释了bss与data段之间的联系与区别。

 .text段是代码段。它用来放程序代码(code)。它通常是只读的(程序代码,编译好了就确定了,不可能改来改去的嘛)。

.data段是数据段。它用来存放初始化了的(initailized)全局变量(global)和初始化了的静态变量(static)。它是可读可写的。

.bss段是全局变量数据段。它用来存放未初始化的(uninitailized)全局变量(global)和未初始化的静态变量(static)。它也是可读可写的。bss是英文Block Started by Symbol的缩写。之所以把bssdata分开来,是因为系统会为这些bss段的变量的初值清零。

.constdata段是常量数据段。它用来存放常量(const)。它也是只读的。

源程序中使用malloc分配的内存就是bss这一块,它的大小不是根据data的大小确定的,主要是由程序中同时分配内存最大值所确定的,不过如果超出了范围,也就是分配失败,可以等空间释放之后再分配。

以上这些段,用户可以非常灵活的定义其首地址和大小。但对大部分用户来说,程序代码区在ROMFLASH中,可读写区域在SRAMDRAM中。考虑一下自己程序规模,函数调用规模,内存使用大小,然后,参照一个连接定位文件,稍加修改就可以了

栈(stack)就是通常我们所说的堆栈。它用来保存函数的局部变量和参数。其操作方式类似于数据结构中的栈,是一种后进先出Last In First OutLIFO)的数据结构。这意味着最后放到栈上的数据,将会是第一个从栈上移走的数据,对于哪些暂时存储的信息,和不需要长时间保存的信息来说,LIFO这种数据结构非常理想。在调用函数或过程后,系统通常会清除栈上保存的局部变量、函数调用信息及其它信息。栈的顶部通常在可读写的RAM区的最后,其地址空间通常向下减少,即当栈上保存的数据越多,栈的地址就越小。

堆(heap)就是通常我们说的动态内存分配。它用来管理动态内存的。其操作方式跟数据结构中的堆,是不同的。


ARM的集成开发环境中,

1、只读的代码段称为Code段,即上述的.text段。

2、只读的常量数据段,被称作RO Data段,即上述的.constdata段。

以上两个段统称为RO段(Read Only),放在ROMFLASH等非易失性器件中。

3、可读可写的初始化了的全局变量和静态变量段,被称作RW Data段(ReadWrite),即上述的.bss段。

4、可读可写的未初始化的全局变量和静态变量段,被称作ZI Data段(Zero Init),即上述的.data段。因为这个段里的变量要被初始化为零,所以叫ZI段。

以上两个段统称为RW段,而在运行时,它必须重新装载到可读可写的RAM中。

bss和data的区别:
    全局的未初始化变量存在于.bss段中,具体体现为一个占位符;
    全局的已初始化变量存于.data段中;

    .bss是不占用.exe文件空间的,其内容由操作系统初始化(清零);
    而.data却需要占用,其内容由程序初始化。

    若这样定义一个全局变量:int g_inBss[9] ;
    则它在.bss段,这里占用占位符的空间。

    若这样定义一个全局变量:int g_inData[9] ={1,2,3,4,5,6,7,8,9};
    则它在.data段,程序占用数组全部大小的空间。

bss和data的联系:
    都在rw区域;
    bss段在运行起来成为进程之后,占的空间大小和data就相同了。


堆(heap)上数组:一般自己申请,C用malloc,C++用new。一般的可用空间比较大。

栈(stack)上数组:一般系统自动分配,直接定义所开的数组的大小,最大一般为1M或2M。


参考文献:http://www.cnblogs.com/mylinux/p/4135088.html

<think>我们正在处理关于S32DS(S32 Design Studio)中显示芯片使用空间的各个字段含义的问题。具体字段包括:text, data, bss, dec, hex, filename。 这些字段通常在编译链接后由工具(如GCC)生成的map文件或构建输出中显示,用于指示不同内存区域的使用情况。以下是每个字段的详细解释: 1. **text**:也称为代码段(code segment),存放程序的可执行代码(指令)和常量数据(如字符串常量)。该段通常是只读的,因此可以存储在ROM或Flash中。 2. **data**:数据段(data segment),存放已初始化的全局变量和静态变量(包括全局静态变量和局部静态变量)。这些变量在程序启动时就被初始化,并且通常位于RAM中,但初始值需要从非易失性存储器(如Flash)中复制。因此,它占用ROM(存储初始值)和RAM(存储变量本身)两种空间。 3. **bss**:Block Started by Symbol(由符号开始的块)。该段存放未初始化的全局变量和静态变量,或者被初始化为0的全局变量和静态变量。在程序启动时,这些变量会被初始化为0(或者由启动代码进行清零)。bss段只占用RAM空间,且在可执行文件中不占用实际存储空间(因为不需要存储初始值,只需要记录需要清零的内存区域大小)。 4. **dec**:十进制总和,表示textdatabss三个段的总大小(以字节为单位)。即:dec = text + data + bss。 5. **hex**:十六进制总和,表示textdatabss三个段的总大小(以十六进制表示)。 6. **filename**:生成该内存使用信息的文件名(通常是可执行文件或目标文件的名字)。 注意:在嵌入式系统中,内存布局通常由链接脚本控制。这些内存区域对应到具体的物理内存地址(如Flash和RAM)上。因此,在分析内存使用时,需要关注: - text段和data段中的初始值会占用Flash空间(因为需要存储这些常量或初始值)。 - data段和bss段占用RAM空间(程序运行时需要读写这些变量)。 举例说明: 假设一个程序的输出如下: ``` text data bss dec hex filename 1024 64 32 1120 460 program.elf ``` - 代码段(text)为1024字节,存储在Flash中。 - 数据段(data)为64字节,这64字节的初始值存储在Flash中,同时程序运行时需要64字节的RAM来存放这些变量(初始值在启动时从Flash复制到RAM)。 - bss段为32字节,在RAM中分配,启动时清零。 - 总大小(dec)为1024+64+32=1120字节(十六进制为460)。 - 该可执行文件名为program.elf。 因此,该程序需要: - Flash空间:text(1024字节)+ data(64字节)= 1088字节(用于存储代码和已初始化变量的初始值)。 - RAM空间:data(64字节)+ bss(32字节)= 96字节(用于存储运行时变量)。 在S32DS中,这些信息通常在构建输出(Build Output)窗口或map文件中可以查看。理解这些字段有助于进行内存优化,特别是对于资源受限的嵌入式系统。 §§相关问题§§ 1. 在S32DS中如何查看详细的内存映射(map)文件? 2. 如何优化嵌入式系统中的内存使用(特别是减少text/data/bss的大小)? 3. 链接脚本(linker script)在内存分配中起什么作用? 4. 什么是堆(heap)和栈(stack)?它们是否包含在上述统计中?</think>### S32DS芯片使用空间字段详解 在S32 Design Studio编译输出中,各字段含义如下(基于ARM工具链标准): 1. **text段** 存放程序代码(指令)和只读常量(如字符串常量)。 - 特点:占用Flash空间,执行时不加载到RAM - 示例:函数代码、`const`全局变量 $$ \text{Flash占用} = \text{text} + \text{data初始值} $$ 2. **data段** 存放已初始化的全局变量和静态变量。 - 特点:占用双空间 - 初始值存储在Flash中 - 运行时占用RAM空间 $$ \text{RAM占用} = \text{data} + \text{bss} $$ 3. **bss段** 存放未初始化或零初始化的全局/静态变量。 - 特点:仅占用RAM空间 - 启动时由启动代码清零 - 示例:`int global_var;`(未初始化) 4. **dec字段** 程序总内存占用的十进制表示: $$ \text{dec} = \text{text} + \text{data} + \text{bss} $$ > 注意:此值包含Flash和RAM占用总和,但不代表实际物理需求[^1]。 5. **hex字段** dec值的十六进制表示,用于地址计算: $$ \text{hex} = \text{0x} + [\text{dec的十六进制}] $$ 6. **filename** 对应的目标文件名(如`.o`或`.elf`文件)。 ### 内存映射示例 假设输出: ``` text data bss dec hex filename 2048 256 512 2816 0xB00 main.o ``` - **Flash需求**:text(2048) + data初始值(256) = 2304字节 - **RAM需求**:data(256) + bss(512) = 768字节 - **dec**:2048+256+512=2816字节 - **hex**:2816 = 0xB00 ### 嵌入式系统注意事项 1. data段初始值在启动时从Flash复制到RAM 2. bss段在启动时由启动代码清零 3. 实际工程需额外预留: - 栈空间(Stack) - 堆空间(Heap) - 中断保留区 4. 通过`.map`文件可查看详细分段地址
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值