AFAIK,有两种类型的全局变量,已初始化和未初始化。它们是如何存储的?它们都存储在可执行文件中吗?我可以想到初始化的全局变量的初始值存储在可执行文件中。但是对于未初始化的人需要存储什么?
我目前的理解是这样的:
可执行文件被组织为多个部分,例如.text,.data和.bss。代码存储在.text部分中,初始化的全局或静态数据存储在.data部分中,未初始化的全局或静态数据存储在.bss部分中。
感谢您抽出时间查看我的问题。
我在这里找到了一个很好的参考:
@迈克尔
我在汇编代码中定义了一个100字节的未初始化数据区域,这个100字节没有存储在我的可执行文件中,因为它没有初始化。
谁将在RAM中分配100字节的未初始化内存空间? 程序加载器?
假设我得到以下代码:
int global[100];
void main(void)
{
//...
}
全局[100]未初始化。如何在我的可执行文件中重新编码全局[100]?谁会在什么时候分配它?如果它被初始化怎么办?
答案 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字节区域的指针。然后,程序可以根据需要访问该区域。