El indicador de interrupción ( IF ) es un indicador del sistema bit en la arquitectura x86 's registro FLAGS , que determina si o no la unidad de procesamiento central (CPU) responderá a hardware enmascarables interrupciones . [1]
El bit, que es el bit 9 del registro FLAGS, puede ser establecido o borrado por programas con suficientes privilegios, como lo determina normalmente el sistema operativo . Si la bandera se establece en 1
, se manejarán las interrupciones de hardware enmascarables. Si se borra (se establece en 0
), dichas interrupciones se ignorarán. IF no afecta el manejo de interrupciones no enmascarables (NMI) o interrupciones de software generadas por la instrucción INT .
Configuración y limpieza
La bandera puede ser activa o se desactiva mediante la CLI ( Cl oído I nterrupts), STI ( S e t I nterrupts) y POPF ( Pop F GAL) instrucciones .
CLI borra IF (se establece en 0), mientras que STI establece IF en 1. POPF saca 16 bits de la pila al registro FLAGS , lo que significa que IF se establecerá o borrará según el noveno bit en la parte superior de la pila. [1]
Nivel de privilegio
En los tres casos, solo las aplicaciones privilegiadas (generalmente el kernel del sistema operativo ) pueden modificar IF. Tenga en cuenta que esto solo se aplica al código de modo protegido . ( El código de modo real siempre puede modificar IF).
CLI y STI son instrucciones privilegiadas, que desencadenan una falla de protección general si una aplicación sin privilegios intenta ejecutarla, mientras que POPF simplemente no modificará el indicador IF si la aplicación no tiene privilegios.
El nivel de privilegio requerido para ejecutar una instrucción CLI o STI, o establecer IF usando POPF, está determinado por el IOPL (I / O Privilege Level) en EFLAGS. Si el IOPL se establece en 2, por ejemplo, cualquier programa que se ejecute solo en el anillo 0 puede ejecutar una CLI. La mayoría de los sistemas operativos modernos establecen el IOPL en 0, por lo que solo el kernel puede ejecutar CLI / STI. La razón de esto es que dado que borrar IF obligará al procesador a ignorar todas las interrupciones, es posible que el kernel nunca recupere el control si no se establece en 1 nuevamente.
Programas de DOS antiguos
Algunos programas de DOS antiguos que usan un extensor de DOS en modo protegido e instalan sus propios controladores de interrupciones (generalmente juegos) usan la instrucción CLI en los controladores para deshabilitar las interrupciones y POPF (después de un PUSHF correspondiente) o IRET (que restaura las banderas de la pila como parte de sus efectos) para restaurarlo. Esto funciona si el programa se inició en modo real, pero causa problemas cuando dichos programas se ejecutan en un contenedor basado en DPMI en sistemas operativos modernos (como NTVDM en Windows NT o posterior). Dado que CLI es una instrucción privilegiada, provoca una falla en el sistema operativo cuando el programa intenta usarlo. Entonces, el sistema operativo generalmente deja de entregar interrupciones al programa hasta que el programa ejecuta STI (lo que causaría otra falla). Sin embargo, la instrucción POPF no tiene privilegios y simplemente falla silenciosamente para restaurar el IF. El resultado es que el sistema operativo deja de entregar interrupciones al programa, que luego se cuelga. Los programas de DOS que no utilizan un extensor de modo protegido no sufren este problema, ya que se ejecutan en modo V86 donde POPF desencadena una falla.
Hay pocas soluciones satisfactorias para este problema. Por lo general, no es posible modificar el programa, ya que el código fuente generalmente no está disponible y no hay espacio en el flujo de instrucciones para introducir un STI sin una edición masiva a nivel de ensamblaje. Eliminar las CLI del programa o hacer que el host V86 ignore la CLI por completo podría causar otros errores si los controladores de interrupciones del invitado no son seguros para el reingreso (aunque cuando se ejecutan en un procesador moderno, generalmente se ejecutan lo suficientemente rápido para evitar la superposición de interrupciones).
CLI
CLI se usa comúnmente como un mecanismo de sincronización en sistemas monoprocesador. Por ejemplo, una CLI se usa en los sistemas operativos para deshabilitar las interrupciones, de modo que el código del kernel (generalmente un controlador ) pueda evitar las condiciones de carrera con un controlador de interrupciones . Tenga en cuenta que CLI solo afecta al indicador de interrupción del procesador en el que se ejecuta; en sistemas multiprocesador , la ejecución de una instrucción CLI no inhabilita las interrupciones en otros procesadores. Por lo tanto, una condición de carrera de controlador / controlador de interrupciones aún puede ocurrir porque otros procesadores pueden atender interrupciones y ejecutar el controlador de interrupciones infractor. Para estos sistemas, se deben utilizar otros mecanismos de sincronización, como bloqueos, además de CLI / STI para evitar todas las condiciones de carrera.
Debido a que la instrucción HLT se detiene hasta que ocurre una interrupción, la combinación de una CLI seguida de una HLT se usa comúnmente para colgar intencionalmente la computadora.
ITS
La instrucción STI habilita las interrupciones configurando el IF.
Una peculiaridad interesante de la instrucción STI es que, a diferencia de CLI, que tiene un efecto inmediato, las interrupciones no se habilitan realmente hasta después de la instrucción que sigue inmediatamente a la STI. Un efecto secundario de esto podría ser IF = 0, luego ejecutar una instrucción CLI inmediatamente después de una instrucción STI significa que las interrupciones nunca se reconocen. La instrucción STI establece la bandera IF, pero las interrupciones no se comprueban hasta después de la siguiente instrucción, que en este caso sería la CLI que entra en vigor inmediatamente. Este comportamiento existe, por lo que un procesador que constantemente recibe interrupciones puede seguir avanzando. Consulte los manuales del IA-32 para obtener más detalles.
Ver también
Referencias
- ^ a b "Manual del desarrollador de software de arquitectura Intel, volumen 2: manual de referencia del conjunto de instrucciones" (PDF) . Consultado el 13 de julio de 2007 .
enlaces externos
- Manuales para desarrolladores de software de arquitecturas Intel 64 e IA-32 - Consultado el 14 de septiembre de 2017