32位的系统中,内存空间拥有4GB(2的32次方)的寻址能力。大多数的操作系统都会将内存空间 中的一部分挪给内核使用,应用程序无法直接访问这一段内存。
Windows默认情况会将高地址的2GB空间分给内核,而Linux默认会将高地址的1GB空间分配给内核,剩下的空间被称为内存空间。
一般来说,应用程序内存空间会有下面默认区域:
栈:用于维护函数调用的上下文,离开栈函数调用就无法实现通常,局部变量也将不存在。栈通常在用户空间的最高地址处分配,通常有数兆字节大小。
堆:堆是用来容纳应用程序动态分配的内存区域,使用malloc或new分配内存时,得到的内存就来自堆里。堆通常存在于栈的下方(低地址),堆没有固定统一的存储区域,一般比栈大很多,可以有几十至数百兆字节的容量。
可执行文件映像:由装载器在装载时将可执行文件的内存读取或映射到这里。
保留区:保留区并不是一个单一的内存区域,而是对内存中受到保护而禁止访问的内存区域的总称,如:在大多数操作系统中,极小的地址通常都是不允许访问的。
动态链接库映射区:用于映射装载的动态链接库
Linux下一个进程里的内存布局