我正在阅读Windows via c/c++。我只是想知道一个大文件可以映射到内存。
当我们执行一个应用程序时,PE文件被映射到它们的进程地址(用户分区)。
在32位Windows中,可以将大文件(大于2GB)加载到用户分区吗?或者会失败?
如果可能,Paging文件是否有助于加载?
答案 0 :(得分:2)
不,你不能 - 无论页面文件设置如何,你都会耗尽你的VA空间。
答案 1 :(得分:1)
我不认为整个文件是映射的,只能达到可执行映像的大小(如PE标题中所列)。那么一个自解压档案>应该可以2GB。在PE映像结束后,代码必须使用标准文件I / O从文件的后半部分提取数据。
答案 2 :(得分:1)
您无法在32位Windows上执行此操作。任何想要执行此操作的程序将至少加载3个模块:
默认情况下,yourApplication.exe将加载为0x00400000.exe,但您可以更改该地址。 ntdll.dll和kernel32.dll将加载到高0x7Dxx0000范围内的通常加载地址。
在Vista和更高版本的操作系统中,上面的段落并不正确,因为加载地址是随机的,但dll仍会出现在前2GB内存中的自己的地址上。
因此,即使您使用/ 3GB开关启动Windows,也无法在任何地方填充特别大的PE文件。
如果您想了解各种DLL的加载位置,请使用VMValidator(免费)可视化应用的地址空间。虚拟内存视图向您显示内存的图形表示(每4Kb页1个像素)。 Pages和Paragraph视图显示每个内存页面和内存段落的实际虚拟内存状态。
对于64位Windows,您可能能够加载2GB 64位PE文件 - 当然应该有足够的连续空间来允许它加载到内存中。至于它是否会起作用我不能说,你将不得不测试它。