
En informática , un espacio de direcciones virtuales ( VAS ) es un área de ubicaciones de memoria virtual contiguas, llamadas direcciones virtuales , que un sistema operativo pone a disposición de un proceso para ejecutar instrucciones y almacenar datos, y que asigna al espacio de direcciones físicas en la memoria del hardware de un ordenador. [ 1 ] El rango de direcciones virtuales generalmente comienza en una dirección baja y puede extenderse hasta la dirección más alta permitida por la arquitectura del conjunto de instrucciones del ordenador y compatible con la implementación del tamaño del puntero del sistema operativo , que puede ser de 4 bytes para versiones de SO de 32 bits u 8 bytes para versiones de SO de 64 bits . Esto proporciona varias ventajas, incluida la seguridad mediante el aislamiento de procesos , suponiendo que a cada proceso se le asigna un espacio de direcciones separado.
Ejemplo
- En la siguiente descripción, la terminología utilizada será específica del sistema operativo Windows NT , pero los conceptos son aplicables a otros sistemas operativos con memoria virtual .
Cuando se ejecuta una nueva aplicación en un sistema operativo de 32 bits , el proceso tiene un VAS de 4 GiB : cada una de las direcciones de memoria (de 0 a 2³² − 1) en ese espacio puede tener un solo byte como valor. Inicialmente, ninguna de ellas tiene valores ( -representa la ausencia de valor). Usar o establecer valores en dicho VAS provocaría una excepción de memoria .
0 4 GiB EVA |----------------------------------------------|
Luego, el archivo ejecutable de la aplicación se asigna al VAS. Las direcciones en el VAS del proceso se asignan a bytes en el archivo EXE . El sistema operativo gestiona la asignación:
0 4 GiB VAS |---vvv----------------------------------------| mapeo ||| aplicación de bytes de archivo
El símbolo vrepresenta valores de bytes en el archivo mapeado . A continuación, se mapean los archivos DLL necesarios (esto incluye bibliotecas personalizadas además de las bibliotecas del sistema, como kernel32.dlly user32.dll):
0 4 GiB VAS |---vvv--------vvvvvv---vvvv-------------------| mapeo ||| |||||| |||| bytes de archivo aplicación kernel usuario
El proceso comienza entonces a ejecutar bytes en el archivo EXE. Sin embargo, la única forma en que el proceso puede usar o establecer -valores en su VAS es solicitando al sistema operativo que los asigne a bytes de un archivo. Una forma común de usar la memoria VAS de esta manera es asignándola al archivo de paginación . El archivo de paginación es un solo archivo, pero se pueden asignar varios conjuntos distintos de bytes contiguos a un VAS:
0 4 GiB VAS |---vvv--------vvvvvv---vvvv---vv-----v----vvv-| mapeo ||| |||||| |||| || | ||| bytes de archivo aplicación kernel usuario archivo_de_página_del_sistema
Y diferentes partes del archivo de paginación pueden asignarse al VAS de diferentes procesos:
0 4 GiB VAS |---vvvv-------vvvvvv---vvvv---vv-----v----vvv-| mapeo |||| |||||| |||| || | ||| bytes de archivo aplicación1 aplicación2 kernel usuario archivo_de_página_del_sistema mapeo |||| |||||| |||| || | VAS 2 |--------vvvv--vvvvvv---vvvv-------vv----v-----|
En Microsoft Windows de 32 bits, por defecto, solo 2 GiB están disponibles para que los procesos los utilicen. [ 2 ] Los otros 2 GiB son utilizados por el sistema operativo. En ediciones posteriores de 32 bits de Microsoft Windows, es posible extender el espacio de direcciones virtuales en modo usuario a 3 GiB , dejando solo 1 GiB para el espacio de direcciones virtuales en modo kernel, marcando los programas como IMAGE_FILE_LARGE_ADDRESS_AWAREy habilitando el /3GBinterruptor en el boot.iniarchivo. [ 3 ] [ 4 ]
En Microsoft Windows de 64 bits, en un proceso que ejecuta un ejecutable vinculado con /LARGEADDRESSAWARE:NO, el sistema operativo limita artificialmente la porción del espacio de direcciones virtuales del proceso en modo de usuario a 2 GiB. Esto se aplica tanto a ejecutables de 32 como de 64 bits. [ 5 ] [ 6 ] Los procesos que ejecutan ejecutables vinculados con la /LARGEADDRESSAWARE:YESopción, que es la predeterminada para Visual Studio 2010 de 64 bits y versiones posteriores, [ 7 ] tienen acceso a más de 2 GiB de espacio de direcciones virtuales: hasta 4 GiB para ejecutables de 32 bits, hasta 8 TiB para ejecutables de 64 bits en Windows hasta Windows 8, y hasta 128 TiB para ejecutables de 64 bits en Windows 8.1 y versiones posteriores. [ 4 ] [ 8 ]
La asignación de memoria mediante la función malloc de C establece el archivo de paginación como almacenamiento subyacente para cualquier nuevo espacio de direcciones virtuales. Sin embargo, un proceso también puede asignar explícitamente bytes de archivo.
Linux
Para las CPU x86 de 32 bits, Linux permite dividir los rangos de direcciones de usuario y kernel de diferentes maneras: 3G/1G usuario/kernel (predeterminado), 1G/3G usuario/kernel o 2G/2G usuario/kernel . [ 9 ]
Véase también
Referencias
- ↑ "¿Qué es un espacio de direcciones?" . IBM . Consultado el 5 de mayo de 2024 .
- ↑ "Espacio de direcciones virtuales" . MSDN . Microsoft.
- ↑ "Estructura LOADED_IMAGE" . MSDN . Microsoft.
- 1 2 "Optimización de 4 gigabytes: BCDEdit y Boot.ini" . MSDN . Microsoft.
- ↑ "/LARGEADDRESSAWARE (Manejar direcciones grandes)" . MSDN . Microsoft.
- ↑ "Espacio de direcciones virtuales" . MSDN . Microsoft.
- ↑ "/LARGEADDRESSAWARE (Manejar direcciones grandes)" . MSDN . Microsoft.
- ↑ "/LARGEADDRESSAWARE (Manejar direcciones grandes)" . MSDN . Microsoft.
- ↑ "Núcleo de Linux - x86: División de memoria" . git.kernel.org .
Lecturas adicionales
- Richter, Jeffrey. Windows avanzado . Microsoft Press.
- Memoria virtual