64-битное распределение памяти

Меня попросили создать Delphi-совместимую dll на C ++ для простого управления 64-битной памятью.

Фон состоит в том, что системе в Delphi необходимо выделить много фрагментов памяти, которые выходили бы за пределы 32-битного адресного пространства. Разработчик Delphi объяснил мне, что он не может выделить память с помощью доступных ему команд Delphi. Он говорит, что может хранить 64-битный адрес, поэтому он просто хочет вызвать функцию, которую я предоставляю, чтобы выделить память и вернуть ему 64-битный указатель. Затем еще одна функция, чтобы позже освободить память.

Теперь в моем распоряжении только VS 2008, поэтому я даже не уверен, что вообще смогу создать Delphi-совместимую dll.

Любые эксперты Delphi помогут мне. Может быть, есть способ добиться того, чего он требует, не изобретая велосипед заново. Другие разработчики, должно быть, сталкивались с этим раньше в Delphi.

Все комментарии приветствуются.


person Andy    schedule 29.08.2008    source источник
comment
Ему также понадобится функция для чтения / записи данных в эти блоки памяти, потому что он не сможет сделать это из 32-битного процесса, и это не может быть обычная DLL, потому что 32-битный процесс не сможет ее загрузить. . По сути, он просил вас написать что-то очень похожее на расширитель памяти EMS / XMS старых времен ...   -  person    schedule 27.05.2011


Ответы (5)


Только 64-битные процессы могут обращаться к 64-битной памяти. 64-разрядный процесс может загружать только 64-разрядные библиотеки DLL, а 32-разрядные процессы могут загружать только 32-разрядные библиотеки DLL. Компилятор Delphi может создавать только 32-битные двоичные файлы.

Таким образом, 32-битный Delphi exe не может загрузить вашу 64-битную dll c ++. Он мог загружать 32-битную dll c ++, но тогда эта dll не могла обращаться к 64-битному пространству памяти. Вы застряли в этом решении.

При правильных параметрах компилятора и переключателях Windows Delphi может без проблем адресовать 3 ГБ памяти. 32-битный процесс может получить доступ даже к большему объему памяти, если он использует расширение физического адреса. Затем ему необходимо поменять местами страницы памяти в 32-битной памяти и из нее с помощью Расширения окна адреса.

person Lars Truijens    schedule 29.08.2008
comment
Кроме того, 32-разрядный процесс может использовать до ~ 4 ГБ в 64-разрядной ОС. - person samir105; 07.09.2009
comment
Это уже не совсем верно. Возможно, вы захотите обновить свой ответ сейчас, когда Embarcadero выпустила 64-битный компилятор. - person Kenneth Cochran; 03.07.2012

Указатели Delphi 32-битные. Период. Ваш разработчик Delphi может иметь возможность «хранить» 64-битные значения, которые вы хотите ему вернуть, но он не может получить доступ к памяти, на которую они указывают, так что это довольно бесполезно.

Раньше я писал: -

64-разрядная версия Delphi включена в дорожную карту Codegear / Embarcadero на «середину 2009 года». . Кажется, что качество продукции (наконец-то!) Превалирует над точным соблюдением сроков поставки, так что не задерживайте дыхание ...

Но в августе 2010 года Embarcadero опубликовала здесь новую дорожную карту. Здесь не указаны конкретные даты, но упоминается предварительная версия 64-разрядного компилятора с прогнозируемой доступностью на 1-е полугодие 2011 г..

person Roddy    schedule 29.08.2008
comment
В последних новостях говорится, что 64-разрядный компилятор будет выпущен примерно в августе (tech.turbu-rpg.com / 351 / odd-Timing), сейчас находится на стадии бета-тестирования. Что именно будет выпущено, пока неизвестно. - person ; 27.05.2011
comment
Однако на этот раз похоже, что это (Delphi x64) происходит. Сейчас существует бета-версия для Delphi x64: embarcadero.com/products/delphi/64-bit - person PhiS; 27.05.2011

Вы можете взглянуть на Free Pascal, поскольку он включает 64-битную версию и в основном совместим с Delphi синтаксисом.

person Jim McKeeth    schedule 12.09.2008

Чтобы выделить память, совместно используемую несколькими процессами, вы должны использовать файл с отображением памяти.

Код доступен по адресу http://www.delphifaq.com/faq/delphi_windows_API/f348.shtml можно использовать для обмена данными между 32-битным и 64-битным процессами.

Вот шаги:

  • Создайте файл с отображением памяти либо на диске, либо в памяти;
  • Создайте мьютекс для уведомления об изменении файла;
  • Один конец записывает некоторые данные в файл с отображением памяти;
  • Затем он помечает мьютекс;
  • Другой конец получает уведомление о мьютексе;
  • Затем он считывает данные из файла с отображением памяти.

Вам нужно создать собственный двоичный макет в файле с отображением памяти, чтобы делиться любыми данными.

По дизайну файлы с отображением памяти бывают быстрыми (это функция уровня ядра / процессора x86) и могут обрабатывать огромную память (до 1 ГБ для 32-битного процесса, из моего эксперимента).

Этот вид связи используется http://cc.embarcadero.com/Author/802978 для вызовите любую 64-битную dll из 32-битной программы Delphi.

person Arnaud Bouchez    schedule 27.05.2011
comment
Я бы сегодня не называл до 1Гб огромной памяти;) - person ; 27.05.2011
comment
@ldsandon Это вопрос понимания. С точки зрения библиотеки, имеет смысл оставить огромные данные на 64-битной стороне, а затем использовать файл с отображением памяти только для передачи данных необходимых значений. Нет смысла отображать все данные каждый раз, когда вы хотите вызвать библиотеку. Файл MM предназначен только для обработки параметров функции. Так что в данном случае 1 ГБ памяти для параметров огромен. - person Arnaud Bouchez; 27.05.2011

Вы также можете добавить способ закрепления и открепления этого 64-битного указателя на 32-битный адрес памяти. Поскольку это Delphi, я почти уверен, что он специфичен для Windows, поэтому вы также можете использовать Расширения окна адреса. Таким образом, вы можете поддерживать выделение, освобождение, закрепление и открепление памяти к 32-битному диапазону адресов и по-прежнему пользоваться преимуществами 64-битного пространства распределения памяти. Предполагая, что пользователь фактически фиксирует память так, чтобы она умещалась в 32-битном виртуальном адресном пространстве.

person Mat Noguchi    schedule 29.08.2008
comment
Он сможет использовать AWE прямо из Delphi, если AWE - это то, что ему нужно. AWE позволяет 32-битному процессу выйти за рамки ограничений 32-битного адресного пространства, однако он работает с отображением / отменой отображения страниц в 32-битное адресное пространство и из него, поэтому для некоторых приложений это может оказаться полезным, для других - нет. - person ; 27.05.2011