Unix环境高级编程读书笔记(1):c程序进程空间布局

来源:互联网 发布:好听的男英文歌知乎 编辑:程序博客网 时间:2024/06/07 02:12

C程序进程空间布局

Linux进程空间由四部分构成,Text, Global Data, Heap, Stack
如下图所示:

在多线程进程中,会有多个栈,并且共享Text, global data和heap

典型的进程空间布局

  1. Text(正文段)
    就是CPU需要执行的机器指令部分。通常是可以共享的,所以即使频繁执行的程序在存储器中也只需要一个副本,而且该部分常常是只读的。

  2. Global Data(数据段)
    上图中的未初始化的数据与初始化的数据合成为数据段,用来保存程序中的静态变量和全局变量

  3. Stack(栈)
    局部变量以及每次函数调用时需保存的信息都存放与此段中。每次函数调用时,其返回地址以及以及调用者的环境信息(如函数调用前的寄存器信息)都存放在栈中。然后,最后被调用的函数在栈上为其自动和临时变量分配存储空间。

  4. Heap(堆)
    Heap存放动态变量。

当有函数调用发生时,Stack会向下增加一帧,在新的一帧中放置函数的返回地址以及传入函数的参数。位于栈底的帧和全局变量一起,构成了当前的环境。

当程序中使用malloc的时候,heap会向上增加。当stack和heap发生重叠时,就叫栈溢出(stack overflow)。

当程序中调用fork命令后,子进程获得父进程数据空间、堆和栈的副本,共享正文段。

在MacOS中可以使用size命令查看文件的空间布局信息:

huangyus-MacBook:tower walker$ size /sbin/launchd __TEXT  __DATA  __OBJC  others  dec hex258048  24576   0   4295008256  4295290880  10004f000
0 0