Función de la MMU en un intercambio de fallos de página

0

Cuando se hace referencia a una dirección de memoria virtual fuera del rango de RAM cargada y se produce un error de página, ¿la Unidad de administración de memoria depende de DMA (acceso directo a memoria) para intercambiar la página a la RAM, o es una rutina de interrupción? ¿Que utiliza la CPU para copiar en la memoria de una manera más mundana?

Asume la arquitectura x86, por favor.

    
pregunta Padawan Learner

2 respuestas

3

En general, la MMU simplemente notifica a la CPU un error de página. Depende de la CPU resolver el problema y luego actualizar las tablas MMU para que se pueda reiniciar el acceso.

La CPU generalmente resuelve el problema al iniciar una o más operaciones de E / S en el almacenamiento de respaldo, que generalmente es un disco local de algún tipo, pero en algunos casos puede ser un disco remoto al que se accede a través de la red. Si la página que se está reemplazando está "sucia" (debe escribirse), esto debe ocurrir antes de que se lea la página deseada. Esta E / S puede o no involucrar a DMA. El punto es que este proceso es demasiado complicado para implementarlo directamente en el hardware.

Es un requisito clave que cualquier procesador que admita memoria virtual debe poder suspender y reiniciar un acceso que tenga un error de página. Muchos microprocesadores tempranos (por ejemplo, 68000, 8086) no tenían esta capacidad, lo que lo hacía muy difícil, si no imposible.

    
respondido por el Dave Tweed
3

Como explicó Dave Tweed, el proceso de manejar un error de página es demasiado complejo como para haberlo hecho completamente en hardware.

La MMU tiene una relación muy estrecha con la CPU.

La MMU 'interrumpe' la CPU en instrucción intermedia . Esto a veces se llama una 'excepción de fallo de página'. Esta relación es mucho más cercana que las interrupciones normales. AFAIK, ninguna CPU acepta una interrupción externa en la mitad de la instrucción.

Una excepción de error de página hace que la CPU 'retroceda' o 'vacíe' para la instrucción que usó la dirección de memoria virtual no válida. Esto es crítico porque la instrucción tendrá que 'volver a ejecutarse' (es decir, ejecutarse otra vez ), si la dirección virtual es válida, y su página se carga en la RAM.

El primer paso para manejar un error de página es decidir si el acceso a la dirección virtual es válido y parte del espacio de direcciones de los procesos. La dirección podría ser válida, por ejemplo, podría ser un código de programa, pero el acceso podría ser una escritura, mientras que la página se ejecuta solo, para proteger el código de daños. Por lo tanto, el acceso podría fallar allí, el proceso fue "eliminado" por el sistema operativo, y eso se burbujeará hasta el proceso principal (por ejemplo, un shell).

Suponiendo que el acceso es correcto y que la dirección de la memoria virtual es válida, entonces el sistema operativo elige una página de RAM para usar para la página que falta. El sistema operativo puede decidir "desalojar" una página para dejar espacio para la página faltante porque toda la RAM está en uso. Si está utilizando una computadora en la que esto sucede, el dwn lento puede ser muy notable. Peor aún, es posible que el sistema operativo deba elegir una página para "desalojar", que a su vez contiene datos que no se encuentran en el almacenamiento externo, una página de "datos". Esto se evita tanto como sea práctico, ya que puede requerir dos transferencias de E / S, una para guardar la página desalojada de la RAM en el almacenamiento externo y otra para cargar la página faltante en la RAM. El código del programa es (en sistemas operativos normales) de solo lectura. Por lo tanto, el desalojo de una página de solo lectura no requiere un código de guardado porque ya está en un almacenamiento externo, y solo necesita una operación de E / S para leer la página que falta.

El sistema operativo ahora puede iniciar las transferencias de E / S. En el almacenamiento de disco típico, esto tomará varios milisegundos, tiempo suficiente para que la CPU ejecute varios millones de instrucciones. Así que el sistema operativo no espera a que se cargue la página que falta. En su lugar, se ejecuta un proceso diferente. Por lo general, la página leída del disco, o tienda externa, se coloca en la memoria mediante DMA. Sin embargo, se ejecutaron muchas instrucciones de la máquina para llegar a ese punto.

Finalmente, la transferencia de E / S se completa y la página está en la RAM; el sistema operativo recibió una interrupción de DMA para informarle que la transferencia de DMA se ha completado. El sistema operativo ahora puede "arreglar" las tablas de direcciones virtuales de la MMU con la dirección física de la página recién cargada. Luego, el sistema operativo puede hacer que el proceso se reinicie con la instrucción que se canceló (la MMU lo abortó cuando detectó el error de página). Esta vez la instrucción debe completar.

Es de esperar que esté claro que las instrucciones simples que solo acceden a la memoria una vez, para cargar o almacenar datos, son mucho más fáciles de tratar que una instrucción que accede a la memoria más de una vez.

Por ejemplo, x86 y 68000 tenían instrucciones que accedían a la memoria dos o más veces. Cada acceso a la memoria puede causar un error de página. Por lo tanto, la CPU debe o revertir la instrucción incompleta y guardar el estado suficiente para volver a ejecutar la instrucción desde el inicio, o guardar el estado suficiente para continuar y continuar < em> instrucción incompleta . En cualquier caso, eso podría ser millones o incluso miles de millones de instrucciones más adelante, con otras instrucciones intermedias que también sufran fallas de página.

Las instrucciones muy complejas pueden actualizar varios registros y la memoria en un bucle. Por lo tanto, existe una gran cantidad de estados que pueden ser revertidos o almacenados. El estado almacenado para instrucciones incompletas no es necesario para admitir una interrupción de hardware tradicional. Por lo tanto, las "excepciones de instrucciones incompletas" guardan un estado diferente en la pila y, por lo tanto, deben manejarse de manera diferente para las interrupciones normales. No creo que esta sea la razón por la que el 68020 perdió con x86, pero fue una complejidad añadida.

Hacer que la memoria virtual y, por lo tanto, cancelar las instrucciones sea fácil de implementar es una de las razones por las que las arquitecturas RISC tienen instrucciones de acceso a memoria muy simples. Una instrucción de carga o almacenamiento RISC solo puede causar un fallo de página, y si los modos de direccionamiento no tienen efectos secundarios (no cambian ningún valor de registro), el error de página se puede tratar como una instrucción ordinaria que se interrumpe antes de que comience .

(Todo esto se hace aún más complejo mediante CPU segmentadas)

    
respondido por el gbulmer

Lea otras preguntas en las etiquetas