delphi - utilizable - utilizar toda la memoria ram windows 8
¿Cómo puedo habilitar mi aplicación Delphi de 32 bits para usar 4 gb de memoria en Windows de 64 bits(a través de Wow64.exe)? (4)
De acuerdo con esta página de MSDN :
WOW64 permite que las aplicaciones de 32 bits aprovechen el núcleo de 64 bits. Por lo tanto, las aplicaciones de 32 bits pueden usar una mayor cantidad de identificadores de kernel y controladores de ventanas. Sin embargo, las aplicaciones de 32 bits pueden no ser capaces de crear tantos subprocesos en WOW64 como lo hacen cuando se ejecutan de forma nativa en sistemas basados en x86 porque WOW64 asigna una pila adicional de 64 bits (generalmente 512 KB) para cada subproceso. Además, cierta cantidad de espacio de direcciones está reservado para WOW64 y las estructuras de datos que utiliza. La cantidad reservada depende del procesador; se reserva más en Intel Itanium que en el procesador x64.
Si la aplicación tiene el indicador IMAGE_FILE_LARGE_ADDRESS_AWARE establecido en el encabezado de la imagen, cada aplicación de 32 bits recibe 4 GB de espacio de direcciones virtuales en el entorno WOW64. Si el indicador IMAGE_FILE_LARGE_ADDRESS_AWARE no está configurado, cada aplicación de 32 bits recibe 2 GB de espacio de direcciones virtuales en el entorno WOW64.
¿Cómo configuro efectivamente el indicador IMAGE_FILE_LARGE_ADDRESS_AWARE en mi aplicación Delphi 2007 para que pueda hacer que mi aplicación Wow64 de 32 bits sea consciente y se ocupe de un total de 4 GB de memoria?
Consulte este artículo de CodeCentral: uso de más de 3 GB de memoria en un programa Delphi de 32 bits .
Tenga en cuenta que hay suposiciones incluidas en el compilador y RTL que los punteros, interpretados como enteros de 32 bits con signo, nunca serán negativos. Por ejemplo, el compilador no permitirá crear una estructura de datos de más de 2 GB de tamaño, y ciertas comprobaciones de límites en la RTL suponen que, por ejemplo, Index + Count < 0
significaba la adición desbordada, donde el Index
puede ser un índice en una matriz de bytes. Otros problemas pueden surgir en el administrador de memoria.
Pruebe bien y proceda bajo su propio riesgo.
Si hace esto, asegúrese de usar FastMM porque admite punteros de> 2GB. Anteriormente, los administradores de memoria Delphi no funcionarían bien como Barry Kelly ya describió.
Utilice la directiva linker $ SetPEFlags:
{$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE}
La constante IMAGE_FILE_LARGE_ADDRESS_AWARE
se define en Windows.pas. Sin embargo, no recuerdo qué versión de Delphi lo incluyó por primera vez.
En Delphi 2007, encontrará SetPEFlags documentados en "PE (ejecutable portátil) encabezados de encabezado (Delphi)" .
Algunos IMAGE_FILE_HEADER
útiles IMAGE_FILE_HEADER
:
{$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE} //$0020
La aplicación puede manejar direcciones de más de 2 GB.
{$SetPEFlags IMAGE_FILE_NET_RUN_FROM_SWAP} //$0800
Si la imagen está en la red, cópiela y ejecútela desde el archivo de intercambio.
{$SetPEFlags IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP} //$0400
Si la imagen está en un medio extraíble, cópielo y ejecútelo desde el archivo de intercambio.
Algunos indicadores IMAGE_FILE_HEADER :
{$SetPEOptFlags IMAGE_DLLCHARACTERISTICS_NX_COMPAT} //$0100
La imagen es compatible con la prevención de ejecución de datos (DEP).
{$SetPEOptFlags IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE} //$0040
La DLL se puede reubicar en el momento de la carga. (también conocido como ASLR - aleatorización del diseño del espacio de direcciones)
{$SetPEOptFlags IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE} //$8000