全局变量是如何存储的?

smw*_*dia 6 c c++ assembly

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

我目前的理解是这样的:

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

感谢您抽出宝贵时间查看我的问题.

更新1 - 9:56 AM 11/3/2010

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

汇编语言源中的段 - 使用.text,.data和.bss指令构建文本和数据段

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

@迈克尔

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

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

假设我得到以下代码:

int global[100];

void main(void)
{
   //...
}
Run Code Online (Sandbox Code Playgroud)

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

Nik*_*sov 7

初始化变量值存储在.data可执行文件的段中.未初始化的不必存储.它们最终.bss位于RAM 中的段中,但在可执行文件中段的大小为零,只需要在段描述符中存储所需的内存量.该.text部分中的代码通过偏移访问这些段.运行时链接器加载器将这些引用修补为实际的虚拟地址.例如,请参阅可执行文件和可链接格式,该格式在大多数类Unix操作系统上使用.

  • @Andrey,是的,虚拟地址空间几乎是平坦的:)然后有MMU,页面,TLB,缓存,NUMA,以及所有这些乐趣.进程VA空间仍然是分区的.这就是为什么你得到*分段违规*:) (2认同)

Mic*_*l K 0

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

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

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