PE-файл размером более 2 ГБ.
-
21-09-2019 - |
Вопрос
я читаю Windows через c/С++.И мне просто интересно, как большой файл можно сопоставить с памятью.
Когда мы запускаем приложение, PE-файлу сопоставляется адрес процесса (пользовательский раздел).
В 32-битной Windows большой файл (размером более 2 ГБ) можно загрузить в пользовательский раздел?или это будет провал?
Если возможно, помогает ли файл подкачки загрузке?
Решение
Вы не сможете сделать это в 32-битной Windows.Любая запущенная программа, которая хочет это сделать, будет иметь как минимум 3 загруженных модуля:
- ntdll.dll
- ядро32.dll
- ваше приложение.exe
yourApplication.exe по умолчанию загружается по адресу 0x00400000.exe, хотя вы можете изменить этот адрес.ntdll.dll и kernel32.dll будут загружаться по своим обычным адресам загрузки в верхнем диапазоне 0x7Dxx0000.
В операционных системах Vista и более поздних версиях приведенный выше абзац неверен, поскольку адреса загрузки выбираются случайным образом, но библиотеки DLL все равно будут присутствовать по своему собственному адресу в первых 2 ГБ памяти.
Таким образом, у вас нигде не будет достаточно непрерывного пространства для загрузки исключительно большого PE-файла, даже если вы запустите Windows с ключом /3GB.
Если вы хотите иметь представление о том, где будут загружаться различные библиотеки DLL, используйте ВМВалидатор (бесплатно) для визуализации адресного пространства вашего приложения.Представление виртуальной памяти показывает графическое представление (1 пиксель на страницу размером 4 КБ) памяти.Представления «Страницы» и «Абзац» показывают фактическое состояние виртуальной памяти каждой страницы памяти и абзаца памяти.
В 64-разрядной версии Windows вы можете загрузить 64-разрядный PE-файл размером 2 ГБ — обязательно должно быть достаточно непрерывного пространства, чтобы его можно было загрузить в память.Насчет того, будет ли это тогда работать, я не могу сказать, вам придется это проверить.
Другие советы
Нет, нельзя — вы исчерпаете пространство ВА, независимо от настроек файла подкачки.
Я не думаю, что весь файл отображается, а только до размера исполняемого образа (как указано в заголовке PE).Таким образом, самораспаковывающийся архив размером > 2 ГБ должен быть возможен.Коду придется использовать стандартные файловые операции ввода-вывода для извлечения данных из последней части файла, следующей за концом PE-образа.