AFAIK,有两种类型的全局变量,初始化和未初始化。它们是如何储存的?它们都存储在可执行文件中吗?我可以想到初始化的全局变量,将它们的初始值存储在可执行文件中。但是,对于未初始化的那些,需要存储什么呢?
我目前的理解是:
可执行文件被组织成几个部分,例如.text、.data和.bss。代码存储在.text部分,初始化的全局或静态数据存储在.data部分,未初始化的全局或静态数据存储在.bss部分。
谢谢你抽出时间看我的问题。
更新1-9:2010年3月11日上午56
我在这里找到了一个很好的参考资料:
Segments in Assembly Language Source - Building the text and data segments with .text, .data, and .bss directives
更新2-10:2010年3月11日上午09
@Michael
我在汇编代码中定义了100个字节未初始化的数据区域,这100个字节没有存储在我的可执行文件中,因为它不是initialized.
假设我得到了以下代码:
int global[100];
void main(void)
{
//...
}global100没有初始化。如何在我的可执行文件中对global100进行编码?谁会在什么时候分配?如果它被初始化了呢?
发布于 2010-11-03 02:06:22
在PE文件中,为每个段指定了两个大小: RAWsize (磁盘上的大小)和Vsize (内存中的大小)。
当Vsize大于RAWsize时,内存中其余的段将为零。
.bss (如果存在的话)的RAWsize总是为0,并且非尼亚化的全局变量位于那里。
另一种常见的方法是使Vsize of .data大于其RAWsize,这样段的其余部分将包含统一的变量。
发布于 2010-11-03 02:06:58
全局变量的存储是在程序加载时由OS链接器/加载器在计算机虚拟内存中分配的。实际的全局变量存储位于物理内存层次结构(缓存、RAM内存、SSD/HD备份存储等)中,这是由缓存和VM系统映射的。这一切可能最终都会变得支离破碎。
初始化的全局值从.data段复制到分配的虚拟内存的一部分。非初始化的全局值可能是零的,或者可能有垃圾留在它们中,这取决于运行程序的特定操作系统的安全性。
这些是其他的变体,取决于语言、编译器、语言运行时和操作系统.
发布于 2010-11-03 01:53:27
未初始化的变量只是机器级别上的指针。它们的空间是在运行时分配的,程序将在稍后的某个时候填充它。
例如,如果在汇编程序中创建一个全局变量global BYTE 100,它将保留global作为指向100字节区域的指针。然后,该程序可以访问该地区的任何需要。
编辑:我在我的汇编程序书中查找,它看起来就像初始化变量一样,在.data部分中定义了未初始化的全局值。根据我的理解,这个空间是在exe中分配的(如上面所说的100个字节),但是会有未定义的内容。在Windows中的Intel机器上,它将是垃圾;程序负责初始化它。希望这能有所帮助!
https://stackoverflow.com/questions/4083612
复制相似问题