在进程创建的时候,操作系统会为之分配4G大小的地址空间(32位的CPU的寻址空间是4G)。4G虚拟地址空间,分为两部分:用户空间和内核空间(Linux:3/1; windows:2/2)。以Linux为例,如图,3G的用户空间(User Space)、1G的内核空间。
保留区(128m)的空间是不允许访问的,意在防止操作干扰和页的加载约定。
.text段(指令代码段):存放的是程序指令(函数的入口地址)。
.date段(数据段):程序已初始化的全局变量、静态变量。只读数据:字符串常量,const修饰的变量。
.bss段(数据段):保存未经初始化的全局变量、静态变量以及初始化为0的全局变量、静态变量。
.Heap段(堆区):动态内存开辟区(malloc()/new、free()/delete)。
Memory Mapping Segment(共享库区):堆区和栈区之间的映射空间,用到共享库的时候会在该区域生成库的副本。
.Stack段(栈区):函数栈争、形参、局部变量的开辟。
栈区后面存储命令行形参数和环境变量。
.text段、.Heap段、.Stack段的起始位置不固定,有一定的偏移,为了防止程序的恶意修改、栈的溢出。