Файл PE размером более 2 ГБ - PullRequest
1 голос
/ 22 марта 2010

Я читаю Windows через c / c ++ . И мне просто интересно, что большой файл может быть сопоставлен с памятью.

Когда мы выполняем приложение, PE-файл сопоставляется с их адресом процесса (пользовательский раздел).

В 32-битной Windows, Большой файл (более 2 ГБ) может быть загружен в пользовательский раздел? или это не удастся?
Если это возможно, помогает ли файл подкачки при загрузке?

Ответы [ 3 ]

2 голосов
/ 22 марта 2010

Нет, вы не можете - вы исчерпаете пространство ВА, независимо от настроек файла подкачки.

1 голос
/ 29 марта 2010

Вы не сможете сделать это на 32-битной Windows. Любая работающая программа, которая хочет сделать это, будет загружена как минимум в 3 модуля:

  • ntdll.dll
  • kernel32.dll
  • yourApplication.exe

yourApplication.exe по умолчанию будет загружаться по адресу 0x00400000.exe, хотя вы можете изменить этот адрес. ntdll.dll и kernel32.dll будут загружаться с обычными адресами загрузки в диапазоне высоких значений 0x7Dxx0000.

В Vista и более поздних операционных системах приведенный выше абзац не соответствует действительности, поскольку адреса загрузки рандомизированы, но библиотеки dll по-прежнему будут присутствовать по собственному адресу в первых 2 ГБ памяти.

Таким образом, у вас не будет достаточно места для загрузки исключительно большого PE-файла, даже если вы запускаете Windows с ключом / 3GB.

Если вы хотите получить четкое представление о том, где будут загружаться различные библиотеки DLL, используйте VMValidator (бесплатно) для визуализации адресного пространства вашего приложения. Представление виртуальной памяти показывает графическое представление (1 пиксель на страницу 4 КБ) памяти. Представления «Страницы» и «Абзац» показывают фактическое состояние виртуальной памяти каждой страницы памяти и абзаца памяти.

В 64-битной Windows вы можете загрузить 64-битный PE-файл объемом 2 ГБ - обязательно должно быть достаточно непрерывного пространства, чтобы он мог загружаться в память. Что касается того, сработает ли это тогда, я не могу сказать, вам придется это проверить.

1 голос
/ 22 марта 2010

Я не думаю, что весь файл отображается, только до размера исполняемого образа (как указано в заголовке PE).Так что самораспаковывающийся архив> 2ГБ должен быть возможен.Код должен будет использовать стандартные файловые операции ввода-вывода для извлечения данных из последней части файла, следующей за концом образа PE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...