PE файл, който е по-голям от 2 GB

Чета Windows чрез c/c++. И просто се чудя, че голям файл може да бъде картографиран в паметта.

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

В 32-битов Windows голям файл (по-голям от 2 GB) може да бъде зареден в потребителския дял? или ще се провали?
Ако е възможно, файлът за пейджинг помага ли при зареждането?


person Benjamin    schedule 22.03.2010    source източник
comment
ЗАЩО имате 2GB PE файл?   -  person SLaks    schedule 22.03.2010
comment
Аз не. Просто се тревожа за това.   -  person Benjamin    schedule 22.03.2010
comment
Защо? Защо някога имате 2GB PE файл?   -  person SLaks    schedule 22.03.2010
comment
Защото сте вградили 2Gb база данни като ресурс? Не че би било ужасно добра идея, но напр. последната инсталация на MS Office е 700Mb .exe файл.   -  person nos    schedule 22.03.2010
comment
За голям архив, вграден в exe.   -  person Prof. Falken    schedule 22.03.2010


Отговори (3)


Няма да можете да направите това на 32-битов Windows. Всяка работеща програма, която иска да направи това, ще има поне 3 заредени модула:

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

yourApplication.exe по подразбиране ще се зареди на 0x00400000.exe, въпреки че можете да промените този адрес. ntdll.dll и kernel32.dll ще се зареждат на обичайните си адреси за зареждане във високия диапазон 0x7Dxx0000.

При Vista и по-нови операционни системи горният абзац не е верен, тъй като адресите за зареждане са произволни, но dlls все още ще присъстват на техния собствен адрес в първите 2 GB памет.

По този начин няма да имате достатъчно непрекъснато пространство никъде, за да заредите вашия изключително голям PE файл, дори ако стартирате Windows с превключвателя /3GB.

Ако искате добра представа къде ще се зареждат различните DLL файлове, използвайте VMValidator (безплатно), за да визуализирате адресното пространство на вашето приложение. Изгледът на виртуалната памет ви показва графично представяне (1 пиксел на страница от 4 Kb) на паметта. Изгледите Страници и Абзац ви показват действителното състояние на виртуалната памет на всяка страница от паметта и параграф от паметта.

За 64-битов Windows може да успеете да заредите 2GB 64-битов PE файл - със сигурност трябва да има достатъчно непрекъснато пространство, за да може да се зареди в паметта. Що се отнася до това дали тогава ще работи, не мога да кажа, ще трябва да го тествате.

person Stephen Kellett    schedule 29.03.2010

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

person Ana Betts    schedule 22.03.2010

Не мисля, че целият файл е картографиран, а само до размера на изпълнимото изображение (както е посочено в PE заглавката). Така че трябва да е възможен саморазархивиращ се архив > 2 GB. Кодът ще трябва да използва стандартните I/O файлове, за да извлече своите данни от последната част на файла, след края на PE изображението.

person Ben Voigt    schedule 22.03.2010