代码段
代码段又称为指令段,是CUP执行的指令部分
代码段通常是只读的,但也有特殊情况。由于代码段不可改的性质使得它可以供多个程序共享使用
当我们试图修改代码段的信息时,就会产生段错误(Segmentation fault)。
对于一些简单的常量,比如整型,随着指令一起存储。
初始化数据段(.data)
程序中明确给定初值的全局变量和静态变量
初始化数据段在编译的时候就明确了该段的大小,在程序运行的时候该段的大小不会发生改变
非初始化数据段(.bss)
程序中没有明确给定初值的全局变量和静态变量
这个段的内容往往不会保存在外存上,但是会标记未初始化变量大小、属性等信息的开销。程序开始运行时,内核一般会将这些变量初始化为0或者NULL。
通过实验可以看出.bbs段和.data段的大小为0。
有趣的是当对全局或静态变量赋值为0或者NULL时,编译器会做和未赋值一样的操作
栈
所有的函数内声明的变量及函数调用时所需要保存的信息(返回地址,函数调用前各个寄存器的值等)
栈内的变量的作用域往往只在函数内,其生命期是随着函数调用的结束而结束,在写C语言时要注意不要将一个指向局部变量的指针作为函数的返回值返回。
堆
用户申请的内存空间
.rodata段
复杂常量,比如字面量
其存储的首地址转换成一个简单变量随着指令存储
X86体系结构下这些段的经典安排方式(在虚拟存储器上)