2008-08-29 3 views
8

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

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

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

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

Все комментарии оценены.

+0

Он также нуждается в функции для чтения/записи данных в эти блоки памяти, потому что он не сможет сделать это из 32-битного процесса, и это не может быть простая DLL, потому что 32-битный процесс не сможет для его загрузки. В основном, он попросил вас написать что-то очень похожее на «расширитель» памяти EMS/XMS времен старого ... – 2011-05-27 07:11:52

ответ

7

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

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

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

+0

Кроме того, 32-битный процесс может использовать до ~ 4 ГБ в 64-битной ОС. – samir105 2009-09-07 07:43:51

+0

Это уже не совсем точно. Возможно, вы захотите обновить свой ответ сейчас, когда Embarcadero выпустил 64-битный компилятор. – 2012-07-03 15:17:10

6

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

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

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

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

+1

Последние новости говорят, что 64-битный компилятор будет выпущен примерно в августе (http://tech.turbu-rpg.com/351/odd-timing), находясь в стадии бета-тестирования. То, что будет точно выпущено, пока неизвестно. – 2011-05-27 09:56:11

+1

На этот раз, похоже, это происходит (Delphi x64). Теперь есть бета-версия для Delphi x64: http://www.embarcadero.com/products/delphi/64-bit – PhiS 2011-05-27 12:19:28

2

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

5

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

4

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

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

Вот шаги:

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

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

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

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

Смежные вопросы