Как включить 32-разрядное приложение Delphi для использования 4 ГБ памяти в 64-разрядных окнах (с помощью Wow64.exe)? - PullRequest
11 голосов
/ 04 декабря 2009

Согласно этой странице MSDN :

WOW64 позволяет 32-битным приложениям Воспользуйтесь преимуществами 64-битного ядра. Поэтому 32-битные приложения могут использовать большее количество дескрипторов ядра и оконные ручки. Тем не менее, 32-разрядный приложения не могут быть в состоянии создать столько потоков под WOW64, сколько они может при запуске нативно на базе x86 системы, потому что WOW64 выделяет дополнительный 64-битный стек (обычно 512 Кб) для каждой темы. Кроме того, некоторые количество адресного пространства зарезервировано для самого WOW64 и данных структуры, которые он использует. Количество зарезервировано зависит от процессора; больше зарезервировано на Intel Itanium чем на процессоре x64.

Если приложение имеет IMAGE_FILE_LARGE_ADDRESS_AWARE флаг установите в заголовке изображения каждый 32-битный приложение получает 4 ГБ виртуальной адресное пространство в WOW64 среда. Если Флаг IMAGE_FILE_LARGE_ADDRESS_AWARE не установлено, каждое 32-битное приложение получает 2 ГБ виртуального адресного пространства в среде WOW64.

Как эффективно установить флаг IMAGE_FILE_LARGE_ADDRESS_AWARE в моем приложении Delphi 2007, чтобы я мог сделать свое 32-разрядное приложение Wow64 с поддержкой и адресовать до 4 ГБ памяти?

Ответы [ 4 ]

12 голосов
/ 04 декабря 2009

Используйте директиву компоновщика $ SetPEFlags:

{$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE}

Константа IMAGE_FILE_LARGE_ADDRESS_AWARE определена в Windows.pas. Я не помню, какая версия Delphi впервые включила его.

В Delphi 2007, вы найдете SetPEFlags описывались в "PE (Portable Executable) заголовка флагов (Delphi)" .

Некоторые полезные IMAGE_FILE_HEADER флаги :

  • {$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE} //$0020

    Приложение может обрабатывать адреса размером более 2 ГБ.

  • {$SetPEFlags IMAGE_FILE_NET_RUN_FROM_SWAP} //$0800

    Если образ находится в сети, скопируйте его и запустите из файла подкачки.

  • {$SetPEFlags IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP} //$0400

    Если образ находится на съемном носителе, скопируйте его и запустите из файла подкачки.

Некоторые IMAGE_FILE_HEADER Флаги :

  • {$SetPEOptFlags IMAGE_DLLCHARACTERISTICS_NX_COMPAT} //$0100

    Изображение совместимо с предотвращением выполнения данных (DEP).

  • {$SetPEOptFlags IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE} //$0040

    DLL может быть перемещена во время загрузки. (он же ASLR - рандомизация размещения адресного пространства)

  • {$SetPEOptFlags IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE} //$8000

    Изображение известно серверу терминалов.

11 голосов
/ 04 декабря 2009

См. Эту статью CodeCentral: Использование более 3 ГБ памяти в 32-разрядной программе Delphi .

В современных версиях Delphi просто добавьте директиву компилятора в dpr: {$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE}

9 голосов
/ 05 декабря 2009

Обратите внимание, что в компиляторе и RTL есть допущения, что указатели, интерпретируемые как 32-разрядные целые числа со знаком, никогда не будут отрицательными. Например, компилятор не разрешит создание структуры данных размером более 2 ГБ, а некоторые проверки границ в RTL предполагают, что, например, Index + Count < 0 означало переполнение сложения, где Index может быть индексом в байтовом массиве. Другие проблемы могут возникнуть в диспетчере памяти.

Испытайте хорошо и действуйте на свой страх и риск.

1 голос
/ 06 декабря 2009

Если вы сделаете это, обязательно используйте FastMM, поскольку он поддерживает указатели> 2 ГБ. Ранее менеджеры памяти Delphi не работали так, как Барри Келли уже описывал.

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