以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。