全局变量是如何存储的?

时间:2010-11-03 01:46:43

标签: c++ c assembly

AFAIK,有两种类型的全局变量,已初始化未初始化。它们是如何存储的?它们都存储在可执行文件中吗?我可以想到初始化的全局变量的初始值存储在可执行文件中。但是对于未初始化的人需要存储什么?

我目前的理解是这样的:

可执行文件被组织为多个部分,例如.text,.data和.bss。代码存储在.text部分中,初始化的全局或静态数据存储在.data部分中,未初始化的全局或静态数据存储在.bss部分中。

感谢您抽出时间查看我的问题。

更新1 - 2010年11月3日上午9:56

我在这里找到了一个很好的参考:

Segments in Assembly Language Source - Building the text and data segments with .text, .data, and .bss directives

更新2 - 2010年11月3日上午10:09

@迈克尔

  1. 我在汇编代码中定义了一个100字节的未初始化数据区域,这个100字节没有存储在我的可执行文件中,因为它没有初始化。

  2. 谁将在RAM中分配100字节的未初始化内存空间? 程序加载器

  3. 假设我得到以下代码:

    int global[100];
    
    void main(void)
    {
       //...
    }
    

    全局[100]未初始化。如何在我的可执行文件中重新编码全局[100]?谁会在什么时候分配它?如果它被初始化怎么办?

4 个答案:

答案 0 :(得分:7)

初始化变量值存储在可执行文件的.data段中。未初始化的不必存储。它们最终位于RAM中的.bss段,但在可执行文件中段的大小为零,只需要在段描述符中存储所需的内存量。 .text部分中的代码正在通过偏移访问这些到段中。 Runtime linker-loader修补这些对实际virtual addresses的引用。例如,请参阅Executable and Linkable Format,它在大多数类Unix操作系统上使用。

答案 1 :(得分:2)

全局变量的存储在程序加载时由OS链接器/加载程序分配到计算机的虚拟内存中。实际的全局变量存储位于物理内存层次结构(缓存,RAM内存,SSD / HD后备存储等)中的某个位置,由缓存和VM系统映射。它可能最终都非常分散。

初始化全局变量的值从.data段复制到分配的虚拟内存的一部分中。根据运行程序的特定操作系统的安全性,未初始化的全局变量可能会归零,或者可能会留下垃圾。

其他变体,取决于语言,编译器,语言运行时和操作系统。

答案 2 :(得分:1)

在PE文件中,为每个段指定了两种大小:RAWsize(磁盘大小)和Vsize(RAM大小)。

Vsize大于RAWsize时,RAM中的其余部分将归零。

.bss(如果存在)的RAWsize始终为0,未初始化的全局变量位于那里。

另一种常见方法是使Vsize的{​​{1}}大于其.data,以便该段的其余部分将保存单位变量。

答案 3 :(得分:0)

未初始化的变量只是机器级别的指针。它们的空间在运行时分配,程序将在稍后的时间填充它。

例如,如果在汇编程序中创建了一个全局变量global BYTE 100,它将保留global作为指向100字节区域的指针。然后,程序可以根据需要访问该区域。

编辑:我查阅了我的汇编程序书,看起来像初始化变量一样,在.data部分中定义了未初始化的全局变量。根据我的理解,空间在exe中分配(比如上面的100个字节),但是会有未定义的内容。在Windows中的Intel机器上它将是垃圾;该程序负责初始化它。希望这有帮助!