7.6 进程环境_C程序的存储空间布局

来源:互联网 发布:黑五好价 mac官网全称 编辑:程序博客网 时间:2024/06/05 18:53

      C程序一直由下面几部分组成:

  • 正文段。这是由CPU执行的机器指令部分。通常,正文段是可共享的。另外,正文段常常是只读的,以防程序由于意外而修改其自身的指令。
  • 初始化数据段。通常将此段成为数据段,它包含了程序中需明确地赋初值的变量。例如,出现在任何函数之外的C声明:        

          int maxcount = 99;

  • 非初始化数据段。通常将此段称为bss(block started by symbol--由符号开始的块)段。在程序开始执行之前,内核将此段中的数据初始化为0或空指针。例如,出现在任何函数之外的C声明:                                                                                        

          long sum[1000];

    • 栈。自动变量以及每次函数调用时所需保存的信息都存放在此段中。每次调用函数时,其返回地址以及调用者的环境信息(例如某些机器寄存器的值)都存放在栈中。然后,最近被调用的函数在栈上为其自动和临时变量分配存储空间。一个函数调用实例中的变量集不会影响另一个函数调用实例中的变量。
    • 堆。通常在堆中进行动态存储分配。由于历史上形成的惯例,堆位于非初始化数据段和栈之间。

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

     

     

    图7.3 典型的存储器安排

     

          从上图还可注意到,未初始化数据段的内容并不存放在磁盘上的程序文件中。其原因是,内核在程序开始运行前将它们都设置为0。需要存放在程序文件中的段只有正文段和初始化数据段。