在32位操作系统中,内存空间拥有4GB的寻址能力。操作系统会把高地址的空间分配给内核,称为内核空间。
(1)内核空间:默认情况下,Windows将高地址的2GB空间分配给内核,Linux将高地址的1GB空间分配给内核。剩下的2GB或3GB的内存空间称为用户空间。
在用户空间里,有许多地址区间有特殊的地位,一般来讲,应用程序使用的内存空间里有如下”默认”的区域。
(2)栈:用于维护函数调用的上下文。栈通常在用户空间的最高地址处分配,通常有数兆字节的大小。
(3)动态链接库映射区:用于映射装载的动态链接库,在linux中,如果可执行文件依赖于其他共享库,系统将在0xbfxxxxxx附近分配地址(kernel > 2.6) ,并将共享库载入到该空间。[kernel = 2.4x,从0x40000000开始分配]
(4)堆:用来容纳应用程序动态分配的内存区域,malloc或new分配内存时,得到的内存来自堆里。堆通常存在于栈的下方(低地址方向),可以有几十或数百兆字节。
(5)可执行文件映像:存储着可执行文件在内存里的映像,由装载器在装载时将可执行文件的内存读取或映射到这里。包括read/write sections和readonly sections。
(6)保留区:对内存中受到保护而禁止访问的内存区域的总称。
栈向低地址增长,堆向高地址增长。当栈或堆现有的大小不够用时,它将按照图中的增长方向扩大自身的尺寸,直到预留的空间被用完为止。
Q:32位系统一个进程最多申请多大堆
A:2.6版的linux,malloc的最大空间申请数应该在2.9G左右。其中可执行文件占去一部分,0x08048000之前的地址占去一部分,栈占去一部分,共享库占去一部分。
版权声明:本文为u010318270原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。