PE-файл размером более 2 ГБ

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

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

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


person Benjamin    schedule 22.03.2010    source источник
comment
ПОЧЕМУ у вас есть PE-файл размером 2 ГБ?   -  person SLaks    schedule 22.03.2010
comment
Я не. Я просто беспокоюсь об этом.   -  person Benjamin    schedule 22.03.2010
comment
Почему? Зачем вам когда-либо иметь PE-файл размером 2 ГБ?   -  person SLaks    schedule 22.03.2010
comment
Потому что вы внедрили базу данных размером 2 Гб в качестве ресурса? Не то, чтобы это было бы ужасно хорошей идеей, но, например. последняя установка MS Office представляет собой файл .exe размером 700 МБ.   -  person nos    schedule 22.03.2010
comment
Для большого архива, встроенного в exe.   -  person Prof. Falken    schedule 22.03.2010


Ответы (3)


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

  • ntdll.dll
  • ядро32.dll
  • ваше приложение.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 ГБ - конечно, должно быть достаточно непрерывного пространства, чтобы он мог загрузиться в память. Что касается того, будет ли это работать, я не могу сказать, вам придется это проверить.

person Stephen Kellett    schedule 29.03.2010

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

person Ana Betts    schedule 22.03.2010

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

person Ben Voigt    schedule 22.03.2010