C进程的Memory Layout&linux进程的地址空间&函数调用过程
参考资料为unix高级环境编程和c专家编程
参考博客:http://blog.****.net/duyiwuer2009/article/details/7994091 Linux进程地址空间 && 进程内存布局 栈帧是什么
https://www.zhihu.com/question/22444939(函数调用过程中栈到底是怎么压入和弹出)
linux默认将4G的虚拟内存的前1G分配给内核——映射到的物理内存是被所有进程共享的,后3G分配给进程(这是在32位系统下),windows默认为2G+2G的划分。
程序的内存布局——函数调用栈的那点事
典型的c进程的内存布局为:text段,初始化的数据段,未初始化的数据段(bbs段),堆区,栈区
text段:存放程序的执行指令,代码区是只读的,有执行权限
初始化的数据段:存放已经初始化的全局变量或静态变量或字符串常量
BBS段:存放全局的未初始化的变量
堆区:由malloc申请分配的内存,堆在分配过程中可能会变得零零碎碎,如下图所示:
考虑下SGI的两级内存配置,第一级申请空间大于128byte,才会使用malloc,小于就会使用内存池。
注意栈与堆的区别:http://blog.****.net/yusiguyuan/article/details/45155035
栈区:存放局部变量,函数调用需要保存的信息
上图来自于APUE 2th
图来自c专家编程