Tareas HW en modo protegido Intel IA-32: retorno de IRET de las interrupciones dentro de una tarea HW anidada (EFLAGS.NT = 1)

0

Los manuales de INTEL nos dicen que cuando se cambia una tarea HW a una instrucción 'LLAMAR', la tarea de destino se considera una tarea anidada:

El procesador

  • copia el selector de segmento para el TSS actual (tarea A) al enlace de la tarea anterior campo del TSS para la tarea de destino (TSS de la tarea B)

  • establece el EFLAGS.NT = 1

                      task A  task B
    
                        v      .
                        .    / v 
                        v   /  .
                        .  /   v  
                        v /    .
                        ./     v
                   CALL        .
                        .\     v 
                        v \    . 
                        .  \   v 
                        v   \  .
                        .     IRET         
                        v 
    

La 'tarea anidada' debería volver a la tarea de llamada (tarea A) por medio de una instrucción IRET. Cuando el software en la tarea B usa un retorno de instrucción IRET, el procesador comprueba EFLAGS.NT = 1, luego usa el valor en el campo de enlace de la tarea anterior para regresar a la tarea anterior (tarea A) si el indicador está establecido.

Sin embargo, nada es detener una interrupción mientras la ejecución está en progreso en la tarea B.

Ahora, cuando el controlador intenta volver al hilo interrumpido en la tarea B, haría esto con un IRET. Dado que el manejador se está ejecutando dentro de la tarea B, parece que el procesador comprueba el EFLAGS.NT y dado que aún se establecerá (es decir, 1) regresa a la tarea A, en lugar de regresar a la siguiente instrucción del subproceso interrumpido dentro de la tarea B .

                      WHAT HAPPENS WHEN:


                      task A  task B

                        v      .
                        .    / v 
                        v   /  .   /.
                        .  /   v  / v
                        v /    . /  .
                        ./     v/ interrupt handler  
               CALL            .    v
                        .           .
                        v           v
                        .          IRET
                        v          EFLAGS.NT = 1  
                        .              Get the previous task link in B's TSS?      
                        v          OR    
                                       Go to the return address on the stack?

Espero el siguiente comportamiento

                      task A  task B

                        v      .
                        .    / v 
                        v   /  .   /.
                        .  /   v  / v
                        v /    . /  .
                        ./     v/ interrupt handler  
               CALL            .    v
                        .\     v \  .
                        v \    .  \ v
                        .  \   v   IRET
                        v   \  .
                        .     IRET         
                        v 

En otras palabras, primero se realiza una devolución a partir de la interrupción que ocurrió durante la tarea B (consume el primer IRET) y luego se realiza una devolución a la tarea de "llamada" (tarea A) que utiliza un segundo IRET.

¿Sería esto razonable?

Si es así, ¿cómo sabe el procesador que, aunque EFLAGS.NT = 1, debe regresar al subproceso interrumpido en la tarea B? o en otras palabras, ¿se trata de un retorno de interrupción simple dentro de la tarea B y que no debería volver a la tarea A?

¿Qué me estoy perdiendo aquí?

    
pregunta darbehdar

2 respuestas

1

Eche un vistazo a Intel® 64 y Manual del desarrollador de software para arquitecturas IA-32 , volumen 3:

  

6.12.1.2 Uso de marca por procedimiento de controlador de excepciones o interrupciones

     

Al acceder a un controlador de excepciones o interrupciones a través de un   la puerta de interrupción o una puerta de captura, el procesador borra el indicador TF en el   Registro de EFLAGS después de guardar el contenido del registro de EFLAGS en   la pila. (En llamadas a excepciones e interruptores de manejo, el   el procesador también borra los indicadores VM, RF y NT en el registro EFLAGS,   después de que se guardan en la pila.) Al borrar el indicador TF se evita   El seguimiento de instrucciones afecta la respuesta de interrupción. Un subsiguiente   La instrucción IRET restaura los indicadores TF (y VM, RF y NT) al   Valores en el contenido guardado del registro EFLAGS en la pila.

Una entrada de excepción guardará un marco de pila de excepción (incluido el EFLAGS actual), y luego modificará el (nuevo) EFLAGS para garantizar la ejecución correcta y segura del controlador de excepciones.

    
respondido por el corecode
0

Para el beneficio de los demás:

Como se señaló en la respuesta anterior, la CPU regresa a la tarea B como se esperaba, ya que el indicador de NT se borra antes de ingresar al controlador.

Esto es lo que obliga a un IRET a un retorno 'normal' (es decir, volver a la tarea B). Cuando el IRET restaura el EFLAGS a su estado anterior (que habría sido NT = 1), se asegura que la CPU volverá a la tarea principal al encontrar el IRET posterior (esta vez fuera de una interrupción).

    
respondido por el darbehdar

Lea otras preguntas en las etiquetas