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 generalmente comienza en una dirección baja y puede extenderse a 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 32 bits o 8 bytes para versiones de SO de 64 bits . Esto proporciona varios beneficios, uno de los cuales es la seguridad medianteaislamiento de procesos asumiendo que a cada proceso se le da un espacio de direcciones separado .
Ejemplo
- En la siguiente descripción, la terminología utilizada será particular del sistema operativo Windows NT , pero los conceptos son aplicables a otros sistemas operativos de memoria virtual.
Cuando se ejecuta una nueva aplicación en un SO 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, ninguno de ellos tiene valores ('-' no representa ningún valor). El uso o la configuración de valores en tal VAS causaría una excepción de memoria .
0 4 GiBVAS | ---------------------------------------------- |
Luego, el archivo ejecutable de la aplicación se asigna al VAS. Las direcciones en el proceso VAS se asignan a bytes en el archivo exe. El SO gestiona el mapeo:
0 4 GiBVAS | --- vvvvvvv ------------------------------------ |mapeo | ----- |archivo bytes app.exe
Las v son valores de bytes en el archivo mapeado . Luego, se asignan los archivos DLL requeridos (esto incluye bibliotecas personalizadas, así como las del sistema, como kernel32.dll y user32.dll ):
0 4 GiBVAS | --- vvvvvvv ---- vvvvvv --- vvvv ------------------- |mapeo ||||||| |||||| ||||archivo bytes app.exe usuario del kernel
Luego, el proceso comienza 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 sistema operativo que los asigne a bytes de un archivo. Una forma común de usar la memoria VAS de esta manera es mapearla al archivo de paginación . El archivo de paginación es un solo archivo, pero se pueden mapear varios conjuntos distintos de bytes contiguos en un VAS:
0 4 GiBVAS | --- vvvvvvv ---- vvvvvv --- vvvv ---- vv --- v ---- vvv-- |mapeo ||||||| |||||| |||| || | |||archivo bytes app.exe usuario del kernel system_page_file
Y diferentes partes del archivo de página pueden mapearse en el VAS de diferentes procesos:
0 4 GiBVAS 1 | --- vvvv ------- vvvvvv --- vvvv ---- vv --- v ---- vvv-- |mapeo |||| |||||| |||| || | |||archivo bytes app1 app2 usuario del kernel system_page_filemapeo |||| |||||| |||| || |VAS 2 | -------- vvvv - vvvvvv --- vvvv ------- vv --- v ------ |
En Microsoft Windows de 32 bits, de forma 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 en modo de usuario a 3 GiB, mientras que solo queda 1 GiB para el espacio de direcciones virtuales en modo kernel marcando los programas como IMAGE_FILE_LARGE_ADDRESS_AWARE y habilitando el modificador / 3GB en el archivo boot.ini. [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 parte del modo de usuario del espacio de direcciones virtuales del proceso a 2 GiB. Esto se aplica tanto a los ejecutables de 32 como a los de 64 bits. [5] [6] Los procesos que ejecutan ejecutables que se vincularon con la opción / LARGEADDRESSAWARE: YES, que es la opción 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: Arriba 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 a través del malloc de C establece el archivo de paginación como el almacén de respaldo para cualquier nuevo espacio de direcciones virtuales. Sin embargo, un proceso también puede asignar explícitamente bytes de archivo.
Linux
Para x86 CPUs, Linux de 32 bits permite dividir los intervalos de usuario y la dirección del núcleo de diferentes maneras: 3G / 1G usuario / kernel (predeterminado), 1G / 3G usuario / kernel o 2G / 2G usuario / kernel . [9]
Ver también
Notas
- ^ Corporación IBM. "¿Qué es un espacio de direcciones?" . Consultado el 24 de agosto de 2013 .
- ^ "Espacio de direcciones virtual" . MSDN . Microsoft.
- ^ "Estructura LOADED_IMAGE" . MSDN . Microsoft.
- ^ a b "Ajuste de 4 Gigabytes: BCDEdit y Boot.ini" . MSDN . Microsoft.
- ^ "/ LARGEADDRESSAWARE (Manejar direcciones grandes)" . MSDN . Microsoft.
- ^ "Espacio de direcciones virtual" . MSDN . Microsoft.
- ^ "/ LARGEADDRESSAWARE (Manejar direcciones grandes)" . MSDN . Microsoft.
- ^ "/ LARGEADDRESSAWARE (Manejar direcciones grandes)" . MSDN . Microsoft.
- ^ "Núcleo de Linux - x86: División de memoria" .
Referencias
- " Windows avanzado " por Jeffrey Richter , Microsoft Press