深入解析程序内存结构:BSS段、数据段与文本段的作用与重要性

程序本质上由三段组成:BSS段、数据段和文本段。这个概念是当前计算机编程中非常重要的基本概念,在嵌入式系统的设计中也非常重要。它涉及到嵌入式系统执行时的内存大小分配和存储单元占用的空间。

深入解析程序内存结构:BSS段、数据段与文本段的作用与重要性

l BSS段:在采用分段内存管理的架构中。 BSS段一般是指程序中用来存储未初始化的全局变量的内存区域。

BSS是英文Block Started by Symbol的缩写。

BSS 段是静态内存分配。

l 数据段:在采用分段内存管理的架构中,数据段一般是指程序中用于存储初始化的全局变量的内存区域。数据段是静态内存分配。

l 代码段:在采用分段内存管理的架构中,代码段(文本段)一般指用于存储程序执行代码的内存区域。该区域的大小在程序执行前确定,并且该内存区域是只读的。

在代码片段中。它还可能包括一些只读的常量变量,例如字符串常量等。

程序编译后生成的目标文件至少包含这三个部分。这三个段的总体结构图如下所示:

其中.text是代码段,仅供阅读。 .bss 部分包含程序中未初始化的全局变量和静态变量。

数据段由三部分组成:堆、栈和静态数据区。

l 堆:堆用于存储进程执行过程中动态分配的内存段。它的大小不是固定的,可以动态扩大或缩小。当进程调用malloc等函数来分配内存时。新分配的内存动态添加到堆中(堆扩展);当使用free等函数释放内存时,释放的内存将从堆中删除(堆减少)。

l 栈:栈也称为堆栈。它是用户存储程序临时创建的局部变量,也就是说我们的函数括号“{}”中定义的变量(但不包括静态声明的变量。静态意味着变量存储在数据段中)。

否则,当函数被调用时。它的参数也被推送到调用进程的堆栈上。并等待呼叫完成。函数的返回值也存储回堆栈中。

由于堆栈的先进先出特性,堆栈对于保存/恢复调用场景特别方便。从这个意义上来说,我们可以把栈看成是存储和交换临时数据的内存区域。

当程序运行时动态分配空间(C中的malloc函数)时,分配的空间属于堆。它的概念与数据结构中的“堆”概念不同。

堆栈段存储函数内部的变量、参数和返回地址,这些变量、参数和返回地址是在函数调用时自动分配的。访问方法是标准堆栈中的LIFO方法。

(由于这里存储的是函数的局部变量,所以它们的访问方式应该是栈指针加偏移量,否则通过push、pop操作来访问会相当麻烦)

数据段中的静态数据区存放着程序中已经初始化的全局变量、静态变量和常量。

在采用分段内存管理的架构中(如Intel的80x86系统),BSS段(Block Started by Symbol Segment)一般是指用于存储程序中未初始化的全局变量的内存区域。一般情况下,BSS段在初始化时被初始化。该部分将被清零。 BSS 段是静态内存分配。也就是说,在程序开始时将其清零。

例如,C语言等程序编译后,初始化的全局变量保存在.data段中,未初始化的全局变量保存在.bss段中。

文本和数据部分都在可执行文件中(在嵌入式系统中通常固化在映像文件中)。系统是从可执行文件加载的; BSS段不在可执行文件中,由系统初始化。

BSS段只存储变量,不存储值。所以它实际上不需要保存这些变量的图像。执行所需的BSS段大小记录在目标文件中,但BSS段不占用目标文件中的任何空间。

//main.c

整数a = 0; //全局初始化区域

字符*p1; //全局未初始化区域

主要的()

静态 int c =0。 //全局(静态)初始化区域

整数b; //堆

char s[] = "abc"; //堆

字符*p2; //堆

字符 *p3 = "123456"; //“123456\0”在常量区,p3在栈上。

p1 = (char *)malloc(10);

p2 = (char *)malloc(20); //分配的10和20字节的区域都在堆区域。

你可能想看:
« 上一篇
下一篇 »

相关推荐

FreeBasic:强大免费开源的64位basic编译器及应用优势

2025年05月10日

82阅读

脊柱侧弯矫正方法大盘点:运动康复、支具矫正等多种方式

2025年05月09日

87阅读

如何在winForm标题栏去掉标题文字且任务栏图标正常显示

2025年05月09日

86阅读

十一黄金周促销广告词大全,国庆购物狂欢等你来

2025年05月09日

78阅读

关闭快速编辑模式及插入模式,设置控制台指定文字颜色举例

2025年05月09日

63阅读

黄金搭档低糖高钙饮品包装及成分功效全解析,适合人群要知晓

2025年05月09日

91阅读