64-битное распределение памяти - PullRequest
8 голосов
/ 29 августа 2008

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

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

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

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

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

Ответы [ 5 ]

7 голосов
/ 29 августа 2008

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

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

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

6 голосов
/ 30 августа 2008

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

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

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

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

5 голосов
/ 12 сентября 2008

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

4 голосов
/ 27 мая 2011

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

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

Вот шаги:

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

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

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

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

2 голосов
/ 30 августа 2008

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

...