2008-08-29 17 views
8

Se me ha pedido que cree un dll compatible con Delphi en C++ para hacer una administración simple de la memoria de 64 bits.64bit Asignación de memoria

El fondo es que el sistema en Delphi necesita asignar una gran cantidad de fragmentos de memoria que funcionarían bien fuera del espacio direccionable de 32 bits. El desarrollador de Delphi me explicó que no podía asignar memoria con los comandos Delphi disponibles para él. Él dice que puede tener una dirección de 64 bits, por lo que solo quiere llamar a una función que proporciono para asignar la memoria y devolverle un puntero de 64 bits. Luego otra función para liberar la memoria más tarde.

Ahora, solo tengo VS 2008 a mi disposición, en primer lugar, ni siquiera estoy seguro de poder crear un dll compatible con Delphi en primer lugar.

Todos los expertos en Delphi se preocupan por ayudarme. Quizás haya una manera de lograr lo que él requiere sin reinventar la rueda. Otros desarrolladores deben haber encontrado esto antes en Delphi.

Todos los comentarios apreciados.

+0

También necesitaría una función para leer/escribir datos en esos bloques de memoria porque no podría hacerlo desde un proceso de 32 bits, y no puede ser una DLL simple porque un proceso de 32 bits no podría para cargarlo Básicamente, le pidió que escribiera algo muy parecido al "extensor" de memoria EMS/XMS de los tiempos de antaño ... –

Respuesta

7

Solo los procesos de 64 bits pueden abordar la memoria de 64 bits. Un proceso de 64 bits solo puede cargar dlls de 64 bits y los procesos de 32 bits solo pueden cargar 32 bits dlls. El compilador de Delphi solo puede hacer 32 bits binarios.

Entonces, un Delphi exe de 32 bits no puede cargar su DLL de 64 bits C++. Podría cargar un dll C++ dll de 32 bits, pero entonces ese dll no sería capaz de abordar el espacio de memoria de 64 bits. Estás algo atrapado con esta solución.

Delphi podría, con las opciones de compilador adecuadas y los switches de Windows, gestionar 3 GB de memoria sin problemas. Se puede acceder a más memoria mediante un proceso de 32 bits si usa Physical Address Extension. Luego necesita intercambiar páginas de memoria dentro y fuera de la memoria de 32 bits mediante el uso de Address Windowing Extensions.

+0

Además, el proceso de 32 bits puede usar hasta ~ 4 GB en el sistema operativo de 64 bits. – samir105

+0

Esto ya no es del todo exacto. Puede que desee actualizar su respuesta ahora que Embarcadero ha lanzado un compilador de 64 bits. –

6

Punteros de Delphi son de 32 bits. Período. Su desarrollador de Delphi puede "almacenar" los valores de 64 bits que desea devolverle, pero no puede acceder a la memoria que señalan, por lo que es bastante inútil.

Anteriormente, había escrito: -

Una versión de 64 bits de Delphi es el Codegear/Embarcadero's road map para "mediados de 2009". La calidad del producto parece ser (por fin!), teniendo prioridad sobre golpear la nave data exactamente, así que no contenga la respiración ...

embargo, en agosto de 2010, publicó un embarcadero new roadmap here. Esto no da fechas específicas, pero menciona un 64-bit Vista previa del compilador, con Disponibilidad proyectada, 1er semestre de 2011.

+1

Las últimas noticias dicen que el compilador de 64 bits se lanzará alrededor de agosto (http://tech.turbu-rpg.com/351/odd-timing), y que ahora se someterá a pruebas beta. Lo que se lanzará exactamente aún se desconoce. –

+1

Esta vez, sin embargo, parece que está sucediendo (Delphi x64). Ahora hay una versión beta para Delphi x64: http://www.embarcadero.com/products/delphi/64-bit – PhiS

2

Es posible que también desee agregar una forma de anclar y desanclar ese puntero de 64 bits a una dirección de memoria de 32 bits. Dado que se trata de Delphi, estoy bastante seguro de que es específico de Windows, por lo que también podría usar Address Windowing Extensions. De esta forma, puede admitir asignar, liberar y fijar y desanclar la memoria en un rango de direcciones de 32 bits y aprovechar un espacio de asignación de memoria de 64 bits. Suponiendo que el usuario realmente comprometerá la memoria de manera que quepa en el espacio de direcciones virtuales de 32 bits.

+0

. Podría usar AWE directamente de Delphi si AWE es lo que necesita. AWE permite que un proceso de 32 bits vaya más allá de las limitaciones de espacio de direcciones de 32 bits; sin embargo, funciona asignando/eliminando el mapeo de páginas hacia y desde el espacio de direcciones de 32 bits, por lo que algunas aplicaciones pueden encontrarlo útil, otras no. –

5

Puede echar un vistazo a Free Pascal ya que incluye una versión de 64 bits y es principalmente sintaxis compatible con Delphi.

4

Para asignar memoria compartida por proceso múltiple, debe usar un archivo mapeado de memoria.

El código disponible en http://www.delphifaq.com/faq/delphi_windows_API/f348.shtml se puede utilizar para comunicarse entre un proceso de 32 bits y uno de 64 bits.

Estos son los pasos:

  • crear un archivo de memoria asignada, ya sea en el disco, ya sea en la memoria;
  • Crea un mutex para notificar el cambio de archivo;
  • Un extremo escribe algunos datos en el archivo mapeado en la memoria;
  • Luego marca el mutex;
  • Otro extremo recibe la notificación mutex;
  • Luego lee los datos del archivo mapeado en la memoria.

Depende de usted crear un diseño binario personalizado en el archivo mapeado en memoria, para compartir cualquier dato.

Por diseño, los archivos mapeados en memoria son rápidos (es una función de núcleo/kernel x86), y pueden manejar una gran cantidad de memoria (hasta 1 GB para un proceso de 32 bits, de mi experimento).

Este tipo de comunicación es utilizada por http://cc.embarcadero.com/Author/802978 para llamar a cualquier dll de 64 bits desde un programa Delphi de 32 bits.

+0

No llamaría "hasta 1GB" "gran memoria" hoy;) –

+0

@ldsandon Es una cuestión de comprensión. Desde un punto de vista de la biblioteca, podría tener sentido dejar que los datos "enormes" permanezcan en el lado de 64 bits, luego use el archivo de memoria asignada solo para la transferencia de datos de los valores necesarios. No tiene sentido mapear la información completa cada vez que quiera llamar a la biblioteca. El archivo MM está aquí para manejar la función "parámetros". Entonces, en este caso, 1 GB de memoria es enorme para los parámetros. –