En informática , un espacio de direcciones virtuales ( VAS ) o espacio de direcciones es el conjunto de rangos de direcciones virtuales que un sistema operativo pone a disposición de un proceso. [1] El rango de direcciones virtuales suele comenzar en una dirección baja y puede extenderse hasta la dirección más alta permitida por la arquitectura del conjunto de instrucciones de la computadora 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 varios beneficios, uno de los cuales es la seguridad a través del aislamiento de procesos asumiendo que a cada proceso se le da un espacio de direcciones separado .
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 32 − 1) en ese espacio puede tener un solo byte como valor. Inicialmente, ninguna de ellas tiene valores ('-' representa que no hay valor). El uso o la configuración de valores en un VAS de este tipo provocaría una excepción de memoria .
0 4 GBEVA |----------------------------------------------|
A continuación, el archivo ejecutable de la aplicación se asigna al VAS. Las direcciones del VAS del proceso se asignan a bytes en el archivo exe. El SO administra la asignación:
0 4 GBVAS |---vvv----------------------------------------|mapeo |||aplicación de bytes de archivo
Las v son valores de bytes en el archivo asignado . Luego, se asignan los archivos DLL necesarios (esto incluye bibliotecas personalizadas y del sistema, como kernel32.dll
y user32.dll
):
0 4 GBVAS |---vvv--------vvvvvv---vvvv-------------------|mapeo ||| |||||| ||||archivo bytes 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 pedirle al SO que los asigne a bytes de un archivo. Una forma común de usar la memoria VAS de esta manera es asignarla al archivo de paginación . El archivo de paginación es un solo archivo, pero se pueden asignar múltiples conjuntos distintos de bytes contiguos a un VAS:
0 4 GBVAS |---vvv--------vvvvvv---vvvv----vv---v----vvv--|mapeo ||| |||||| |||| || |||archivo bytes aplicación kernel usuario sistema_página_archivo
Y diferentes partes del archivo de página pueden mapearse en el VAS de diferentes procesos:
0 4 GBVAS 1 |---vvvv-------vvvvvv---vvvv----vv---v----vvv--|mapeo |||||||||| |||| ||| |||archivo bytes app1 app2 kernel usuario system_page_filemapeo |||| |||||| |||| || |VAS 2 |--------vvvv--vvvvvv---vvvv-------vv---v------|
En Microsoft Windows de 32 bits, de manera predeterminada, solo 2 GiB están disponibles para los procesos para su propio uso. [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 del modo usuario a 3 GiB mientras que solo 1 GiB queda para el espacio de direcciones virtuales del modo kernel marcando los programas como IMAGE_FILE_LARGE_ADDRESS_AWARE y habilitando el /3GB
modificador en el archivo boot.ini. [3] [4]
En Microsoft Windows de 64 bits, en un proceso que ejecuta un ejecutable que se vinculó con /LARGEADDRESSAWARE:NO
, el sistema operativo limita artificialmente la porción del modo de usuario del espacio de direcciones virtuales del proceso a 2 GiB. Esto se aplica tanto a los ejecutables de 32 como de 64 bits. [5] [6] Los procesos que ejecutan ejecutables que se vincularon con la /LARGEADDRESSAWARE:YES
opció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 malloc de C establece el archivo de paginación como el almacenamiento de respaldo para cualquier nuevo espacio de dirección virtual. Sin embargo, un proceso también puede asignar bytes de archivo explícitamente.
Para las CPU x86 , Linux de 32 bits 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]