虚拟地址空间中包含了若干区域。其分布方式是特定于体系结构的,但所有方法都有下列共同成分。
1)当前运行的二进制代码。该代码通常称之为text,所处的虚拟内存区域称之为text段。
2)程序使用的动态库的代码
3)用于保存全局变量和动态产生的数据的堆(应该还包括静态变量)
4)用于保存局部变量和实现函数/过程调用的栈。
5)环境变量和命令行参数的段
6)将文件内容映射到虚拟地址空间中的内存映射。
1)当前运行的二进制代码。该代码通常称之为text,所处的虚拟内存区域称之为text段。
2)程序使用的动态库的代码
3)用于保存全局变量和动态产生的数据的堆(应该还包括静态变量)
4)用于保存局部变量和实现函数/过程调用的栈。
5)环境变量和命令行参数的段
6)将文件内容映射到虚拟地址空间中的内存映射。
下图说明了大多数体系结构的虚拟地址地址空间中的布局情况。
text段如何映射到虚拟地址空间中由ELF标准确定。每个体系结构都指定了一个特定的起始地址:IA-32系统起始于0x08048000,在text段的起始地址与最低的可用地址之间有大约128M的间距,用于捕获NULL指针。其他体系结构也有类似的缺口:UltraSparc计算机使用0x100000000作为text段的起始点,而AMD64使用0x0000000000400000。堆紧接着text段开始,向上增长。
栈起始于STACK_TOP,如果设置了PF_RANDOMIZE,则起始点会减少一个小的随机值。每个体系结构都必须定义STACK_TOP,大多数都设置为TASK_SIZE,即用户地址空间中最高的可用地址。进程的参数列表和环境变量都是栈的初始数据。
用于内存映射的区域起始于mm_struct->mmap_base,通常设置为TASK_UNMAPPED_BASE,每个体系结构都需要定义。几乎所有的情况下,其值都是TASK_SIZE/3。要注意,