程序的内存结构

  以32位CPU为例,可以寻址4G的空间,每个进程都有自己独立的4G逻辑地址内核空间占1G(高地址),用户空间占3G(低地址),不同进程相同的逻辑地址(CPU生成的地址)映射到不同的物理地址(物理内存的地址)。

    程序在存储(还未调入到物理内存)时,由代码段,已初始化数据段和未初始化数据段三部分组成。静态区域:代码段(Text segment),已初始化数据段(Data segment),未初始化数据段(BSS segment);动态区域:堆(Heap),映射区(Memory Mapping segment),栈(Stack);

  代码段:只读存储区-存储字符串常量;文本区-存储程序的机器代码;

  已初始化数据段:存储程序中已经初始化的全局变量和静态变量;

  未初始化数据段:存储程序中未初始化的全局变量和静态变量,以及初始化为0的全局变量和静态变量;未初始化的全局变量和静态变量编译器会将其初始化为0;

  :程序未调用new/malloc之前不存在堆,调用new/malloc时才分配堆;程序运行过程中堆可以动态增长(从低地址向高地址增长);

  映射区:存储动态链接库等文件映射,申请大内存时分配在映射区;

  :存储函数的返回值、返回地址、参数和局部变量等,从高地址向低地址增长;创建进程时,默认的栈空间的最大值为1M。

原文地址:https://www.cnblogs.com/yongjin-hou/p/14372836.html