Páginas: [1]
|
 |
|
Autor
|
Tema: Administrador de memoria de Win32 (Leído 681 veces)
|
Slasher-K
Desconectado
Mensajes: 1.480
|
Fuente: Microsoft Developer Network (MSDN) Traducción y edición: Slasher Keeper
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ Administrador de memoria de Win32 ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Acerca del Administrador de Memoria->>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Cada proceso tiene su espacio de dirección virtual de 32 bits que habilita hasta 4 gigabytes (GB) de memoria. A continuación se mostrarán los temas que se van a tratar en este documento:
* Espacio de Direcciones Virtual * Funciones de la Memoria Virtual * Funciones de la Pila * Funciones de la Validación de Acceso * Funciones Globales y Locales
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Espacio de Direcciones Virtual->>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Las direcciones virtuales usadas por un proceso no representa la ubicación física actual de un objeto en memoria. En cambio, el sistema mantiene un mapa de páginas para cada proceso, la cual es una estructura de datos interna usada para traducir direcciones virtuales a sus correspondientes direcciones físicas.
El espacio de memoria virtual está dividido en particiones:
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±± Windows NT Services, Edición Empresarial ±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
# La partición de 3 GB en la memoria baja (0x00000000 a 0xBFFFFFFF [3221225471]) está disponible para los procesos, y una partición de 1 GB en la memoria alta (0xC0000000 [3221225472] a 0xFFFFFFFF [4294967295]) está reservada para el sistema
±±±±±±±±±±± Window NT ±±±±±±±±±±±
La partición de 2 GB en la memoria baja (0x00000000 a 0x7FFFFFFF [2147483648]) está disponible para los procesos y la partición de 2 GB de en la memoria alta (0x80000000 (2147483648) a 0xFFFFFFFF [4294967295]) está reservado para el sistema.
±±±±±±±±±±±±±±±±±±±±±±±±± Windows 95 y Windows 98 ±±±±±±±±±±±±±±±±±±±±±±±±±
La partición de 4 GB en la memoria baja (0x00000000 a 0x00000FFF [4095]) es usada para compatibilidad con MS-DOS y Windows de 16 bits, la siguiente partición aproximadamente de 2 GB (0x00400000 [4194304] a 0x7FFFFFFF [2147483647] está disponible por los procesos para uso privado, la siguiente partición de 1 GB (0x80000000 [2147483648] a 0xBFFFFFFF [3221225471]) es compartida por todos los procesos de Win32, y la partición de 1 GB en memoria alta (0xC0000000 [3221225472] a 0xFFFFFFFF [4294967295]) es usada por el sistema.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Espacio de Dirección Virtual y Almacenamiento Físico->>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
El espacio de dirección virtual para cada proceso es mucho mayor que el total de memoria física para todos los procesos. Para incrementar el tamaño del almacenamiento físico, el sistema usa el disco para almacenamiento adicional.
La cantidad total de almacenamiento disponible para todos los procesos que se están ejecutando es la suma de la memoria física y el espacio libre en el disco disponible para el archivo de páginas, un archivo del disco que es usado para incrementar la cantidad de almacenamiento físico.
El almacenamiento físico y el espacio de dirección virtual para cada proceso están organizados en páginas, unidades de memoria, cuyo tamaño depende de la computadora central. Por ejemplo, en computadoras x86 el tamaño de páginas central es de 4 KB.
Pata maximizar su flexibilidad en memoria principal, el sistema puede mover páginas de memoria física a y desde un archivo de páginas en el disco. Cuando la página es movida en la memoria física, el sistema actualiza el mapa de páginas de los procesos afectados. Cuando el sistema necesita espacio en la memoria física, mueve las páginas recientemente usadas de memoria física al archivo de páginas. La manipulación de la memoria física por el sistema es completamente transparente para las aplicaciones, las cuales operan sólo en sus espacios de memoria virtual.
~~~~~~~~~~~~~~~~~~~~~~~ Estado de las páginas->>> ~~~~~~~~~~~~~~~~~~~~~~~
Las páginas de un espacio de dirección virtual de un proceso pueden estar en uno de los siguientes estados:
Libre Una página libre no está actualmente accesible, pero está disponible para ser encargada o reservada
Reservada Una página reservada es un bloque del espacio de dirección virtual de un proceso que ha sido fijado para usos futuros. El proceso no puede acceder a una página reservada, y no hay almacenamiento físico asociado con esta. Una página reservada reserva un rango de direcciones virtuales que no pueden ser usadas subsecuentemente por otras funciones de asignación. Un proceso puede usar la función VirtualAlloc para reservar páginas de su espacio de memoria y luego encargar las páginas reservadas. Puede usar VirtualFree para descargarlas.
Encargada Una página encargada es una para la cual ha sido asignado almacenamiento físico (en memoria o en el disco). Puede ser protegida para permitir o no el acceso o el acceso sólo-lectura, o puede tener acceso para lectura y escritura. Un proceso puede usar la función VirtualAlloc para asignar páginas encargadas. Las funciones GlobalAlloc y LocalAlloc asignan páginas encargadas con acceso para lectura-escritura. Una página encargada asignada por VirtualAlloc puede ser "desencargada" por la función VirtualFree, con la cual se descargan las páginas almacenadas y cambia el estado de la página a reservada.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Alcance de la Memoria Asignada->>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Toda la memoria que un proceso asigna usando las funciones de asignación de memoria de Win32 (HeapAlloc, VirtualAlloc, GlobalAlloc, LocalAlloc o sus equivalentes VLM) están accesibles sólo para los procesos. Sin embargo, la memoria asignada por una DLL está asignada en el espacio de direcciones del proceso que ha llamado a la DLL y no está accesible por otros procesos usando la misma DLL. Para crear memoria compartida, tenés que usar el mapeado de archivos (objetos file-mapping).
El mapeado de archivos con nombre, proporciona una manera fácil de crear un bloque de memoria compartida. Un proceso puede especificar un nombre cuando usa la función CreateFileMapping para crear un objeto file-mapping. Otros procesos pueden especificar el mismo nombre para cualquiera de las dos funciones CreateFileMapping u OpenFileMapping para obtener el controlador del objeto mapeado.
Cada proceso especifica su controlador del objeto file-mapping en la función MapViewOfFile para "mapear" o trazar una vista del archivo en su espacio de direcciones. Las vistas de todos los procesos para un objeto file-mapping simple son trazadas en las mismas páginas compartibles del almacenamiento físico. Sin embargo, las direcciones virtuales de las vistas trazadas pueden variar desde un proceso a otro, a menos que la función MapViewOfFileEx sea usada para trazar la vista en una dirección especificada. Aunque compartidas, las páginas de almacenamiento físico usadas por una vista de un objeto file-mapping no son globales; no están accesibles para los procesos que no tienen trazada una vista del archivo.
Cualquier página o páginas cargadas trazando una vista de un archivo son descargadas cuando el último proceso con una vista del objeto mapeado termine o "desmapee" su vista llamando a la función UnmapViewOfFile. En ese momento, el archivo especificado (si hay alguno) asociado con el objeto mapeado es actualizado. Un archivo especificado puede ser también forzado a actualizarse llamando a la función FlushViewOfFile.
Si múltiples subprocesos tienen acceso a escritura en la memoria compartida, vas a tener que sincronizar el acceso a la memoria.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Funciones de la Memoria Virtual->>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
La API de Win32 proporciona una serie de funciones de memoria virtual que habilitan a un proceso para manipular o determinar el estado de las páginas en su espacio de memoria virtual. Pueden realizar las siguientes operaciones:
* Reservar un rango del espacio de memoria virtual de un proceso. Reservando espacio de dirección no puede almacenar ningún almacenamiento físico, pero previene a otras operaciones de asignación que usen el rango especificado. Esto no afecta el espacio de direcciones virtual de otro proceso. Reservando páginas se previene el consumo de almacenamiento físico, habilita a un proceso para recibir un rango de su espacio de direcciones en el cual una estructura de datos dinámicos puede crecer. El proceso puede asignar almacenamiento físico para este espacio, como necesita.
* Encargar un rango de páginas reservadas en el espacio de direcciones virtuales de un proceso así que el almacenamiento físico (en la RAM o en el disco) está accesible
* Especificar el acceso de sólo-lectura, lectura-escritura o ningún acceso para un rango de páginas encargadas. Esto difiere de las funciones de asignación estándar en que siempre se asignan páginas con acceso para lectura-escritura.
* Liberar un rango de páginas reservadas, haciendo que el rango de direcciones virtuales esté disponible para operaciones de asignación subsecuentes del proceso llamador.
* Descargar un rango de páginas encargadas, descargando su almacenamiento físico y asíéndolo disponible para subsecuentes asignaciones de cualquier proceso.
* Bloquear una o más páginas de memoria encargada en la memoria física (RAM) así el sistema no podrá mover las páginas fuera del archivo de paginación.
* Obtener información acerca de un rango de páginas en el espacio de direcciones virtual del proceso llamador o del proceso especificado.
* Cambiar la protección de acceso para el rango especificado de páginas encargadas en el espacio de direcciones virtual del proceso llamador o del proceso especificado.
Para más información ver los siguientes temas:
* Asignando Memoria Virtual * Liberando la Memoria Virtual * Trabajando con Páginas
±±±±±±±±±±±±±±±±±±±±±±±±±±± Asignando Memoria Virtual ±±±±±±±±±±±±±±±±±±±±±±±±±±±
Las funciones de memoria virtual manipulan páginas memoria. Las funciones usan el tamaño de una página en la computadora actual para redondear los tamaños y direcciones especificados.
La función VirtualAlloc realiza una de las siguientes operaciones:
* Reserva una o más páginas libres * Encarga una o más páginas reservadas * Reserva y encarga una o más páginas libres
Se puede especificar la dirección inicial de las páginas para ser reservadas o encargadas, o se le puede permitir al sistema determinar la dirección. La función redondea la dirección especificada al límite de página apropiado. Las páginas reservadas no están accesibles, pero las páginas encargadas pueden ser asignadas con la opción PAGE_READWRITE, PAGE_READONLY o PAGE_NOACCESS. Cuando las páginas son encargadas, el almacenamiento es asignado en el archivo de paginación, pero cada página pero cada página es inicializada y cargada en la memoria física sólo al primer intento de escribir a o leer desde el archivo de paginación. Se pueden usar punteros normales a referencias para acceder a la memoria encargada usando la función VirtualAlloc.
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±± Liberando la Memoria Virtual ±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
La función VirtualFree realiza una de las siguientes operaciones:
* Reestablece una o más páginas encargadas, cambiando el estado de las páginas a reservadas. Reestableciendo páginas se descarga el almacenamiento físico asociado con las páginas, asíéndolo disponible para ser asignado por cualquier proceso. Cualquier bloque de memoria encargada puede ser reestablecida.
* Descarga un bloque de una o más páginas reservadas, cambiando el estado de las páginas a libres. Descargando un bloque de páginas hace que el rango de direcciones esté disponible para hacer asignado por el proceso. Las páginas reservadas pueden ser descargadas sólo liberando el bloque entero que fue inicialmente reservado por VirtualAlloc.
* Reestablece y descarga simultáneamente un bloque de una o más páginas encargadas, cambiando el estado de las páginas a libres. El bloque especificado debe incluir el bloque entero inicialmente reservado por VirtualAlloc, y todas las páginas deben estar actualmente encargadas.
±±±±±±±±±±±±±±±±±±±±±±±± Trabajando con Páginas ±±±±±±±±±±±±±±±±±±±±±±±±
Para determinar el tamaño de una página en la computadora actual, se usa la función GetSystemInfo.
Las funciones VirtualQuery y VirtualQueryEx devuelven información acerca de una región de páginas consecutivas comenzando desde una dirección especificada en el espacio de direcciones de un proceso. VirtualQuery devuelve información acerca de la memoria del proceso que llama a la función. VirtualQueryEx devuelve información acerca de la memoria en proceso especificado y es usada para soportar depuradores que necesitan información acerca de un proceso que está siendo depurado. La región de páginas está limitada por la dirección especificada redondeando hacia abajo al límite de página más cercano. Se extiende a través de todas las páginas subsecuentes con los siguientes atributos en común:
* El estado de todas las páginas es el mismo: encargadas, reservadas o libres.
* Si la página inicial no está libre, todas las páginas de la región son parte de la misma asignación inicial de las páginas que fueron reservadas por una llamada a VirtualAlloc.
* La protección de acceso de todas las páginas es la misma (esto es, la opción PAGE_READONLY, PAGE_READWRITE o PAGE_NOACCESS).
La función VirtualLock habilita a un proceso para bloquear una o más páginas de memoria encargada en la memoria física (RAM), previniendo al sistema de mover las páginas fuera del archivo de páginas. Esto puede ser usado para asegurar que los datos críticos están accesibles sin acceso al disco. Bloqueando páginas en memoria es peligroso porque restringe a la habilidad del sistema para manejar la memoria. El uso excesivo de VirtualLock puede degradar el rendimiento del sistema causando que el código ejecutable sea movido fuera del archivo de páginas. La función VirtualUnlock desbloquea la memoria bloqueada por VirtualLock.
La función VirtualProtect habilita a un proceso para modificar la protección de acceso de cualquier página encargada en el espacio de direcciones de un proceso. Por ejemplo, un proceso puede asignar páginas sólo-lectura para almacenar datos sensitivos, entonces puede cambiar el acceso a sólo-lectura o sin acceso para protegerlas contra una sobreescritura accidental. VirtualProtect es típicamente usada con páginas asignadas por VirtualAlloc, pero también puede trabajar con páginas encargadas por algunas de las otras funciones de asignación. Sin embargo, VirtualProtect cambia la protección de páginas enteras, y los punteros devueltos por las otras funciones no son necesariamente alineadas en los límites de páginas. La función VirtualProtectEx es similar a VirtualProtect, excepto que cambia la protección de la memoria en un proceso especificado. Cambiar la protección es útil para los depuradores al acceder a la memoria del proceso que están depurando.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Funciones de la Pila (Heap)->>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Las funciones de pila habilitan a un proceso para crear una pila privada, un bloque de un a o más páginas en el espacio de direcciones del proceso llamador. Entonces el proceso puede usar una serie separada de funciones para manejar la memoria en dicha pila. No hay diferencia entre la memoria asignada desde una pila privada y la asignada usando las otras funciones de asignación de memoria.
La función HeapCreate crea un objeto heap (pila) privado desde el cual el proceso que invoca la función puede asignar bloques de memoria usando la función HeapAlloc. HeapCreate especifica ambos, el tamaño inicial y el tamaño máximo de la pila. El tamaño inicial determina el número de páginas encargadas, de lectura-escritura inicialmente asignadas para la pila. El tamaño máximo determina el número total de páginas reservadas. Estas páginas crean un bloque contiguo en el espacio de direcciones virtuales del proceso en el cual la pila puede desarrollarse. Las páginas adicionales son encargadas automáticamente desde este espacio reservado si los requerimientos de HeapAlloc exceden el tamaño actual de páginas encargadas, asumiendo que el almacenamiento físico para esto está disponible. Una vez que las páginas están encargadas, no son reestablecidas hasta que el proceso es terminado o hasta que la pila es destruida llamando a la función HeapDestroy.
La memoria de un objeto heap privado está accesible sólo para el proceso que lo crea. Si una biblioteca de vínculos dinámicos (DLL) crea una pila privada, lo hace en el espacio de direcciones del proceso que llamó a la DLL. Este objeto sólo es accesible para ese proceso.
La función HeapAlloc asigna un número especificado de bytes desde una pila privada y devuelve un puntero al bloque asignado. El puntero identifica al bloque para que la función HeapFree lo descargue o para que la función HeapSize determine el tamaño.
La memoria asignada mediante HeapAlloc no es movible. A causa de que el sistema no puede compactar una pila privada, la pila puede quedar fragmentada.
Un uso posible para las funciones de pila es crear una pila privada cuando un proceso se inicia, especificando un tamaño inicial suficiente para satisfacer los requerimientos de memoria del proceso. Si la llamada a la función HeapCreate falla, el proceso puede terminarse o notificar al usuario de la escasez de memoria; si tiene éxito, sin embargo, el proceso debe está asegurado de estar teniendo la memoria que necesita.
La memoria requerida por HeapCreate puede o no estar contigua. La memoria asignada dentro de la pila por HeapAlloc es contigua. No se debería escribir a o leer desde la memoria en una pila excepto que esté asignada mediante HeapAlloc, ni se debería asumir cualquier relación entre dos áreas de memoria asignadas por HeapAlloc.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Funciones de Validación de Acceso->>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
La API de Win32 proporciona una serie de funciones que un proceso puede usar para verificar si tiene un tipo de acceso especificado a una dirección dada de memoria o rango de direcciones. Están disponibles las siguientes funciones de validación de acceso:
Función Descripción
IsBadCodePtr Determina si el proceso llamador tiene acceso de lectura a la memoria en la dirección especificada.
IsBadReadPtr Determina si el proceso llamador tiene acceso de lectura a la memoria en la dirección especificada.
IsBasStringPtr Determina si el proceso llamador tiene acceso de lectura a la memoria apuntada por un puntero de cadena terminada en nulo.
IsBasWritePtr Determina si el proceso llamador tiene acceso de escritura a la memoria en un rango de direcciones especificado.
Las funciones IsBadHugeReadPtr y IsBasHugeWritePtr también están disponibles para compatibilidad con versiones de Windows de 16 bits que distinguen entre la asignación normal de memoria y enormes asignaciones ocupando múltiples segmentos. En versiones de Windows de 32 bits, estas funciones son equivalentes a IsBadReadPtr y IsBasWritePtr.
En un entorno de multitarea preventiva, es posible para algún otro subproceso cambiar el acceso del proceso a la memoria que está siendo probada. Incluso cuando una función de validación de acceso indique que el proceso tiene el acceso deseado a la memoria especificada, se deberían usar controladores de excepciones estructurados (Structured Exception Handling) cuando se intenta acceder la memoria. El uso de controladores de excepciones estructurados habilita al sistema para notificarle al proceso si ocurre una excepción de violación de acceso, dándole al proceso una oportunidad para controlar la excepción. Para más información ver Controladores de Excepción Estructurados.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Funciones Globales y Locales->>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Las funciones globales y locales son las funciones de pila de Windows de 16 bits. El administrador de memoria de Win32 soporta estas funciones para compatibilidad con Windows de 16 bits, o para mantener compatibilidad de código con Windows de 16 bits. Las funciones globales y locales son más lentas que las nuevas funciones del administrador de memoria y no proporciona muchas características. Por eso, las nuevas aplicaciones no deberían usar estas funciones.
Un proceso puede usar las funciones GlobalAlloc y LocalAlloc para asignar memoria. El administrador de memoria de Win32 no proporciona una pila global y una pila local por separadas, como lo hace Windows de 16 bits. Como resultado, no hay diferencia entre los objetos de memoria asignados mediante estas funciones. Además, el cambio desde el modelo de memoria segmentada de 16 bits al modelo de memoria virtual de 32 bits han hecho a algunas de las funciones globales y locales relacionadas y a sus opciones innecesarias o sin sentido. Por ejemplo, ya no hay punteros cercanos y lejanos, porque ambas, asignaciones globales y locales devuelven direcciones virtuales de 32 bits.
Los objetos de memoria asignados mediante GlobalAlloc y LocalAlloc están en privado, páginas encargadas que tienen acceso de lectura-escritura y que no pueden ser accedidas por otros procesos. La memoria asignada usando GlobalAlloc usando la opción GMEM_DDESHARE no está actualmente compartida como sí lo está en Windows de 16 bits. Sin embargo, esta opción está disponible para propósitos de compatibilidad y puede ser usada por algunas aplicaciones para reforzar el rendimiento de las operaciones del intercambio de datos dinámicos (DDE) (Dynamic Data Exchange). Las aplicaciones que requieren memoria compartida para otros propósitos deben usar objetos file-mapping. Múltiples procesos pueden trazar una vista del mismo objeto file-mapping para proporcionar memoria compartida con nombre. Para más información ver Objetos File-Mapping.
Usando GlobalAlloc y LocalAlloc se puede asignar un bloque de memoria de cualquier tamaño que pueda ser representado por 32 bits. Está limitado sólo por la memoria física disponible, incluyendo el almacenamiento en el archivo de paginación en el disco. En Windows de 16 bits, cuando se asigna un objeto de memoria fija, GlobalAlloc y LocalAlloc devuelven un puntero de 32 bits que el proceso llamador puede usar inmediatamente para acceder a la memoria. Cuando se asigna memoria usando la opción GMEM_MOVEABLE, el valor devuelto es un controlador. Para obtener un puntero al objeto de memoria movible, se usan las funciones GlobalLock y LocalLock.
El tamaño actual de la memoria asignada mediante GlobalAlloc y LocalAlloc puede ser mayor que el tamaño requerido. Para determinar el número de bytes asignados actualmente, se usa la función GlobalSize o LocalSize. Si la cantidad asignada es más grande que la cantidad requerida, el proceso puede usar la cantidad entera.
Las funciones GlobalReAlloc y LocalReAlloc cambian el tamaño, en bytes, o los atributos de un objeto de memoria asignado mediante GlobalAlloc y LocalAlloc. El tamaño puede incrementarse o disminuir.
Las funciones GlobalFree y LocalFree descargar la memoria asignada mediante GlobalAlloc y LocalAlloc, GlobalReAlloc y LocalReAlloc.
Otras funciones globales y locales incluyen las funciones GlobalDiscard, LocalDiscard, GlobalFlags, LocalFlags, GlobalHandle y LocalHandle. Para suprimir el objeto de memoria especificado sin invalidar el controlador, se usa GlobalDiscard o LocalDiscard. El controlador puede ser usado luego por GlobalReAlloc o LocalReAlloc para asignar un nuevo bloque de memoria asociado con el mismo controlador. Para obtener información acerca de un objeto de memoria especificado se usa GlobalFlags o LocalFlags. La información incluye el conteo de bloqueos del objeto e indica si el objeto es desechable o si ha sido ya desechado. Para obtener el controlador de un objeto de memoria se usa GlobalHandle y LocalHandle.
|
|
|
|
|
En línea
|
A la reina de las profundidades que cuida los pasos de una sombra en la noche :*
|
|
|
|
Páginas: [1]
|
|
|
|