Articulo de referencia

Tabla de descriptores de interrupción

La tabla de descriptores de interrupción ( IDT ) es una estructura de datos utilizada por la arquitectura x86 para implementar una tabla de vectores de interrupción . El procesa...

La tabla de descriptores de interrupción ( IDT ) es una estructura de datos utilizada por la arquitectura x86 para implementar una tabla de vectores de interrupción . El procesador utiliza la IDT para determinar las direcciones de memoria de los manejadores que se ejecutarán en caso de interrupciones y excepciones .

Los detalles que se describen a continuación se aplican específicamente a la arquitectura x86. Otras arquitecturas tienen estructuras de datos similares, pero pueden comportarse de manera diferente.

La IDT consta de 256 vectores de interrupción y su uso se activa mediante tres tipos de eventos: excepciones del procesador, interrupciones de hardware e interrupciones de software, que en conjunto se denominan interrupciones :

  • Las excepciones del procesador generadas por la CPU tienen una asignación fija a los primeros hasta 32 vectores de interrupción. [ 1 ] Si bien 32 vectores (0x00-0x1f) están oficialmente reservados (y muchos de ellos se utilizan en procesadores más nuevos), el 8086 original solo utilizaba los primeros cinco (0-4) vectores de interrupción y el diseño IDT de IBM PC no respetaba el rango reservado.
  • Los números de vector de interrupción de hardware corresponden a los números IRQ de hardware. La asignación exacta depende de cómo esté programado el controlador de interrupciones programable , como el Intel 8259. [ 2 ] Mientras que Intel documenta que las IRQ 0-7 se asignan a los vectores 0x20-0x27, los PC IBM y compatibles las asignan a 0x08-0x0F. Las IRQ 8-15 generalmente se asignan a los vectores 0x70-0x77.
  • Los números de vector de interrupción de software están definidos por el entorno de ejecución específico, como la BIOS de IBM PC, DOS u otros sistemas operativos. Estas interrupciones se activan mediante software que utiliza la instrucción INT (ya sea por aplicaciones, controladores de dispositivos o incluso otros gestores de interrupciones). Por ejemplo, la BIOS de IBM PC proporciona servicios de vídeo en el vector 0x10, MS-DOS proporciona la API de DOS en el vector 0x21 y Linux proporciona la interfaz de llamada al sistema en el vector 0x80.

Modo real

En modo real , la tabla de interrupciones se denomina IVT (tabla de vectores de interrupción). Hasta el 80286, la IVT siempre residía en la misma ubicación de memoria, con un rango de 0x0000a 0x03ff, y constaba de 256 punteros lejanos . Las interrupciones de hardware se pueden asignar a cualquiera de los vectores mediante un controlador de interrupciones programable. En el 80286 y posteriores, el tamaño y las ubicaciones de la IVT se pueden cambiar de la misma manera que se hace con la IDT (tabla de descriptores de interrupción) en modo protegido (es decir, mediante la instrucción LIDT (Cargar registro de tabla de descriptores de interrupción)), aunque esto no cambia su formato. [ 3 ]

Interrupciones de la BIOS

La BIOS proporciona acceso sencillo en modo real a un subconjunto de funciones de hardware mediante el registro de controladores de interrupción. Estos se invocan como interrupciones de software con la instrucción de ensamblador INT y los parámetros se pasan a través de registros. Dichas interrupciones se utilizan para diversas tareas, como detectar la distribución de la memoria del sistema , configurar la salida y los modos VGA y acceder al disco al inicio del proceso de arranque.

Modo protegido y de larga duración

La IDT es una matriz de descriptores almacenados consecutivamente en memoria e indexados por el número de vector. No es necesario utilizar todas las entradas posibles: basta con llenar la tabla hasta el vector de interrupción más alto utilizado y ajustar la longitud de la IDT IDTRen consecuencia.

El registro IDTR se utiliza para almacenar tanto la dirección base lineal como el límite (longitud en bytes menos 1) de la IDT. Cuando se produce una interrupción, el procesador multiplica el vector de interrupción por el tamaño de entrada (8 para el modo protegido, 16 para el modo largo ) y suma el resultado a la dirección base de la IDT. [ 4 ] Si la dirección está dentro de la tabla, se comprueba el DPL y la interrupción se gestiona en función del tipo de puerta.

