在windows下4G 地址空间中低2G,0x00000000-0x7FFFFFFF 是用户地址空间,4G地址空间中高2G,0x80000000-0xFFFFFFFF 是 系统地址空间。访问 系统地址空间需要程序有ring0的权限。而Linux对4G空间的划分不同与windows。linux将最高的1G 字节(从虚拟地址0xC0000000 到0xFFFFFFFF),供内核使用,称为“内核空间”。而将较低的3G 字节(从虚拟地址0x00000000 到0xBFFFFFFF),供各个进程使用,称为“用户空间”。
在Linux系统下,0xC00000000-0XFFFFFFFF为系统空间,为所有的系统进程所共享,0X00000000-0XC0000000为用户空间。
今天讲的是Linux下的虚拟地址空间。
1、保留区:是用户不可访问的128M地址空间。
例如:int* p = NULL; 后是不可以再对p进行使用,因为p的地址为 NULL ,不可访问
2、.text段:即代码段,存放的是一些指令
3、.data 和.bss都是数据段:其中.data存放的是已初始化且初始化不为零的数据;而.bss是未初始化或初始化为零的数据
用两个段来存放数据是为了节省空间
4、堆区:特点是由用户管理,先进后出,用malloc、ralloc、calloc动态分配内存使用堆,从低地址向高地址增长
5、共享库:加载共享库和使用mmap共享内存
6、栈区:特点是由系统管理,先进后出,里面放了局部变量、函数形参、自动变量,从高地址向低地址增长