进程的内存空间布局

进程的内存布局在结构上是有规律的,对于 linux 系统上的进程,其内存空间一般可以粗略地分为以下几大段,从高内存到低内存排列:

1、内核态内存空间,其大小一般比较固定(可以编译时调整),但 32 位系统和 64 位系统的值不一样。

2、用户态的栈,大小不固定,可以用ulimit -s 进行调整,默认一般为 8M,从高地址向低地址增长。

3、mmap区域(内存映射段),既可以从高地址到低地址延伸(所谓 flexible layout),也可以从低到高延伸(所谓 legacy layout),看进程具体情况。

4、brk 区域(堆),紧邻数据段(甚至贴着),从低位向高位伸展,但它的大小主要取决于 mmap 如何增长,一般来说,即使是 32 位的进程以传统方式延伸,也有差不多 1 GB 的空间。

5、数据段,主要是进程里初始化和未初始化(BSS)的全局数据总和,当然还有编译器生成一些辅助数据结构等等),大小取决于具体进程,其位置紧贴着代码段。

6、代码段,主要是进程的指令,包括用户代码和编译器生成的辅助代码,其大小取决于具体程序,但起始位置根据 32 位还是 64 位一般固定(-fPIC, -fPIE等除外)。

以上各段(除了代码段数据段)其起始位置根据系统是否起用 randomize_va_space 一般稍有变化,各段之间因此可能有随机大小的间隔,千言万语不如一幅图(x86-32位下):


猜你喜欢

转载自blog.csdn.net/cztqwan/article/details/80248479