【问题标题】:Regarding the bss segment and data segment in Unix关于Unix中的bss段和数据段
【发布时间】:2010-12-26 23:12:48
【问题描述】:

我在我的 unix 教科书中读到 bss 用于存储未初始化的变量(全局声明)。这意味着静态变量是单独存储的,而不是在 bss 中。唯一的其他地方是数据段。

这是我的问题:bss 段是数据段的一部分,还是它们是两个完全不同的内存段集? 还有,为什么要把全局变量和静态变量分开?

【问题讨论】:

    标签: c unix memory


    【解决方案1】:

    最初的想法仍然存在,尽管在它上面对本地符号、小型引用、共享库等进行了混淆处理。

    但一切仍然基于最初的简单模型,因此值得了解。这个想法是有三个部分。

    • .text
      这有程序代码。
    • .data
      这已经初始化了数据。
    • .bss
      这有未初始化的数据。

    Bss 很特别:.bss 对象在对象文件中不占用任何空间,并且通过将所有未专门初始化的符号组合在一起,可以轻松地将它们一次清零。

    静态有几个含义。从某种意义上说,它只是一个符号属性,它告诉链接器它是对象模块的本地对象还是可以与其他同名符号全局链接。它还用于指定存储持续时间,以区分函数内的对象和自动(堆栈分配的)对象。

    因此,静态变量可以在 data 或 bss 中,具体取决于它是否已初始化,全局变量也可以。

    【讨论】:

    • 很好的答案,但你忘记了 .rodata :-)
    • 嘿,还有,我没有提到伟大的 undefined-with-value 技巧。 “公共块”(每个 bss 符号,包括 fortran 公共和单独的 C extern 或全局未初始化对象)可以具有值,即它们的大小。链接器获取最大值并分配 bss 空间,如果仍然未定义(并定义它)但如果 .data 段标签定义了符号,那么它就赢了。我认为这种简单的技术非常有效,可以处理所有已知的语言。当然,它处理了所有常见的问题。
    【解决方案2】:

    bss 传统上是所谓的未初始化变量,但 C 和 Unix 保证它们被初始化为零。 (参见this。)它是数据段的一部分,通常紧跟在程序静态初始化变量空间之后。比 bss 高的内存通常是堆的开头。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-07
      • 2014-02-03
      • 1970-01-01
      • 2012-09-29
      • 2011-05-14
      • 2015-05-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多