1.5 进程的内存划分方案

在1.4节中,我们说明了为绝大多数程序设计者提供相同内存映射的可行性。本节的主题是讨论进程内存映射的内部组织细节。我们假定程序地址(程序员观察得到的地址)的范围是0~2N,其中N是32或者64。

不同的多任务或多用户操作系统拥有不同的内存映射布局。对于Linux进程的虚拟内存映射来说,其遵循如图1-5所示的映射方案。

无论平台的进程内存划分方案有多么特殊,下面几个内存映射的节(section)都是必须支持的:

● 代码节:该节包含了供CPU执行的机器码指令(.text节)。

● 数据节:该节包含了供CPU操作的数据。通常来说,初始化数据(.data节)、未初始化数据(.bss节)和只读数据(.rdata节)会保存在分离的节中。

● 堆:动态内存分配的区域。

● 栈:为各个函数提供独立的存储空间。

● 最上层部分属于内核区域,特定进程的环境变量就存放在该区域。

Gustavo Duarte撰写了一篇文章来详细讨论该主题,读者可以从下面的网址中找到这篇文章:http://duartes.org/gustavo/blog/post/anatomy-of-a-program-in-memory。

图1-5 Linux进程的内存映射布局