C++内存管理之Linux进程的内存布局

C++开发中会遇到各种内存问题,进程在内存中布局是必备的知识。
如下图所示,这是最经典的内存布局图。
在这里插入图片描述

  1. Linux中的虚拟地址空间
    系统中运行这各种不同的进程,但是内存就那么多,他们是怎么共享内存地址空间的呢?难道不会发生内存的践踏和争夺吗?如果系统中只运行一个进程,那么就不会发生这种情况了。虚拟内存技术就解决了这个问题,它可以使得每个进程独占内存空间。当然所有进程还是共享物理内存的,操作系统会根据进程的运行情况进行地址转换,与内存页面切换,这个会单独一篇总结。
    每个进程都会有独立的内存空间,布局如上图。
  2. 代码段(code. text.)
    这部分内存是只读的,存储程序代码指令和一些只读的常数变量。比如下面的常量字符串就存放在这个区域。
char* p = "nice to meet you";
  1. 已初始化数据段data, 这个存放全局变量和静态变量,如下g_number和a.
int g_number = 1;
int func()
{
    static int a = 2;
    return a;
}
  1. bss段(Block Started by Symbol),这部分用来存放未初始化的数据,程序载入时,系统会将此部分数据清零。
int g_number;

到这里我们总结一下,代码段和已初始化数据段的内容时存在可执行文件中的。也就是说,这些字符串常量或者全局变量,是可以dump出来的。linux和Windows都提供了这样的工具,非常简单。所以如果是安全性要求比较高的数据,不要存放在这两个区域,而且最好进行加壳保护打乱汇编指令。 可执行文件中的其他信息,可以通过objdump、 readelf或者其他反汇编工具(ollydbg)等查看。

当程序运行时,会多了下面两个区域,这是要掌握的重点,这部分知识在调试程序时尤为重要。
4. 堆区heap,当程序运行时,程序动态申请的内存。由低地址向高地址增长,采用链式存储,中间可能会产生碎片。效率相对比栈低。
5. 栈区stack,由系统自动释放,存放函数的参数值、局部变量等。由高地址向低地址增长,调用一个函数就会开辟栈空间,反之则释放,遵循先进后出,不会产生碎片。

在Windows上VS里面栈和堆的空间都可以自己设定。
在Linux里,可以通过ulimit -s 设定栈大小。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值