关于Unix中的bss段和数据段

时间:2009-12-15 19:55:38

标签: c unix memory

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

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

2 个答案:

答案 0 :(得分:11)

最初的想法仍然存在,尽管在它上面有一些混淆层用于本地符号,小型引用,共享库等。

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

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

Bss很特殊: .bss 对象不占用目标文件中的任何空间,并且通过将未特别初始化的所有符号分组在一起,可以很容易地将它们一次归零。

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

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

答案 1 :(得分:0)

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