Estoy escribiendo un pequeño sistema operativo que ejecutará algún código en modo de usuario (nivel de privilegio 3). Desde ese código de nivel de usuario, quiero llamar una interrupción al sistema operativo que imprime un mensaje. En este momento, realmente no me importa cómo mi manejador de interrupciones toma argumentos o algo así, realmente solo quiero que un manejador de interrupciones me informe (al usuario) que el código se ha ejecutado.Cambiar al modo de usuario usando iret
Mi pregunta es: ¿cómo ejecuto el código en modo de usuario? Tengo una función que configura una tabla de descriptores locales con un segmento de código y un segmento de datos (ambos con privilegios de modo de usuario). Lo que no entiendo es cómo se supone que debo cargar estos segmentos en cs
, ss
y ds
. Cargué con éxito mi LDT, pero no sé cómo usarlo realmente. He escuchado que debería usar iret
, pero no entiendo exactamente cómo.
Otra pregunta que tengo es cómo debería funcionar mi controlador de interrupciones. Digamos que instalo un controlador de interrupción para el vector número 0x40, que quiero imprimir "¡Hola, modo de usuario!". Sé cómo configurar un manejador de interrupciones, pero no entiendo exactamente cómo se cambiará el contexto al ingresar un manejador de interrupciones de kernel desde el modo de usuario. Sé que el registro cs
debe cambiar, ya que mi rutina se ejecutará desde el segmento de código especificado en mi entrada IDT. También entiendo que el selector de pila probablemente también cambie, pero no puedo estar seguro de esto.
¿Podría alguien explicarme por favor qué cambios de contexto se realizan cuando se llama a una puerta de interrupción?
Muy bien, usted respondió mi pregunta y ¡MÁS! Lo que ahora entiendo es que necesitaré tener un TSS que contenga mi pila de kernel, etc. Gracias por la ayuda. –
¡Inicié sesión solo para votar esto! ¡Gracias! También para cualquier otra persona, recomiendo osdev y los manuales de Intel ISA también. Realmente aclaran las cosas. – Sid
¿Qué quiere decir con que IRET no cambia el segmento de datos? ¿Estás hablando de valores dentro de los registros de propósito general? –