Si escribo un programa que intenta leer la memoria en todas las direcciones posibles, y lo ejecuto en un Unix "completo", no podrá acceder a toda la RAM física. Pero, ¿cómo evita el sistema operativo que lo haga?
Estoy más familiarizado con pequeñas arquitecturas de CPU donde cualquier parte del código de ensamblaje puede acceder a todo. No entiendo cómo un programa (el núcleo) puede detectar tales operaciones maliciosas.
Respuestas:
No es el núcleo lo que impide los malos accesos a la memoria, es la CPU. La función del núcleo es solo configurar la CPU correctamente.
Más precisamente, el componente de hardware que evita los malos accesos a la memoria es la MMU . Cuando un programa accede a una dirección de memoria, la CPU decodifica la dirección en función del contenido de la MMU. La MMU establece una traducción de direcciones virtuales a direcciones físicas: cuando la CPU carga o almacena en una determinada dirección virtual, calcula la dirección física correspondiente en función del contenido de MMU. El kernel establece la configuración de MMU de tal manera que cada programa solo puede acceder a la memoria a la que tiene derecho. Los registros de memoria y hardware de otros programas no están asignados en absoluto en la memoria de un programa: estas direcciones físicas no tienen una dirección virtual correspondiente en la configuración MMU para ese programa.
En un cambio de contexto entre diferentes procesos, el núcleo modifica la configuración de MMU para que contenga la traducción deseada para el nuevo proceso.
Algunas direcciones virtuales no se asignan en absoluto, es decir, la MMU las traduce a un valor especial de "no existe tal dirección". Cuando el procesador desreferencia una dirección no asignada, esto causa una trampa: el procesador se bifurca a una ubicación predefinida en el código del núcleo. Algunas trampas son legítimas; por ejemplo, la dirección virtual podría corresponder a una página que está en el espacio de intercambio , en cuyo caso el código del núcleo cargará el contenido de la página del intercambio y luego volverá al programa original de tal manera que la instrucción de acceso a la memoria se ejecute nuevamente. Otras trampas no son legítimas, en cuyo caso el proceso recibe una señal que, por defecto, mata al programa inmediatamente (y si no se bifurca al controlador de señal en el programa: en cualquier caso, la instrucción de acceso a la memoria no se completa).
fuente