映射关系
- bss段:未初始化的全局变量和未初始化的局部静态变量,不占用程序文件的存储空间,程序启动后分配
#include <stdio.h>
int bss_data[1024 * 1024];
int main()
{
return 0;
}
gcc test.c -o bss
du -sh bss
12K bss
- data段:初始化的全局变量和初始化的局部静态变量,占用程序文件的存储空间,也占用运行时的内存空间
#include <stdio.h>
int bss_data[1024 * 1024] = {1};
int main()
{
return 0;
}
gcc test.c -o data
du -sh data
4.1M data
rodata段(read only data)
常量数据段,不是所有的常量都放在常量数据段,占用程序文件的存储空间,也占用内存空间
比如字符串常量,全局const变量text 段
存放代码和部分常量,占用程序文件的存储空间,也占用内存空间stack段
临时变量、函数参数,不占用程序文件的存储空间,运行时分配内存heap段
malloc 和new,不占用程序文件的存储空间,运行时申请内存
总结:
- 可执行二进制程序 = text + bss(0) + data + rodata
- 正在运行的C程序 = text + bss + data + rodata + stack + heap
当程序被加载到内存单元时,则需要另外两个域:堆域和栈域,在将应用程序加载到内存空间执行时,操作系统负责代码段、数据段和BSS段的加载,并将在内存中为这些段分配空间。栈亦由操作系统分配和管理,而不需要程序员显示地管理;堆段由程序员自己管理,即显示地申请和释放空间。
注意:
bss段(未手动初始化的数据)并不给该段的数据分配空间. 程序运行后,系统分配内存空间并由系统初始化,默认内存空间的值都为0. section table中保存了BSS段(未初始化的全局变量和未初始化的局部静态变量)内存空间大小总和,所以程序运行后,系统知道该分配多少内存给BSS段。