Cambiar del modo Kernel al modo Usuario (y viceversa)

8

Estoy leyendo el libro de Sistemas Operativos de Galvin. Galvin explica qué son los modos kernel y de usuario, privilegios de instrucción otorgados para ambos modos y también sobre el modo-bit. Pero me interesa saber cómo cambia el modo de uno a otro. Básicamente quiero resolver la siguiente pregunta:

Una CPU tiene 2 modos, privilegiados y no privilegiados. Para cambiar el modo de previo a no previo

a) Se necesita una interrupción de hardware

b) Se necesita una interrupción de software.

c) Se necesita una instrucción privilegiada.

d) Se necesita una instrucción no privilegiada.

Por lo que entiendo,

del modo de usuario al modo de núcleo: se necesita la interrupción de hardware [como en la E / S de disco]. Ahora, en caso de que el programa de usuario se canse para acceder a una memoria que está más allá de su rango permitido, se produce una trampa, que es básicamente una interrupción de software que será manejada por el sistema operativo. Ahora, en modo de usuario no podemos ejecutar ninguna instrucción privilegiada. Por lo tanto, una instrucción no privilegiada, como una solicitud de E / S, puede cambiar al usuario al modo kernel. Entonces creo que cambiar

de no privilegiado (usuario) a privilegiado (núcleo): la interrupción H / W, la interrupción S / W y la instrucción no privilegiada funcionarán.

Ahora llegando a kernel a modo de usuario. El sistema operativo puede cambiar el kernel al modo de usuario. Por lo tanto, simplemente ejecutará una instrucción privilegiada para cambiar de kernel a modo de usuario. No necesita generar interrupción H / w o S / w. Entonces concluyo, para cambiar

de previo a no previo - una instrucción privilegiada servirá.

Estoy en lo cierto?

Además, cuando se ejecuta en modo kernel, todas las interrupciones se desactivarán, ¿verdad? Entonces la respuesta no puede ser (a) o (b). Además, dado que el sistema operativo es básicamente un software, no puede generar interrupciones H / W.

Además, dado que el sistema operativo mismo maneja las interrupciones, no tiene sentido para mí por qué tiene que generar una interrupción (y mantenerla) para cambiar del modo kernel al modo usuario.

Por favor, avíseme si me equivoco en alguna parte. Cualquier ayuda con respecto a esto es apreciada.

avi
fuente

Respuestas:

7

Modo de usuario al modo kernel: ¡Incorrecto! ;-) Sí, las interrupciones se procesan en modo kernel, y originalmente la forma de ingresar al modo kernel era mediante una interrupción forzada de alguna manera por el software. En el DEC 2020 había un conjunto de UIO (códigos de instrucción de instrucción no implementados), llamando a cualquiera de ellos que causó una trampa en el sistema operativo. Incluían instrucciones de coma flotante (si no en hardware) y otras instrucciones exóticas, pero también los medios para hacer llamadas al sistema operativo. La familia i? 86 tiene la intinstrucción (interrupción), utilizada tradicionalmente como usted dice. Los miembros más nuevos de la familia tienen SYSTENT para hacer llamadas de supervisor de manera más eficiente. Los medios para ir al modo supervisor no pueden ser privilegiados, pero de alguna manera deben ser estrictamente controlados por el núcleo (donde ingresa el núcleo, qué argumentos pasa, ...).

Kernelmode a usermode: no es necesario privilegiar la operación "soltar privilegios". Si no tiene privilegios, dejarlos no es una opción. Pero el mecanismo exacto depende en extremo de la arquitectura.

Interrupciones deshabilitadas en el núcleo: las interrupciones indican alguna condición que debe manejarse lo antes posible (por ejemplo, si los datos que llegan a través de la red no se guardan de la tarjeta antes de que llegue la próxima, se sobrescribirán). Por lo tanto, las interrupciones rara vez se desactivan. En los sistemas Unix originales (y contemporáneos), había una CPU, y la forma más sencilla de obtener una región crítica ("nadie se mete con mis datos mientras los modifico") era simplemente desactivar las interrupciones. Se tomaron medidas para mantener los tramos de "interrupción desactivada" lo más cortos posible debido a lo anterior. En las máquinas con múltiples CPU actuales, deshabilitar las interrupciones en una CPU no hace mucho en esta dirección; deshabilitar las interrupciones a nivel mundial es extremadamente costoso en la coordinación entre CPU, por lo que no se hace (o muy raramente).

vonbrand
fuente
"No es necesario que se privilegie la operación" soltar privilegios "". Entonces quiere decir que, para cambiar del modo Kernel al modo Usuario, una instrucción no privilegiada servirá. Si es una instrucción no privilegiada, ¿incluso un usuario puede ejecutarla y cambiar del modo kernel al modo usuario? ¿O lo interpreté mal?
avi
Sí, un "usuario normal" simplemente no puede entrar en modo kernel. Además, la eliminación de privilegios no puede causar ningún daño, por lo que no necesita ser privilegiado (por sí solo). Si hacer esto en alguna máquina significa, por ejemplo, registrar registros privilegiados, tendrá privilegios allí. Pero no tiene que ser privilegiado.
vonbrand
No lo estoy entendiendo bien. Su comentario y respuesta anteriores se contradicen. En el comentario que dijo, "un" usuario normal "simplemente no puede ingresar al modo kernel", pero en respuesta, mencionó "" No es necesario que la operación "quitar privilegios" sea privilegiada "". ¿Qué me estoy perdiendo? : S Para decir simplemente, para cambiar Kernel al modo Usuario, se debe cambiar el bit de modo. ¿Qué no se puede hacer en modo usuario correctamente? Por lo tanto, no puede ser una instrucción no privilegiada.
avi
Maldición, tampoco entendí por qué el modo de usuario al modo kernel está mal. En su explicación, en las primeras líneas que mencionó al usuario al modo kernel se puede hacer a través de instrucciones INT y, por último, mencionó: "No se puede privilegiar los medios para ir al modo supervisor". ¿No es todo lo que mencioné? Interrupción H / W (que es obvio, por ejemplo, solicitudes de E / S), interrupción S / W (instrucción INT) e instrucción no privilegiada.
avi
Se puede hacer con una interrupción, pero hay otras posibilidades. No puede tener privilegios (si lo fuera, ningún usuario podría hacerlo ;-).
vonbrand