一个C程序由下面几个部分组成:
- 正文段。存放CPU执行的机器指令。唯一、只读。
- 初始化数据段(即数据段)。已赋值的全局变量。
- bss段。未初始化的全局变量。程序执行之前,内核将此段中的数据初始化为0或null。
- 栈。连续内存,大小固定(可用ulimit -s命令查看)。
- 堆。链表结构,空间较大。
这几个段在存储器中的布局为:
低地址→正文段(exec从文件读入)→数据段(exec从文件读入)→bss段(由exec初始化为0)→堆(向高地址扩展)→栈(向低地址扩展)→命令行参数和环境变量→高地址
还有一点需要注意,程序文件中只存放正文段和数据段,不存放bss段,内核在启动程序之前将
bss段清零
。使用size命令可以查看程序各段大小(单位:字节):
第四列和第五列分别是四个段的总长度。
参考:
《unix环境高级编程》 P152-P154.