Un sistema operativo de computadora moderno generalmente utiliza memoria virtual para proporcionar espacios de direcciones separados o regiones separadas de un único espacio de direcciones, llamado espacio de usuario y espacio de kernel . [1] [a] Principalmente, esta separación sirve para proporcionar protección de memoria y protección de hardware contra comportamiento de software malicioso o erróneo.
El espacio del núcleo está estrictamente reservado para ejecutar un núcleo de sistema operativo privilegiado , extensiones del núcleo y la mayoría de los controladores de dispositivos . Por el contrario, el espacio del usuario es el área de memoria donde se ejecutan el software de aplicación y algunos controladores, normalmente un espacio de dirección por proceso.
El término espacio de usuario (o userland ) se refiere a todo el código que se ejecuta fuera del núcleo del sistema operativo. [2] El espacio de usuario generalmente se refiere a los diversos programas y bibliotecas que el sistema operativo utiliza para interactuar con el núcleo: software que realiza entrada/salida , manipula objetos del sistema de archivos , software de aplicación , etc.
Cada proceso del espacio de usuario normalmente se ejecuta en su propio espacio de memoria virtual y, a menos que se permita explícitamente, no puede acceder a la memoria de otros procesos. Esta es la base de la protección de la memoria en los sistemas operativos actuales y un componente básico para la separación de privilegios . También se puede utilizar un modo de usuario independiente para crear máquinas virtuales eficientes; consulte los requisitos de virtualización de Popek y Goldberg . Con suficientes privilegios, los procesos pueden solicitar al núcleo que asigne parte del espacio de memoria de otro proceso al suyo propio, como es el caso de los depuradores . Los programas también pueden solicitar regiones de memoria compartida con otros procesos, aunque también hay otras técnicas disponibles para permitir la comunicación entre procesos .
La forma más común de implementar un modo de usuario separado del modo kernel implica anillos de protección del sistema operativo . Los anillos de protección, a su vez, se implementan utilizando modos de CPU . Por lo general, los programas del espacio kernel se ejecutan en modo kernel , también llamado modo supervisor ; las aplicaciones normales en el espacio de usuario se ejecutan en modo usuario.
Algunos sistemas operativos tienen un único espacio de direcciones , es decir, un único espacio de direcciones para todo el código en modo usuario (el código en modo kernel puede estar en el mismo espacio de direcciones o en un segundo espacio de direcciones). Otros sistemas operativos tienen un espacio de direcciones por proceso, con un espacio de direcciones independiente para cada proceso en modo usuario.
Otro enfoque adoptado en los sistemas operativos experimentales es tener un único espacio de direcciones para todo el software y confiar en la semántica de un lenguaje de programación para asegurarse de que no se pueda acceder a la memoria arbitraria: las aplicaciones no pueden adquirir ninguna referencia a los objetos a los que no tienen permitido acceder. [4] [5] Este enfoque se ha implementado en JXOS , Unununium y el proyecto de investigación Singularity de Microsoft .