一般我们自己编写的程序都储存在用户内存空间中,应用程序一般的内存空间都有如下的几个区域

Untitled

内核空间 Kernel Space

内核总是驻留在内存中,是操作系统的一部分。内核空间就是为内核保留的,不允许应用程序读写这个区域的内容或直接调用内核代码定义的函数。

栈 Stack

栈用于维护函数调用的上下文,离开了栈,函数调用就无法实现,栈通常在用户空间的最高地址处分配,通常有数兆字节的大小。

动态链接库映射区 Dynamic libraries

存储着可执行文件在内存里的映像,由装载器在装载时将可执行文件的内存读取或映射到这里。

堆 heap

堆是用来容纳应用程序动态分配的内存区域,当程序使用 malloc 或者 new 分配内存的时候,得到的内存会来自堆里。堆通常存在栈的下方(低地址方向),在某些时候,堆也可能没有固定统一的存储区域。堆一般比栈大很多,可以有几十至数百兆字节的容量。

保留区 unused

保留区并不是一个单一的内存区域,而是对内存中受到保护而禁止访问的内存区域的总称:例如大多数操作系统中,极小的地址通常都是不允许访问的,如 NULL,C 语言将无效指针赋值为 0 也是这个考虑。

初始化过的数据 BSS

未初始化数据是在程序中声明,但是没有初始化的变量,这些变量在程序运行之前不需要占用存储器的空间。Block Started by Symbol,BSS段的变量只有名称和大小却没有值

未初始化过的数据 Data

在程序运行初未对变量进行初始化的数据

程序段 Text

程序代码在内存中的映射,存放函数体的二进制代码,通常都是只读的。

虚拟内存到物理内存