C程序的空间布局

C程序的空间布局由以下部分组成:

  1. 正文段

    由CPU执行的机器指令部分。

    正文段是可共享的,所以即使频繁运行多个程序(如:文本编辑器、C编译器、Shell等)在存储器中也只需有一个副本。

    正文段常常是只读的,以防止程序意外修改了其指令。

  2. 初始化数据段

    通常成为数据段,它包含了程序中明确地赋初值的变量。

    例如:C语言中任何函数之外的声明,int count = 1;

  3. 未初始化数据段

    通常成为bss段(block started by symbol)。来源于早期汇编的一个操作符。

    程序开始执行之前,内核将此段中的数据初始化为0或空指针。

    例如:C语言中未初始化的数组,long sum[1000];。

  4. 自动变量,以及每次函数调用时所保存的信息都放在此段中。

    比如:函数返回地址、调用者的环境信息、临时变量值都存放在栈中。

    通过这种方式,递归函数正常工作,因为每次调用自身时,会使用一个新的栈帧,所以本一次函数调用的变量集不会影响另一次函数调用的变量集。

  5. 通常在堆中进行动态存储分配。

下图是这些段的一种典型安排方式。但并不要求实现一定以这种方式作为进程存储空间。

/image/image_qOUEwjHirM.png

注意

  1. 进程中还有若干其他类型的段,如:包含符号表的段、包含调试信息的段、包含动态共享库连接表的段等,这些部分并不装载到进程执行的程序映像中。

  2. 需要存放在磁盘程序文件中的段只有正文段和初始化数据段。

    未初始化的数据段不存放在磁盘程序文件中的,其原因是:内核在程序运行开始前会将它们都设置为0。

  3. size 命令可以查看正文段、数据段、bss段的长度。其中dec和hex分别表示以十进制和十六进制表示的3段总长度。

    例如:

    1
    2
    3
    
    $ size a.out 
    text     data      bss      dec      hex  filename
    3241      752      280     4273     10b1  a.out
WindSun 支付宝支付宝
WindSun 微信微信
0%