Los descriptores pueden ser puertas de interrupción, puertas de trampa o, solo para el modo protegido de 32 bits, puertas de tarea. Las puertas de interrupción y trampa apuntan a una ubicación de memoria que contiene código para ejecutar, especificando tanto un segmento (presente en la GDT o la LDT ) como un desplazamiento dentro de ese segmento. La única diferencia entre las puertas de trampa e interrupción es que las puertas de interrupción deshabilitan el procesamiento de interrupciones de hardware enmascarables, lo que las hace adecuadas para manejar interrupciones generadas por hardware (por el contrario, las puertas de trampa son útiles para manejar interrupciones y excepciones de software). Una puerta de tarea provoca el cambio del segmento de estado de tarea activo, utilizando el mecanismo de cambio de tarea de hardware para transferir el uso del procesador a otro programa, hilo o proceso.

Diseños IDT comunes

Excepciones e interrupciones en modo protegido

En modo protegido , los 32 vectores de interrupción más bajos están reservados para excepciones de la CPU. Estos son eventos que se activan en la propia CPU, en lugar de recibir interrupciones del hardware externo. Sin embargo, algunas excepciones de la CPU, como NMI o #MC, se relacionan directamente con eventos que ocurren en otros componentes del ordenador. [ 5 ] [ 6 ] Los vectores de interrupción de 0x20 a 0xff ( hexadecimal ) se dejan libres para que los desarrolladores los utilicen para interrupciones externas. Las interrupciones con números inferiores a 0x20 no deben asignarse para interrupciones externas.

  1. Esta columna determina si la interrupción agrega un código de excepción a la pila del controlador de interrupciones o no. Para algunas excepciones, esto solo agrega un número cero.
  2. 1 2 Las excepciones #DE (error de división) y #BR (rango de límites excedido) son excepciones de tipo fallo en los procesadores 80286 y posteriores; en los procesadores anteriores, eran trampas.
  3. La excepción #DB puede ser una excepción de trampa o de fallo, dependiendo de la condición que la haya provocado. (Por ejemplo, los puntos de interrupción de instrucciones son fallos, mientras que los puntos de interrupción de datos y los pasos individuales son trampas). La condición que provocó la excepción #DB se puede identificar inspeccionando elDR6 registro de depuración .
  4. La documentación oficial de Intel no asigna un mnemónico oficial a esta interrupción, pero la abreviatura "NMI" se usa ampliamente para referirse a esta interrupción, incluso en la propia documentación de Intel.
  5. El mnemónico #MP para la excepción 9 aparece solo en la documentación de Intel 80286 [ 8 ] − la documentación posterior de Intel para los procesadores 80386 y posteriores continúa describiendo esta excepción, pero ya no utiliza el mnemónico #MP para ella.
  6. Cuando se detecta una excepción matemática no enmascarada en la FPU x87, no se señala como una falla en la instrucción x87 que produce la excepción, sino en la siguienteFWAITinstrucción x87/ /MMX.
  7. En los procesadores i486 y posteriores, la excepción #MF solo se puede señalar si elCR0.NEbit está activado; si este bit no está activado, la CPU activará el pin FERR# y esperará una interrupción externa.

    En los procesadores 80286 y 80386, que no tienen CR0.NE, el vector de excepción #MF es compatible con el procesador, pero los PC compatibles con IBM redirigirán las señales de error de la FPU de tal manera que los errores de la FPU x87 aparezcan como IRQ13 (INT 75h) en su lugar. [ 11 ]

  8. En los procesadores x86 que admiten la arquitectura de comprobación de máquina (Intel Pentium Pro y posteriores, AMD K7 y posteriores), la excepción #MC puede actuar como una excepción de tipo Abort, Fault o Interrupt, dependiendo del tipo de error que la causó. Esto se indica con el bit RIPV (bit 0) y el bit EIPV (bit 1) delMCG_STATUS MSR (MSR17Ah):
    • El bit RIPV indica si el flujo de instrucciones se puede reiniciar desde el valor CS:rIP apilado (1=sí, 0=no).
    • El bit EIPV indica si el error está asociado con la instrucción a la que apunta el valor CS:rIP almacenado en la pila (1=sí, 0=no).
  9. A diferencia de la excepción #MF utilizada para errores x87, la excepción #XM se señala como una falla en la instrucción que causó la excepción de punto flotante SIMD.

