C程序的空间布局
C程序的空间布局由以下部分组成:
正文段
由CPU执行的机器指令部分。
正文段是可共享的,所以即使频繁运行多个程序(如:文本编辑器、C编译器、Shell等)在存储器中也只需有一个副本。
正文段常常是只读的,以防止程序意外修改了其指令。
初始化数据段
通常成为数据段,它包含了程序中明确地赋初值的变量。
例如:C语言中任何函数之外的声明,
int count = 1;
。未初始化数据段
通常成为bss段(block started by symbol)。来源于早期汇编的一个操作符。
程序开始执行之前,内核将此段中的数据初始化为0或空指针。
例如:C语言中未初始化的数组,
long sum[1000]
;。栈
自动变量,以及每次函数调用时所保存的信息都放在此段中。
比如:函数返回地址、调用者的环境信息、临时变量值都存放在栈中。
通过这种方式,递归函数正常工作,因为每次调用自身时,会使用一个新的栈帧,所以本一次函数调用的变量集不会影响另一次函数调用的变量集。
堆
通常在堆中进行动态存储分配。
下图是这些段的一种典型安排方式。但并不要求实现一定以这种方式作为进程存储空间。
注意:
进程中还有若干其他类型的段,如:包含符号表的段、包含调试信息的段、包含动态共享库连接表的段等,这些部分并不装载到进程执行的程序映像中。
需要存放在磁盘程序文件中的段只有正文段和初始化数据段。
未初始化的数据段不存放在磁盘程序文件中的,其原因是:内核在程序运行开始前会将它们都设置为0。
size
命令可以查看正文段、数据段、bss段的长度。其中dec和hex分别表示以十进制和十六进制表示的3段总长度。例如:
1 2 3
$ size a.out text data bss dec hex filename 3241 752 280 4273 10b1 a.out
支付宝
微信