2010-03-22 77 views
1

我正在閱讀Windows via c/c++。我只是想知道一個大文件可以映射到內存。大於2GB的PE文件

當我們執行一個應用程序時,一個PE文件被映射到它們的進程地址(用戶分區)。

在32位Windows,一個大文件(大於2GB)可以加載到用戶分區?或者它會失敗?
如果可能,分頁文件是否有助於加載?

+3

**爲什麼**你有2GB的PE文件? – SLaks 2010-03-22 13:38:05

+0

我不知道。我只是擔心這一點。 – Benjamin 2010-03-22 13:47:26

+0

爲什麼?你爲什麼沒有2GB的PE文件? – SLaks 2010-03-22 13:50:25

回答

1

您將無法在32位Windows上執行此操作。想要做到這一點的任何程序運行後會在加載最小的3個模塊:

  • ntdll.dll中
  • KERNEL32.DLL
  • yourApplication.exe

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連續空間,使其能夠在內存中加載。至於它是否會工作,我不能說,你將不得不測試它。

2

不,你無法 - 無論分頁文件設置如何,你都會耗盡你的VA空間。

1

我不認爲整個文件被映射,只到可執行圖像的大小(如在PE頭中列出)。所以自解壓檔案> 2GB應該是可能的。代碼將不得不使用標準文件I/O從PE文件結束後的文件後部提取數據。