Diseño de la PC IBM

El IBM PC ( BIOS y entorno de ejecución MS-DOS ) no sigue la disposición oficial de Intel más allá de los primeros cinco vectores de excepción implementados en el 8086 original. La interrupción 5 ya se utiliza para gestionar la tecla Imprimir Pantalla , las IRQ 0-7 se asignan a INT_NUM 0x08-0x0F, y el BIOS utiliza la mayoría de los vectores en el rango 0x10-0x1F como parte de su API. [ 12 ]

Enganche

Algunos programas de Windows interceptan las llamadas a la IDT. Esto implica escribir un controlador en modo kernel que intercepta las llamadas a la IDT y agrega su propio procesamiento. Microsoft nunca ha brindado soporte oficial para esto , pero no se impidió mediante programación en sus sistemas operativos hasta las versiones de 64 bits de Windows, donde un controlador que intenta usar una intercepción en modo kernel provoca un error en la máquina . [ 13 ]

Véase también

Referencias

  1. "Excepciones - Wiki de OSDev" . wiki.osdev.org . Consultado el 17 de abril de 2021 .
  2. Friesen, Brandon. "IRQs y PICs" . Tutorial de desarrollo de kernel de Bran . Consultado el 6 de junio de 2024 .
  3. Manual del desarrollador de software para arquitecturas Intel® 64 e IA-32, 20.1.4 Gestión de interrupciones y excepciones
  4. Manual del desarrollador de software para arquitecturas Intel® 64 e IA-32, 6.12.1 Procedimientos del controlador de excepciones o interrupciones
  5. Intel Corporation (abril de 2022). Manual del desarrollador de software para arquitecturas Intel® 64 e IA-32, volumen 3 (3A, 3B, 3C y 3D): Guía de programación del sistema . Intel Corporation. págs. 6-1 a 6-58. 
  6. "Excepciones - Wiki de OSDev" . wiki.osdev.org . Consultado el 17 de abril de 2021 .
  7. Intel Corporation (abril de 2022). Manual del desarrollador de software para arquitecturas Intel® 64 e IA-32, volumen 3 (3A, 3B, 3C y 3D): Guía de programación del sistema . Intel Corporation. págs. 6-1 a 6-58. 
  8. Intel, Manual de referencia del programador iAPX 286 , número de pedido 210498-001, 1983, apéndice B, tabla B-2, página 202.
  9. Intel, Manual de referencia del programador 80387 , número de pedido 231917-001, 26 de mayo de 1987, tabla 2.6 en la página 211.
  10. Intel, Manual de referencia del programador 80286 y 80287 , número de pedido 210498-005, sección 9.6.3 en la página 172.
  11. Intel, AP-578: Consideraciones de software y hardware para manejadores de excepciones de FPU para procesadores con arquitectura Intel , número de pedido 243291-002, febrero de 1997. Archivado del original el 17 de septiembre de 2000.
  12. Jurgens, David. "Tabla de interrupciones implementada por el BIOS/DOS del sistema" . Biblioteca de referencia HelpPC . Consultado el 6 de junio de 2024 .
  13. "Política de aplicación de parches para sistemas basados ​​en x64" . Microsoft . Si el sistema operativo detecta alguna de estas modificaciones o cualquier otro parche no autorizado, generará una comprobación de errores y apagará el sistema.
General
  • Manual del desarrollador de software para arquitecturas Intel 64 e IA-32, Volumen 3: Guía de programación del sistema
  • Manual del desarrollador de software para arquitecturas Intel 64 e IA-32, Volumen 3A: Guía de programación del sistema, Parte 1 (véase el CAPÍTULO 5, GESTIÓN DE INTERRUPCIONES Y EXCEPCIONES y el CAPÍTULO 10, CONTROLADOR DE INTERRUPCIONES PROGRAMABLE AVANZADO)]
  • Tabla de descriptores de interrupción en OSDev.org