Почему ограничение памяти 2 ГБ при работе в 64-битной Windows?

31

Я участвую в команде, которая разрабатывает приложение Delphi. Требования к памяти огромны. 500 МБ - это нормально, но в некоторых случаях это исключение из памяти. Память, выделенная в этих случаях, обычно составляет от 1000 до 1700 МБ.

Мы, конечно, хотим 64-битный компилятор, но это не произойдет сейчас (и если это произойдет, мы также должны преобразовать в unicode, но это еще одна история...).

Мой вопрос в том, почему существует ограничение на 2 ГБ памяти для каждого процесса при работе в 64-битной среде. Указатель 32 бит, поэтому я думаю, что 4 ГБ будет правильным пределом. Я использую Delphi 2007.

EDIT: Поэтому, если я установил флаг IMAGE_FILE_LARGE_ADDRESS_AWARE в Delphi, используя:

{$SetPeFlags IMAGE_FILE_LARGE_ADDRESS_AWARE}

И запустив полученный Exe файл на Windows Server 2003 x64, приложение может обратиться в 4 ГБ?

  • Должен ли я установить/3GB-переключатель в boot.ini?
  • Мы пробовали это, но на 32-битном Windows Server 2003 и, похоже, ограничиваем ресурсы Windows. За исключением "Out of memory" с GDIError в журнале было больше исключений. Но может быть, это исчезнет при работе в 64-битной ОС?
  • 0
    Переключатель 3 ГБ в boot.ini предназначен только для 32-битной Windows, и он необходим для работы LARGEADDRESSAWARE. Имейте в виду, что это уменьшает пространство, доступное самой Windows в 32-битных системах. Смотрите пример для примера здесь: blogs.technet.com/markrussinovich/archive/2009/03/26/… или читайте отличные «Windwos Internals» Руссиновича и Соломона.
Теги:
win64
delphi-2007

4 ответа

31
Лучший ответ

Если вы скомпилируете приложение Delphi с помощью флага /LARGEADDRESSAWARE, он сможет адресовать полный 4 ГБ в 64-разрядной ОС. В противном случае, при работе в WOW32, ОС предполагает, что приложение ожидает того же окружения, что и у 32-разрядной ОС, что означает, что из 4 ГБ адресного пространства для ОС выделено 2 ГБ, а 2 ГБ выделяется приложения.

  • 4
    Это действует только на 32-битных. Нет двоичной разницы между указателем 3ГБ и указателем 4ГБ, поэтому любое приложение, которое может обрабатывать 3ГБ, может сделать 4ГБ. / LARGEADDRESSAWARE подходит для полных 4 ГБ в 64-битных системах без каких-либо модификаций загрузки. Единственный раз, когда вам нужно сделать / 3GB, это если вы хотите использовать больше адресного пространства в 32-битной системе. Статья, на которую вы ссылаетесь, устарела примерно на десять лет и касается только 32-битных систем. PAE - это совершенно другая система.
  • 0
    @Dead: Да, конечно, на 64-битных системах ( support.microsoft.com/kb/294418 ), хотя оригинальная статья устарела только на 5 лет, а не на 10. :) Однако ответ остается неправильным / неполным в отношении это обсуждение последствий для 32-битных ОС.
Показать ещё 5 комментариев
14

Синтаксис в Delphi для установки флага LARGEADDRESSAWARE в исполняемом файле PE:

{$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE}

Поместите это в ваш .dpr файл.

6

http://msdn.microsoft.com/en-us/library/aa366778(VS.85).aspx

Виртуальное адресное пространство пользовательского режима для каждого 32-разрядного процесса: 2 ГБ

  • 4
    У Windows нет возможности узнать, использует ли Delphi арифметику со знаком или без знака для адресов памяти, поэтому она должна предполагать, что старший бит непригоден, если вы явно не заявите обратное.
  • 0
    @Mark: Это не совсем так. Как указано выше, установка флага загрузки позволит Delphi адресовать более 2 ГБ
Показать ещё 3 комментария
2

Пока вы выбираете 32-битные указатели с высоким набором бит (включая флаг LARGE_ADDRESS_AWARE PE), нет ограничения на 2 ГБ.

Прямое наблюдение

var
   p: Pointer;
   n: Int64;
begin
   p := Pointer($D0000000); //Above the 2GB line; and the 3GB line!

   p := VirtualAlloc(p, 1024, MEM_COMMIT or MEM_RESERVE, PAGE_READWRITE);
   if p = nil then
      RaiseLastWin32Error;

   n := Cardinal(p);
   ShowMessage(IntToHex(n, 16));
end;

Изображение 7786

Заключение

В 64-битной Windows нет ограничения на 2 ГБ, если вы клянетесь, вы можете обрабатывать указатели выше $7FFFFFFF.

Примечание. Любой код выпущен в общедоступном домене. Не требуется атрибуция.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню