Вопрос

я читаю 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-образа.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top