2

我正在通过 c/c++ 阅读 Windows。我只是想知道一个大文件可以映射到内存。

当我们执行一个应用程序时,一个 PE 文件被映射到它们的进程地址(用户分区)。

在 32 位 Windows 中,可以将大文件(大于 2GB)加载到用户分区吗?否则会失败?
如果可能,分页文件是否有助于加载?

4

3 回答 3

2

不,你不能 - 无论页面文件设置如何,你都会耗尽你的 VA 空间。

于 2010-03-22T16:20:44.950 回答
1

我不认为整个文件都被映射,只映射到可执行映像的大小(如 PE 标头中所列)。所以一个自解压档案 > 2GB 应该是可能的。代码必须使用标准文件 I/O 从文件的后半部分提取其数据,跟在 PE 映像的末尾。

于 2010-03-22T16:26:09.597 回答
1

您将无法在 32 位 Windows 上执行此操作。任何想要执行此操作的程序都将至少加载 3 个模块:

  • ntdll.dll
  • kernel32.dll
  • 你的应用程序.exe

yourApplication.exe 将默认加载到 0x00400000.exe,尽管您可以更改该地址。ntdll.dll 和 kernel32.dll 将在高 0x7Dxx0000 范围内的通常加载地址加载。

在 Vista 和更高版本的操作系统上,上述段落不正确,因为加载地址是随机的,但 dll 仍将出现在前 2GB 内存中它们自己的地址处。

因此,即使您使用 /3GB 开关启动 Windows,您也没有足够的连续空间来加载异常大的 PE 文件。

如果您想清楚了解各种 DLL 的加载位置,请使用VMValidator(免费)来可视化您的应用程序的地址空间。虚拟内存视图向您显示内存的图形表示(每 4Kb 页 1 个像素)。页面和段落视图显示每个内存页面和内存段落的实际虚拟内存状态。

对于 64 位 Windows,您可能能够加载 2GB 64 位 PE 文件——当然应该有足够的连续空间来允许它加载到内存中。至于它是否会起作用,我不能说,你必须测试它。

于 2010-03-29T19:05:35.370 回答