Un componente fundamental de cualquier sistema operativo es la multitarea. Debe poder cambiar entre tareas / procesos.
¿Qué registros se deben guardar y restaurar cuando se realiza un cambio de contexto? ¿Dónde se guardan sus valores?
Un componente fundamental de cualquier sistema operativo es la multitarea. Debe poder cambiar entre tareas / procesos.
¿Qué registros se deben guardar y restaurar cuando se realiza un cambio de contexto? ¿Dónde se guardan sus valores?
En primer lugar, si el sistema operativo no es preventivamente multitarea, entonces solo tiene que guardar los registros que no se guardan según las convenciones de llamada de procedimiento habituales. En un kernel multitarea no preventivo, los cambios de tareas solo tienen lugar en llamadas explícitas al kernel. El núcleo tiene que guardar solo el "contexto de procedimiento", y no el contexto completo y detallado de la máquina, de modo que cuando la tarea se reinicia, la tarea puede ejecutar un retorno exitoso de la función a la que llamó. Esto significa guardar y restaurar solo los registros que normalmente se espera que una función conserve.
En un kernel preventivo, debe guardar un estado de máquina mucho más detallado, ya que puede producirse una interrupción en cualquier momento y adelantarse a una tarea.
Sin embargo, aún depende de usted decidir qué registros le interesan. Si hay ciertos registros que no utiliza ninguna de sus tareas, entonces no tiene que molestarse en guardarlas y restaurarlas.
Por ejemplo, supongamos que hay algunos registros especiales de punto flotante, pero su sistema no los usa. Entonces no tienes que molestarte.
Si resulta que alguien tiene que hacer un punto flotante, entonces si son la única tarea que hace eso, los registros quedarán solos por todo lo demás (otras tareas e interrupciones). Si alguien introduce varias tareas, se puede implementar algún tipo de pirateo, como el uso de algún mutex conocido en torno al código de punto flotante (o simplemente deshabilitar las interrupciones, si solo hay un procesador).
La "respuesta canónica" es para guardar todos los aspectos del estado del procesador que pertenecen a una tarea. Cualquier registro u otro estado del procesador que no se guarde y restaure, en una tarea dada, parecerá que cambia de valor de forma espontánea. Si eso es "malo", hay que evitarlo. No todos los registros son "aspectos del estado del procesador que pertenecen a una tarea". Por ejemplo, en MIPS, hay "registros de kernel" llamados k0 y k1. La especificación de la arquitectura dice que los manejadores de trampas pueden usar estos registros para cualquier propósito que quieran y no restaurarlos. Por lo tanto, desde el punto de vista de cualquier código normal, k0 y k1 tienen valores que cambian espontáneamente a medida que se activan varias interrupciones, y los manejadores pulsan esos registros.
Lea otras preguntas en las etiquetas os