Interrupciones en IA-32e

Anuncio
Interrupciones en IA-32e
IDT en IA-32e




Almacena descriptores, similares a los vistos
en IA-32 pero de 16 bytes, no de 8.
256 entradas, igual que antes
No se puede definir en la IDT un descriptor de
segmento de datos ni de código.
Son descriptores del sistema (Bit S=0 en el
descriptor).
Descriptores en la IDT en IA-32e

64 bits Interrupt Gate
– Limpia Interrupt Flag (IF=0), no puede ser
interrumpido nuevamente, pero sí por una
excepción o una interrupción no enmascarable.

64 bits Trap Gate
– No afecta Interrupt Flag

No Task gate
Descriptores en la IDT en IA-32 (2)
Procedimiento de Interrupción
Consideraciones
Los selectores de código apuntados por las
puertas de interrupción y de traps deben ser de
64 bits.
La excepción es el handler de SMI.
Consecuentemente el la pila se almacena en
bloques de 8 bytes.
La pila (ss:RSP) se almacena siempre en cada
interrupción, haya o no cambio de nivel de
privilegio.
Consideraciones (2)
Si la interrupción o excepción eleva el nivel de
privilegio, el registro selector de SS se pone
automáticamente en 0 (NULL) y el RPL se
ajusta con el RPL de CS.
Cambia el mecanismo de cambio de stack
Cambia el contenido del stack frame.
El offset puntero de entrada que está en cada
descriptor de la IDT (64 bits) deben estar en
formato canónico, va al registro RIP. Si no, #GP.
Consideraciones (3)
Tamaño máximo de la IDT es de 4 Kbytes,
utilizando los 256 vectores de Interrupción.
El contenido del RSP se alinea a 16 bytes antes
de generar el stack frame (varios push's) para
asegurar su alineación a 16 bytes cuando se
ingrese al handler de la interrupción (o
excepción), aun si el RSP llamante (que se
guardara en el stack) no esta alineado a 16 bytes.
Cuando se ejecuta iret se recupera el RSP
llamante a su valor original (alineado o no).
Consideraciones (4)
IRET trabaja con operandos de 64 bit's.
IRET extrae SS:RSP del stack siempre que
esté en IA-32e.
En el modo compatibilidad extrae SS:RSP del
stack solo si cambia el CPL a causa de la
Interrupción o Excepción.
Conmutación de pila en IA-32e
El cambio de stack en modo IA-32e trabaja como
en el modo IA-32 excepto que el registro SS no
se carga con el nuevo selector de la TSS, sino
que se pone a NULL. En la TSS no hay definición
de SS.
El SS se fuerza a NULL, excepto su campo RPL
que se setea al valor del nuevo CPL en toda
transferencias far anidadas, con CALLF, INT n,
Interrupciones de hardware, y Excepciones.
Se vuelve con IRET.
Pila en el handler en IA-32
Pila en el handler en IA-32e
Interrupt Stack Table (IST)
El campo IST se emplea para efectuar el cambio
de pila.
Es un índice.
Si vale cero se utiliza el modo legacy. Si hay
cambio de privilegio hay cambio de pila (RSP) y
la saca de la TSS.
Si es distinto de cero la pila (RSP) la saca de la
TSS.
Cuando se cambia de pila
Si IST es distinto de cero.
Si IST es cero pero el código (de 64 bits) destino
de la interrupción o excepción es mayor nivel que
el actual.
En estos casos el selector de stack (parte alta de
SS) se pone en NULL.
El RPL de SS se completará con el nivel del
privilegio del código en ejecución si hay elevación
de privilegio.
En estos caso el nuevo RSP sale de la TSS
TSS en
IA-32e
Referencias

Intel® 64 and IA-32 Architectures Software
Developer’s Manual Volume 3A: System
Programming Guide, Capítulos 6 y 7
Descargar