ELF存储空间到内存的映射关系
2017-11-18 21:57
239 查看
映射关系
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段。相关文章推荐
- 使用windbg观察IA-32处理器启用PAE后内存分页映射关系
- Linux下自动化监控内存、存储空间!
- Linux 内核空间地址映射 高端内存 总结
- Linux下自动化监控内存、存储空间!
- Linux下自动化监控内存、存储空间!
- 【C语言】【unix c】使用mmap将文件映射到进程的虚拟地址空间,然后对内存的操作直接反应到文件中
- 内存映射-IO空间-ioremap-iounremap
- 二维数组在内存中的存储方式和下标与行列的关系
- 优化iphone存储空间,以及优化iphone内存。
- 进程的页表和页目录存储在内核空间还是用户空间?低端内存还是高端内存
- C程序存储空间布局(一)——各数据段的内存位置
- Linux下自动化监控内存、存储空间!
- 静态存储区、堆、栈的内存空间分配——合理设立对照组与发散思维
- 光脚丫学LINQ(022):在关系设计器中创建映射到存储过程的函数
- C程序存储空间布局——各数据段的内存位置
- Android 漫游之路------将文件保存到内存、SD以及获取手机内部存储与外部存储空间的大小
- 关于Windows编程中进程虚拟地址空间/虚拟内存及内存映射方面的资料
- 《C++中类对象的内存布局和占用空间》《C++ 类里面,函数占用存储空间问题 》
- Linux下自动化监控内存、存储空间!
- Linux内核空间到用户空间的共享内存映射