C程序进程空间布局
Linux进程空间由四部分构成,Text, Global Data, Heap, Stack
如下图所示:
在多线程进程中,会有多个栈,并且共享Text, global data和heap
Text(正文段)
就是CPU需要执行的机器指令部分。通常是可以共享的,所以即使频繁执行的程序在存储器中也只需要一个副本,而且该部分常常是只读的。Global Data(数据段)
上图中的未初始化的数据与初始化的数据合成为数据段,用来保存程序中的静态变量和全局变量Stack(栈)
局部变量以及每次函数调用时需保存的信息都存放与此段中。每次函数调用时,其返回地址以及以及调用者的环境信息(如函数调用前的寄存器信息)都存放在栈中。然后,最后被调用的函数在栈上为其自动和临时变量分配存储空间。Heap(堆)
Heap存放动态变量。
当有函数调用发生时,Stack会向下增加一帧,在新的一帧中放置函数的返回地址以及传入函数的参数。位于栈底的帧和全局变量一起,构成了当前的环境。
当程序中使用malloc的时候,heap会向上增加。当stack和heap发生重叠时,就叫栈溢出(stack overflow)。
当程序中调用fork命令后,子进程获得父进程数据空间、堆和栈的副本,共享正文段。
在MacOS中可以使用size命令查看文件的空间布局信息:
huangyus-MacBook:tower walker$ size /sbin/launchd
__TEXT __DATA __OBJC others dec hex
258048 24576 0 4295008256 4295290880 10004f000