每一个进程都有自己的一个进程堆栈空间。在Linux界面执行一个执行码时,Shell进程会fork一个子进程,再调用exec系统调用在子进程中执行该执行码。
exec
系统调用执行新程序时会把命令行参数和环境变量表传递给main
函数,它们在整个进程堆栈空间中的位置如下图12-7所示。
图12-7 进程堆栈空间图
下面是对图12-7进程堆栈空间各段的具体说明:
① 代码段(文本段):保存程序的执行码。在进程并发时,代码段是共享的且只读的,在存储器中只需有一个副本。
② 数据段:此段又称为初始化数据段,它包含了程序中已初始化的全局变量、全局静态变量、局部静态变量。
例如,函数外定义的变量并赋值:int count=30 ;
此变量count存放在数据段中。
③ bss段:通常此段又称为未初始化数据段,它包含了程序中未初始化的全局变量、全局静态变量、局部静态变量,程序执行前操作系统将此段初始化为0。
例如,函数外定义的变量但没有赋值:long sum[1000] ;
此变量存放在bss段中。
④ 栈:程序执行前静态分配的内存空间,栈的大小可在编译时指定,Linux环境下默认为8M。栈段是存放程序执行时局部变量、函数调用信息、中断现场保留信息的空间。程序执行时,CPU堆栈段指针会在栈顶根据执行情况进行上下移动。
⑤ 堆:程序执行时,按照程序需要动态分配的内存空间。malloc、calloc、realloc函数分配的空间都在堆上分配。