我正在阅读Windows via c/c++。我只是想知道一个大文件可以映射到内存。大于2GB的PE文件
当我们执行一个应用程序时,一个PE文件被映射到它们的进程地址(用户分区)。
在32位Windows,一个大文件(大于2GB)可以加载到用户分区?或者它会失败?
如果可能,分页文件是否有助于加载?
我正在阅读Windows via c/c++。我只是想知道一个大文件可以映射到内存。大于2GB的PE文件
当我们执行一个应用程序时,一个PE文件被映射到它们的进程地址(用户分区)。
在32位Windows,一个大文件(大于2GB)可以加载到用户分区?或者它会失败?
如果可能,分页文件是否有助于加载?
您将无法在32位Windows上执行此操作。想要做到这一点的任何程序运行后会在加载最小的3个模块:
yourApplication.exe会默认加载在0x00400000.exe,尽管您可以更改该地址。 ntdll.dll和kernel32.dll将在其高位0x7Dxx0000范围内的通常加载地址加载。
在Vista及以后的操作系统上面的段落是不正确的加载地址是随机的,但DLL文件仍然会存在在记忆的第一2GB自己的地址。
因此你不会有足够的连续空间的任何地方载入您的特别大的PE文件,即使您使用/ 3GB开关启动Windows。
如果你想要在各种的DLL将加载一个好主意,用VMValidator(免费),可视化你的应用程序的地址空间。虚拟内存视图向您显示一个图形表示(每4Kb页1个像素)的内存。页面和段落视图显示了每个内存页面和内存段落的实际虚拟内存状态。
对于64位Windows,您可以加载一个2GB的64位PE文件 - 有当然应该enopugh连续空间,使其能够在内存中加载。至于它是否会工作,我不能说,你将不得不测试它。
不,你无法 - 无论分页文件设置如何,你都会耗尽你的VA空间。
我不认为整个文件被映射,只到可执行图像的大小(如在PE头中列出)。所以自解压档案> 2GB应该是可能的。代码将不得不使用标准文件I/O从PE文件结束后的文件后部提取数据。
**为什么**你有2GB的PE文件? – SLaks 2010-03-22 13:38:05
我不知道。我只是担心这一点。 – Benjamin 2010-03-22 13:47:26
为什么?你为什么没有2GB的PE文件? – SLaks 2010-03-22 13:50:25