从历史上讲,C程序一直由下面几部分组成:
int maxcount = 99;
使此变量带有其初值存放在初始化数据段中。
long sum[1000];
使此变量存放在非初始化数据段中。
图7-3 典型的存储器安排
图7-3显示了这些段的一种典型安排方式(但并不要求非如此不可)。这是程序的逻辑布局。对于x86处理器上的linux,正文段从0x08048000单元开始,栈底则在0xC0000000之下开始(在这种特定结构中,栈从高地址向低地址方向增长。但是栈并不一定要向低地址方向扩充,这是针对这种特定结构而言是向低地址方向扩充)。堆顶和栈底之间未用的虚地址空间很大。
a.out中还有若干其他类型的段,例如,包含符号表的段、包含调试信息的段以及包含动态共享库链接表的段等等。这些部分并不装载到进程执行的程序映像中。
从图7-3还可注意到,未初始化数据段的内容并不存放在磁盘上的程序文件中。其原因是,内核在程序开始运行前将它们都设置为0。需要存放在程序文件中的段只有正文段和初始化数据段。
size(1)命令报告正文段、数据段和bss段的长度(单位:字节)。例如:
[root@localhost apue]# size /usr/bin/cc /bin/sh text data bss dec hex filename 192895 2024 2068 196987 3017b /usr/bin/cc 695049 19356 19148 733553 b3171 /bin/sh
第4列和第5列分别以十进制和十六进制表示的三个段的总长度。
本篇博文内容摘自《UNIX环境高级编程》(第二版),仅作个人学习记录所用。关于本书可参考:http://www.apuebook.com/。
新闻热点
疑难解答