浅析进程地址空间

在linux下,当我们对我们所写好的程序.c文件进行gcc编译过程时,会出现一个a.out可执行文件,这个文件中到底包含什么呢,接下来我们来看一看。
在UNIX下可使用size命令查看可执行文件的段大小信息。如size a.out。
接下来,我进行测试的演示:
这里写图片描述
这个是我写好的测试程序。
首先我们来测试这个程序的段大小信息。
这里写图片描述
我们在这,可以知道,a.out中含有 text(文本段),data(数据段),bss段,
然后,我们对每一个中进行删除操作,观察结果变化。
首先,我删除

int i=15;

得到结果:
这里写图片描述
所以我们可以得出初始化的全局变量是存放在数据段中的。

然后我们依次对另外三个进行测试。
最后可以得出这一张图:

这里写图片描述
BSS段:通常是指用来存放程序中未初始化的全局变量和静态变量的一块内存区域。特点是:可读写的,在程序执行之前BSS段会自动清0。所以,未初始的全局变量在程序执行之前已经成0了。

数据段:通常是指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。

代码段:通常是指用来存放程序执行代码的一块内存区域。代码段这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读, 允许自修改程序。 在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。

可执行文件内存布局:
这里写图片描述

栈:自动变量以及每次函数调用时所需保存的信息都存放在此段中。每次函数调用时,其返回地址、以及调用者的环境信息(例如某些机器寄存器)都存放在栈中。然后,新被调用的函数在栈上为其自动和临时变量分配存储空间。通过以这种方式使用栈,C函数可以递归调用。

堆:通常在堆中进行动态存储分配。一般由程序员分配释放, 若程序员不释放,程序结束时可能由操作系统回收。类似于链表,在内存中的分布不是连续的,它们是不同区域的内存块通过指针链接起来的。一旦某一节点从链中断开,我们要人为的把所断开的节点从内存中释放。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值