title: Espacio de direcciones virtuales
text: # Espacio de direcciones virtuales
  
  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. El rango de direcciones virtuales generalmente comienza en una dirección baja y puede extenderse a la dirección más alta permitido 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 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 del proceso, suponiendo que a cada proceso se le dé un espacio de direcciones separado.
  
  # Espacio de direcciones virtuales
  ## 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 de memoria virtual.
  Cuando se ejecuta una nueva aplicación en un SO 32 bits, el proceso tiene un VAS de 4 GiB: cada una de las direcciones de memorias (desde 0 a 2$^{32}$ − 1) en ese espacio puede tener un solo byte como valor. Inicialmente, ninguna de ellas tiene valores ('-' representa ningún valor). El uso o la configuración de valores en un VAS de este tipo provocaría una excepción de memoria.
  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 sistema operativo gestiona la asignación:
  Las v son valores de bytes en el archivo mapeado. Luego, se asignan los archivos DLL requeridos (esto incluye bibliotecas personalizadas y del sistema, como kernel32.dll y user32.dll):
  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 asignarla al archivo de página. El archivo de página es un solo archivo, pero se pueden asignar múltiples conjuntos distintos de bytes contiguos en un VAS:
  Y diferentes partes del archivo de la página pueden mapearse en el VAS de diferentes procesos:
  En Microsoft Windows de 32 bits, de forma predeterminada, solo 2 GiB están disponibles para los procesos para su propio uso. Los otros 2 GiB son utilizados por el sistema operativo. En ediciones posteriores de 32 bits de Microsoft Windows, es posible ampliar el espacio de direcciones virtuales en modo 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.
  En Microsoft Windows de 64 bits, en un proceso que ejecuta un ejecutable que estaba vinculado 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 a los ejecutables de 32 y 64 bits. Procesos que ejecutan ejecutables vinculados con la opción /LARGEADDRESSAWARE:YES, que es el predeterminado para Visual Studio 2010 de 64 bits y versiones posteriores, tener 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 posteriores.
  La asignación de memoria a través de la malloc del lenguaje C establece el archivo de página como almacén de respaldo para cualquier nuevo espacio de direcciones virtuales. Sin embargo, un proceso también puede mapear explícitamente bytes de archivo.
  
  # Espacio de direcciones virtuales
  ## Linux
  
  Para las CPU x86, el 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/núcleo.