stringtranslate.com

Tabla de descriptores de interrupciones

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

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

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

Modo real

En modo real , la tabla de interrupciones se denomina IVT (tabla de vectores de interrupciones). Hasta el 80286, la IVT siempre residía en la misma ubicación en la memoria, que iba desde 0x0000hasta 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 interrupciones) en modo protegido (es decir, a través de la instrucción LIDT (cargar registro de tabla de descriptores de interrupciones)) aunque no cambia el formato de la misma. [3]

Interrupciones del BIOS

El BIOS proporciona un acceso simple en modo real a un subconjunto de funciones de hardware mediante el registro de controladores de interrupciones. Se invocan como interrupciones de software con la instrucción de ensamblaje INT y los parámetros se pasan a través de registros. Estas interrupciones se utilizan para diversas tareas, como detectar la disposición de la memoria del sistema , configurar la salida y los modos VGA y acceder al disco en las primeras etapas del proceso de arranque.

Modo protegido y largo

El IDT es una matriz de descriptores almacenados consecutivamente en la memoria e indexados por el número de vector. No es necesario utilizar todas las entradas posibles: es suficiente completar la tabla hasta el vector de interrupción más alto utilizado y configurar la parte de longitud del 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) del IDT. Cuando se produce una interrupción, el procesador multiplica el vector de interrupción por el tamaño de la entrada (8 para el modo protegido, 16 para el modo largo) y suma el resultado a la dirección base del IDT. [4] Si la dirección está dentro de la tabla, se comprueba el DPL y se maneja la interrupción en función del tipo de puerta.

Los descriptores pueden ser puertas de interrupción, puertas 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 mediante la especificación de un segmento (presente en la GDT o LDT ) y un desplazamiento dentro de ese segmento. La única diferencia entre las puertas trampa y de interrupción es que las puertas de interrupción deshabilitarán el manejo posterior del procesador de interrupciones de hardware enmascarables, lo que las hace adecuadas para manejar interrupciones generadas por hardware (por el contrario, las puertas trampa son útiles para manejar interrupciones de software y excepciones). Una puerta de tarea hará que se cambie el segmento de estado de tarea actualmente activo, utilizando el mecanismo de cambio de tarea de hardware para transferir efectivamente el uso del procesador a otro programa, hilo o proceso.

Diseños de IDT comunes

Diseño oficial de Intel

Todos los INT_NUM entre 0x0 y 0x1F, inclusive, están reservados para excepciones por Intel. [5] Los INT_NUM mayores que 0x1F deben usarse para rutinas de interrupción.

Disposición del IBM PC

El IBM PC ( BIOS y entorno de ejecución MS-DOS ) no sigue el diseño 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 usa para manejar la tecla Imprimir pantalla , IRQ 0-7 está asignada a INT_NUM 0x08-0x0F, y BIOS está usando la mayoría de los vectores en el rango 0x10-0x1F como parte de su API. [6]

Enganche

Algunos programas de Windows enganchan llamadas al IDT. Esto implica escribir un controlador en modo kernel que intercepta llamadas al IDT y agrega su propio procesamiento. Esto nunca ha sido oficialmente admitido por Microsoft , pero no se evitó programáticamente en sus sistemas operativos hasta las versiones de 64 bits de Windows, donde un controlador que intenta usar un gancho en modo kernel hará que la máquina realice una verificación de errores . [7]

Véase también

Referencias

  1. ^ "Excepciones - Wiki de OSDev". wiki.osdev.org . Consultado el 17 de abril de 2021 .
  2. ^ Friesen, Brandon. "IRQ y PIC". Tutorial de desarrollo de kernel de Bran . Consultado el 6 de junio de 2024 .
  3. ^ Manual del desarrollador de software de arquitecturas Intel® 64 e IA-32, 20.1.4 Manejo de interrupciones y excepciones
  4. ^ Manual del desarrollador de software de arquitecturas Intel® 64 e IA-32, 6.12.1 Procedimientos de manejo de excepciones o interrupciones
  5. ^ "Excepciones - Wiki de OSDev". wiki.osdev.org . Consultado el 17 de abril de 2021 .
  6. ^ Jurgens, David. "Tabla de interrupciones implementada por el BIOS/DOS del sistema". Biblioteca de referencia HelpPC . Consultado el 6 de junio de 2024 .
  7. ^ "Política de parches para sistemas basados ​​en x64". Microsoft . Si el sistema operativo detecta una de estas modificaciones o cualquier otro parche no autorizado, generará una comprobación de errores y apagará el sistema.
General

Enlaces externos