2008-10-01 38 views

回答

3

除了Konrad所说的,声明一个变量为静态的基本意味着它的内存在程序加载时被分配,而不是在堆或堆栈上。历史上,在关键应用程序中只使用静态变量意味着应用程序的内存占用不会在运行时更改,因此由于资源限制而不太可能失败。不知道现代操作系统是否仍然如此。

如果你让你的编译器生成一个mapfile作为其输出的一部分,你可以看看所有不同部分的内容,包括数据。

6

我对“数据区”这个词不熟悉,但内存通常分为“代码段”和“数据段”。代码驻留在前者中,后者中的数据。我猜这就是这里的意思。

传统上,两者之间没有区别。但是,许多现代操作系统可以禁止在数据段中执行代码(只要CPU支持这种区别)。这有时候会出现“NX标志”这个口号,就像在“不执行”中一样,可以有效地防止一些恶意代码注入的情况。

/编辑:请注意,C++标准没有提到“数据区域”。

+0

传统上,区别(至少在基于x86的处理器上)是通过代码段寄存器(CS)加载/引用代码段并通过数据段寄存器(DS)加载/引用代码段。正如你所说,在平坦记忆模型下,除NX之外,没有任何区别。 – Zooba 2008-10-01 09:32:23

1

Konrad说道。

我想补充说的是,如果将代码放置在代码段中,那么仍然存在无法读取数据的CPU,反之亦然。这些在数十年前更为普遍,但它们在嵌入式世界中依然存在。

简而言之,链接器只是将相同类型的符号组合在一起。在个人电脑上,通常不仅仅是简单的代码和数据区域。您可以找到未初始化数据,只读数据和其他操作系统相关内容的区域。

-3

我觉得“数据区”是指堆,而局部变量通常会位于堆栈上。

或者这意味着为该变量分配的内存位于可执行文件的.data部分,但是这对于Windows和PE格式是特定的。

+0

Linux的(Unix's?)ELF有类似的功能:Google说http://www.cs.ucdavis.edu/~haungs/paper/node14.html – 2008-10-01 09:21:43

0

有很多地方的数据可能最终。通常,本地变量被分配在堆栈上,并且你可以使用malloc(或者默认版本的'new')在堆上分配东西。但是,静态数据通常是在程序启动时分配的,并且可能会在任何地方出现 - 到编译器,操作系统和可执行格式的位置。

5

这些区域的名称因平台,编译器和链接器而异。

一般来说,主要有:

  • 程序文本:可执行代码空间。
  • 常量:非可执行常量。
  • 堆栈:堆栈。
  • bss:以C/C++术语广义上的“静态”。 “Block Started by Symbol”
  • data:未初始化的全局变量
  • 堆:在运行时分配的存储空间。

在这种情况下,有问题的文档使用传统上称为bss段的名称“数据区”。

以C语言来说,存储类说明符“static”是指存在于程序生存期内的内存,并初始化为初始化程序的零或值。在该实例中:

static int s_value_one; 
static int s_value_two = 123; 

s_value_one的值被保证是零和s_value_type的值是123的第一个语句中的主点()。这是怎么回事是一个实现问题。

0

可执行文件中包含大量信息。

一个可执行文件,其物理文件中存储有许多类型/类别的数据。

如的是

  1. 的可执行代码指令
  2. 资源
  3. 相关信息(哪些DLL这个二进制取决于)
  4. 是从这个二进制

等导出的符号

需要有某种方式来组织

所有这些信息的.exe文件格式的内部,使得操作系统可以很容易地找到所有的信息和加载可执行文件,把事情的工作。为此,Windows世界中使用了一种常见的二进制格式(由M $当然创建),称为PE(便携式可执行文件)。我刚刚列出的所有信息(以及更多)都在二进制文件的不同部分中详细介绍。

.data段

一个这样的部分是.data段。 .data节包含所有已初始化的全局和静态数据,而.bss节包含未初始化的全局数据。

为什么你需要一个单独的全局部分?

好吧,一个全局行为像一个全局的,因为它是在一个存在于一个程序生命周期的内存区域中创建的,而不是像可能被覆盖/重用的堆栈那样的临时数据结构。 (如正常的自动变量)。

编译

因此,这些变量需要在堆中,不幸的是不能在编译时知道一些永久地址进行分配。因此,编译器将所有全局变量和静态变量放置在.data/.bss节中,并且引用这些变量的指令在.data/.bss中引用这些相对永久的地址。

链接

当链接程序的可执行文件在现实世界中,它决定在那里这些部分已经被放置和这样这些临时地址创建FIX的UPS系统,是指全局的说明,请参阅程序存储器中现在的虚拟地址。

现在你知道.data部分/区域是什么以及为什么全局需要在该区域分配一些空间以及如何实时帮助程序。谷歌搜索PE格式和链接器和.data部分等将让你的链接。