程序在内存中的分布
大纲
对于x86架构下的Linux程序,在被载入内存中会展开成如下情况:
1、对于x86 架构的系统来说,器虚拟空间为4GB.
2、高位的1GB为内核空间。
3、低位的3GB由Text segment(ELF)、Data segment、Bss segment、Heap、Memory mapping Segment、stack。
4、Memory mapping Segment存放Linux的动态链接库
5、对于stack来说,其最大值为8MB。
.bss
1、作用:
bss段用来存放没有被初始化和已经被初始化为0的全局变量
2、例子
3、编译链接
1 | sudo gcc -g bss.c -o bss |
4、查看
1 | objdump -h bss | grep bss |
.data
1、作用:
data段用来存放已经被初始化为非0的全局变量
2、例子
3、编译链接
1 | gcc -g data.c -o data |
4、查看
1 | objdump -h data | grep \\.data |
.rodata
作用:
rodata段用来存放常量数据、被编译器自动存放来的字符串和加const
关键字的常量数据。
.text
作用:
text段用来存放代码和部分整数常量,该段是可执行的。
stack
作用:
1、stack存放函数的临时变量、局部变量、函数参数和返回值
2、由编译器自动分配和释放。
heap
1、作用:
heap用来动态分配内存,由程序员控制,交由程序自身决定开辟和释放。
malloc&free
calloc&realloc
2、例子
malloc&free
3、编译链接
1 | sudo gcc heap.c -o heap |
4、查看
5、其他方式
1)calloc()函数
1 | void *calloc(size_t number,size_t size); |
number表示要分配元素的个数、size表示每个元素的大小、分配的内存空间是numbersize、返回值为void类型的指针,指向分配号的内存首地址。
2)realloc()函数
realloc()函数用来重新分配正在使用的一块内存大小。
1 | void *realloc(void *ptr,size_t size); |