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í?