Sé cómo funciona el manejo de interrupciones (cambio de modo, guardar registros, cambiar pila...). Sin embargo, tengo curiosidad, ¿qué pasa si ocurre una interrupción mientras todavía estamos en modo kernel y no en modo usuario?
Respuesta1
Exactamente lo mismo. Sin embargo si estamos procesando una interrupción entonces posiblemente nada, o nada hasta que terminemos.
Qué hacemos en todos los casos:
- modo de guardar incondicionalmente y configurar el modo en modo supervisor (realizado por hardware. Activado por interrupción)
- guardar incondicionalmente el estado y cambiar la pila
- ejecutar código de interrupción
- cambiar incondicionalmente la pila, restaurar el estado y el modo de restauración
La frase "establecer modo en modo supervisor" podría leerse como cualquiera de estas:
- asegúrese de que el modo sea el modo supervisor.
- escribe un uno en el bit S del registro de estado
Interrumpir una interrupción
Posiblemente existan múltiples (pero finitos) niveles de prioridad de interrupción. Habrá una pila para cada nivel. Una interrupción solo puede ser interrumpida por una prioridad de interrupción más alta. Las interrupciones de menor prioridad pueden bloquearse con mayor prioridad. Esto resuelve la mayoría de los problemas, no las pilas no pueden corromperse.
Sin embargo, las interrupciones de menor prioridad se pueden bloquear (incluidos los procesos de usuario. Estas son las interrupciones de menor prioridad). Por lo tanto, es importante asegurarse de que las interrupciones sean rápidas (no mucho código), especialmente para las interrupciones de mayor prioridad: haga el trabajo y salga, haga que una interrupción de menor prioridad (como un proceso de usuario) haga el bit que lleva tiempo.
pilas
Un kernel puede usar la misma pila que el proceso, cuando un proceso llama al kernel (llamada sincronizada: usar una llamada al sistema en el código de un programa).
Un kernel también tendrá una pila para cada nivel de prioridad de interrupción. Consulte la sección sobre cómo interrumpir una interrupción.