关于Unix中的bss段和数据段

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

这里是我的问题:bss段是数据段的一部分还是两个完全不同的内存段? 另外,为什么要将全局variables与静态variables分开?

原来的想法仍然存在,尽管在本地符号,小引用,共享库等等上面有一些混淆的层次。

但是,一切仍然基于原来的简单模式,所以值得了解。 这个想法是有三个部分。

  • 。文本
    这有程序代码。
  • 。数据
    这已经初始化数据。
  • .bss段
    这有未初始化的数据。

Bss是特殊的: .bss对象不会在对象文件中占用任何空间,并且可以将所有未被初始化的符号分组在一起,因此可以很容易地立即清零。

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

所以一个静态变量可以是数据或bss取决于它是否被初始化,也可以是全局的。

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

看看这里: http : //en.wikipedia.org/wiki/.bss