¿Historia, razón e implicaciones de los 2 modos de un microprocesador moderno?

2

Los microprocesadores modernos con los que he tratado podrían tener 2 modos: Usuario y superusuario (y, a veces, esta diferencia fue solo en el manual y no se implementó como el Nios II, que establece que tiene 2 modos pero solo implementa 1) . Por lo tanto, me pregunto si esto es cierto en general sobre los microprocesadores, es decir, no es muy ventajoso agregar más modos que 2, por ejemplo, un tercer modo que podría ser "superusuario" (lo que en la práctica podría ser que un "superusuario" podría cambiar los privilegios de ¿"superusuarios") si pudieran necesitarse 3 modos? Y es esta diferencia de modo de la CPU en los sistemas modernos la que ha provocado la diferencia de diseño entre los sistemas operativos en los que algunos sistemas operativos se denominan "microkernels" debido a su forma de cargar programas de controladores de dispositivo en modo de usuario en lugar de en modo de superusuario, que es ¿El camino de un kernel os monolítico? ¿Cuál es la historia de los 2 modos de CPU que se están desarrollando? Dice en otro comentario de SE:

I saw the names "user mode" and "supervisor mode" in ARM2 first (late 1980's),

¿Entonces los primeros microprocesadores como Intel 8080 y Zilog Z80 no tenían modos, por lo que cualquier programa que se ejecutó podría ejecutar alguna instrucción?

enlace

¿Estos 2 modos se implementan generalmente en hardware y, de ser así, cómo se ve la implementación? ¿Qué es lo que cambia cuando un microprocesador cambia de modo entre usuario y superusuario?

    

3 respuestas

3

Más bien muchas preguntas en esta pregunta, pero puedo abordar algunas de ellas.

Intel tiene cuatro modos conocidos como "anillos" , pero dos no se utilizan con frecuencia .

  

Intel 8080 y Zilog Z80 no tenían modos, por lo que cualquier programa que fuera   ejecutar podría ejecutar cualquier instrucción?

Correcto. La técnica de separación de privilegios se había inventado, pero el costo de complejidad de agregarla a los microprocesadores era grande y esos procesadores se usaban en sistemas de un solo usuario y de proceso único sin redes. La seguridad simplemente no era una consideración.

Lo que "parece" depende de dónde lo estés mirando. La guía del programador para ARM muestra la vista del programador para esa arquitectura. La implementación eléctrica puede variar, ya sea que los registros se hayan intercambiado físicamente o se hayan cambiado de nombre.

Se implementa necesariamente en hardware para que no se pueda sortear.

    
respondido por el pjc50
6

El historial de esto comenzó con multipropiedad , y el propósito fue aislar los procesos de los usuarios entre sí.

Cuando hay más de un usuario independiente en una máquina, es ventajoso para cada usuario tomar todos los recursos de la máquina que sea posible y dejar a los demás sin nada. Sin algún tipo de protección de hardware, una vez que un usuario obtiene la CPU puede mantenerla para siempre.

Esto se resolvió teniendo diferentes modos, a veces llamados rings o niveles de privilegio . Los procesos de usuario se ejecutan con el privilegio más bajo y no pueden hacerse cargo físicamente de la máquina. Esto funciona junto con las protecciones para áreas de la memoria también basadas en el nivel de privilegio.

En la forma más básica, solo necesita dos niveles de privilegio: usuario y sistema operativo. Históricamente ha habido máquinas que tenían más. Cuatro parecían ser un número popular por un tiempo. Sin embargo, los sistemas operativos rara vez hacen uso de más de dos niveles de privilegios.

Los microcontroladores y los primeros microprocesadores no tienen niveles de privilegios porque no están diseñados para aplicaciones con procesos competidores hostiles.

    
respondido por el Olin Lathrop
0

Casi todo lo que se puede hacer al hacer que una CPU distinga las distinciones entre modo supervisor / usuario se puede lograr con una unidad de administración de memoria que es externa a la CPU y controlada como un dispositivo de E / S, pero hay algunas advertencias:

-1- En general, no es deseable que los programas en modo de usuario tengan la capacidad de deshabilitar interrupciones, pero si el código de usuario realiza una instrucción de "deshabilitar interrupciones", puede ser difícil para una MMU externa hacer algo al respecto . Una MMU podría interceptar el bus y activar una NMI si ve que el código del modo de usuario recibe una instrucción de "inhabilitar interrupciones", pero sería más fácil que la CPU bloquee la instrucción en sí.

-2- Las interrupciones deben poder hacer cosas que el modo de usuario no puede, lo que implica que cuando se toma una interrupción, la MMU debe cambiar al modo de "usuario restringido". Una unidad que observa lo que está pasando puede hacer esto, pero se maneja más fácilmente en la CPU.

-3- El modo de usuario no debería poder dañar la pila utilizada por las interrupciones. Es posible que los manejadores de interrupciones se encarguen de esto, incluso cuando se utiliza una MMU externa con un procesador que no sabe nada sobre los modos de usuario / supervisor, pero es mucho más eficiente tener un procesador que pueda cambiar los punteros de pila internamente.

Si bien puede haber ventajas en tener más modos que solo usuario / supervisor, a menudo no vale la pena la complejidad agregada. El hardware para un sistema de dos niveles es más simple que el hardware necesario para solucionar su ausencia, pero agregar más niveles complica al hardware en lugar de simplificarlo. Además, el hecho de que el software emule más niveles sobre un sistema de hardware de dos niveles puede ser más fácil que realizar dicha emulación cuando se utilizan múltiples niveles de hardware.

PS: aunque es malo que las tareas en modo de usuario puedan deshabilitar las interrupciones durante períodos arbitrarios, a menudo he deseado que los procesadores incluyan un contador de "deshabilitación de interrupción temporal", e incluya una instrucción que deshabilite las interrupciones temporalmente (por ejemplo, para las siguientes 8 instrucciones más o menos); si la instrucción se ejecutó nuevamente dentro de las siguientes 8 instrucciones y una interrupción quedó pendiente, la interrupción sería inmediata, y al regresar la instrucción se ejecutaría nuevamente. Tal característica facilitaría enormemente la escritura de estructuras de datos seguras e ininterrumpidas en máquinas con un solo procesador.

    
respondido por el supercat

Lea otras preguntas en las etiquetas