Espacios de direcciones virtuales
Los procesadores usan direcciones virtuales al leer o escribir en ubicaciones de memoria. Durante estas operaciones, el procesador traduce la dirección virtual en una física.
Hay varias ventajas para acceder a la memoria mediante direcciones virtuales:
Un programa puede usar un intervalo contiguo de direcciones virtuales para acceder a un búfer de memoria grande y no contigua en memoria física.
Un programa puede usar un intervalo de direcciones virtuales para acceder a un búfer de memoria mayor que la memoria física disponible. Cuando la memoria física es baja, el administrador de memoria guarda páginas de memoria física (normalmente de 4 kilobytes de tamaño) en un archivo de disco. El sistema mueve páginas de datos o código entre la memoria física y el disco según sea necesario.
Las direcciones virtuales usadas por diferentes procesos están aisladas. El código de un proceso no puede modificar la memoria física que usa otro proceso o el sistema operativo.
El intervalo de direcciones virtuales que está disponible para un proceso se conoce como espacio de direcciones virtuales del proceso. Cada proceso en modo de usuario tiene su propio espacio de direcciones virtuales privadas.
Un proceso de 32 bits normalmente tiene un espacio de direcciones virtual dentro del intervalo de 2 gigabytes 0x00000000 a través de 0x7FFFFFFF.
Un proceso de 64 bits en Windows de 64 bits tiene un espacio de direcciones virtual dentro del intervalo de 128 bits 0x000'000000000 a 0x7FFF'FFFFFFFF.
A veces, un intervalo de direcciones virtuales se denomina intervalo de memoria virtual. Para obtener más información, vea Límites de espacio de direcciones y memoria.
En el diagrama siguiente se muestran algunas características clave de los espacios de direcciones virtuales.
En el diagrama se muestran los espacios de direcciones virtuales para dos procesos de 64 bits: Notepad.exe y MyApp.exe. Cada proceso tiene su propio espacio de direcciones virtuales, que va desde 0x000'0000000 hasta 0x7FF'FFFFFFFF. Cada bloque sombreado representa una página (4 kilobytes de tamaño) de memoria virtual o física. El proceso del Bloc de notas usa tres páginas contiguas de direcciones virtuales, empezando por 0x7F7'939500000. Sin embargo, estas tres páginas contiguas de direcciones virtuales se asignan a páginas no contiguas en memoria física. Además, ambos procesos usan una página de memoria virtual a partir de 0x7F7'93950000, pero estas páginas virtuales se asignan a diferentes páginas de memoria física.
Espacio de usuario y espacio del sistema
Los procesos como Notepad.exe y MyApp.exe se ejecutan en modo de usuario. Los componentes principales del sistema operativo y muchos controladores se ejecutan en el modo kernel con más privilegios. Para obtener más información sobre los modos de procesador, consulte Modo de usuario y modo kernel.
Cada proceso en modo de usuario tiene su propio espacio de direcciones virtuales privadas, pero todo el código que se ejecuta en modo kernel comparte un único espacio de direcciones virtuales denominado espacio del sistema. El espacio de direcciones virtuales para un proceso en modo de usuario se denomina espacio de usuario.
En Windows de 32 bits, el espacio total de direcciones virtuales disponible es de 2^32 bytes (4 gigabytes). Normalmente, los 2 gigabytes inferiores se usan para el espacio del usuario y los 2 gigabytes superiores se usan para el espacio del sistema.
En Windows de 32 bits, puede especificar (en tiempo de arranque) que hay más de 2 gigabytes disponibles para el espacio del usuario. Sin embargo, esto significa que hay menos direcciones virtuales disponibles para el espacio del sistema. Puede aumentar el tamaño del espacio de usuario a hasta 3 gigabytes, dejando solo 1 gigabyte para el espacio del sistema. Para aumentar el tamaño del espacio de usuario, use BCDEdit /set increaseuserva.
En Windows de 64 bits, la cantidad teórica de espacio de direcciones virtuales es de 2^64 bytes (16 exabytes), pero solo se usa realmente una pequeña parte del intervalo de 16 exabytes.
El código que se ejecuta en modo de usuario puede acceder al espacio del usuario, pero no al espacio del sistema. Esta restricción impide que el código en modo de usuario lea o modifique las estructuras de datos del sistema operativo protegido. El código que se ejecuta en modo kernel puede acceder tanto al espacio de usuario como al espacio del sistema. Es decir, el código que se ejecuta en modo kernel puede acceder al espacio del sistema y al espacio de direcciones virtuales del proceso actual del modo de usuario.
Los controladores que se ejecutan en modo kernel deben tener cuidado al leer o escribir directamente en direcciones en el espacio del usuario. En el escenario siguiente se muestra por qué.
Un programa en modo de usuario inicia una solicitud para leer algunos datos de un dispositivo. El programa proporciona la dirección inicial de un búfer para recibir los datos.
Una rutina de controlador de dispositivo, que se ejecuta en modo kernel, inicia la operación de lectura y devuelve el control al autor de la llamada.
Más adelante, el dispositivo interrumpe el subproceso que se está ejecutando actualmente para indicar que se ha completado la operación de lectura. Las rutinas del controlador en modo kernel controlan la interrupción en este subproceso arbitrario, que pertenece a un proceso arbitrario.
En este momento, el controlador no debe escribir los datos en la dirección inicial que el programa en modo de usuario proporcionó en el paso 1. Esta dirección se encuentra en el espacio de direcciones virtuales del proceso que inició la solicitud, lo que probablemente no es el mismo que el proceso actual.
Grupo paginado y grupo no paginado
En el espacio de usuario, todas las páginas de memoria física se pueden paginar en un archivo de disco según sea necesario. En el espacio del sistema, algunas páginas físicas se pueden paginar y otras no. El espacio del sistema tiene dos regiones para asignar memoria dinámicamente: grupo paginado y grupo no paginado.
La memoria asignada en el grupo paginado se puede paginar en un archivo de disco según sea necesario. La memoria asignada en un grupo no paginado nunca se puede paginar en un archivo de disco.