Análisis del mecanismo de interrupción del kernel de Linux

  

Resumen: Este documento analiza el proceso de interrupción del dispositivo del kernel de Linux 2.4.0 desde la perspectiva de la implementación del kernel. Este artículo está escrito para lectores y desarrolladores de controladores de Linux que desean obtener información sobre el subsistema de E /S de Linux.

Palabras clave: Linux, interrupciones, controladores de dispositivos

Afirmación: Este documento se publica de acuerdo con el espíritu del código abierto de software libre, y cualquier persona puede obtenerlo, utilizarlo y publicarlo de forma gratuita. Pero no tiene restricciones en los demás para volver a publicar sus derechos para publicar contenido. El propósito de este artículo es hacerlo útil para el lector, pero sin ninguna garantía o incluso una garantía implícita para un propósito específico. Consulte la Licencia pública general de GNU (GPL) y el Protocolo de documentación libre de GNU (GFDL) para obtener más detalles.

Debería haber recibido una copia de la Licencia Pública General (GPL) de GNU junto con la documentación. Si aún no lo ha hecho, escriba a:

The Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA02139, EE. UU.

Bienvenido a los errores y preocupaciones en la documentación.

§ 5.1 I386 Interrupciones y excepciones

Las interrupciones generalmente se dividen en dos categorías: "interrupción síncrona" e interrupción asíncrona. La interrupción síncrona se refiere a la interrupción generada por la unidad de control de la CPU cuando se ejecuta la instrucción. Se denomina "interrupción síncrona" porque la CPU solo emitirá dicha señal de interrupción después de que se aborta una instrucción. La interrupción asíncrona se refiere a la señal de interrupción generada aleatoriamente por otros dispositivos de hardware de acuerdo con el reloj de la CPU.

En la CPU Intel 80x86 manual, las interrupciones síncronas y asíncronas también se conocen como "Excepción" e "Interrupción", respectivamente. Intel ha desglosado las interrupciones y excepciones en las siguientes categorías en detalle:

(1) Interrupciones

1. Interrupción enmascarable: este tipo de interrupción se envía al INTR de la CPU. El pin se puede apagar borrando el indicador IF del registro de eflag.

2. Interrupción no enmascarable: se envía al pin NMI de la CPU. Por lo general, solo algunos eventos críticos, como un fallo de hardware, generan una señal de interrupción no enmascarable. El indicador IF en el registro eflag no tiene efecto en este tipo de interrupción.

(2) Excepción

1. Excepción detectada por el procesador: una excepción generada por una condición anormal detectada cuando la CPU ejecuta una instrucción. De acuerdo con el valor almacenado en el registro eip de la pila del estado del kernel cuando la unidad de control de la CPU genera una excepción, dicha excepción se puede subdividir en tres tipos:

n Fault (Fault): el valor almacenado en el eip es defectuoso. La dirección de la instrucción, por lo que la instrucción se volverá a ejecutar después de que finalice el controlador de excepciones. " errores de página " es un ejemplo común de tales anomalías.

n Trampa: el valor almacenado en eip es una dirección de instrucción, pero la instrucción es posterior a la dirección de la instrucción que causó la captura. La captura solo se desencadena cuando no es necesario volver a ejecutar las instrucciones ejecutadas. Su objetivo principal es depurar el programa.

n Abortar: cuando se produce un error grave, la unidad de control de la CPU no puede guardar valores significativos en el registro eip, excepto por problemas. Los abortos anormales generalmente son causados ​​por fallas de hardware o valores no válidos en las tablas del sistema. Esta interrupción generada por la unidad de control de la CPU es una señal de emergencia utilizada para cambiar la ruta de ejecución de la CPU a un controlador abortado, y el ISR correspondiente generalmente no tiene más remedio que forzar el proceso afectado para abortar.

2. Excepción de programación: también conocida como "interrupción de software", es una interrupción que se produce cuando un programador emite una solicitud de interrupción, como una instrucción int y una instrucción int3. . También se produce una excepción de programación cuando las condiciones de las instrucciones en (verificación de desbordamiento) y límite (dirección de verificación fuera de límites) no son ciertas. La unidad de control de la CPU trata la excepción de programación como una trampa. Este tipo de excepción tiene dos usos típicos: uno es ejecutar la llamada al sistema y el otro es notificar al depurador de una condición específica.

5.1.1 Vectores de interrupción

Cada interrupción y excepción se pueden identificar mediante un entero sin signo entre 0 y 255. Intel lo llama "Interrupción de vectores" (Interrupción) Vector) ". En general, el vector de interrupción para interrupciones y excepciones no enmascarables es fijo, y el vector de interrupción para interrupciones enmascarables se puede programar para cambiar el controlador de interrupción. Los 256 vectores de interrupción de la CPU I386 se asignan de la siguiente manera:

1. Se utiliza un total de 32 vectores de 0 a 31 para las excepciones y las interrupciones no enmascarables.

2. Se utilizan un total de 16 vectores de 32-47 para interrupciones enmascarables, correspondientes a las líneas de entrada IRQ de los controladores de interrupción maestro y esclavo 8259A.

3. Los 48-255 restantes se utilizan para identificar interrupciones suaves.

Linux usa vectores entre 0 y 47. Pero para el vector de interrupción suave entre 48-255, Linux usa solo uno de ellos, el vector de interrupción 128 (0x80) usado para implementar la llamada al sistema. Cuando un proceso en modo usuario ejecuta una instrucción de montaje int 0x80, la CPU cambia al modo kernel para atender la llamada del sistema.

Linux define la macro FIRST_EXTERNAL_VECTOR en el archivo de cabecera incluye /asm-i386 /hw_irq.h para indicar el vector de interrupción correspondiente a la primera interrupción periférica (es decir, IRQ0 de 8259A). Además, se define SYSCALL_VECTOR. Representa el vector de interrupción utilizado para las llamadas al sistema. Como se muestra a continuación:

/*

* Los vectores IDT utilizables para fuentes de interrupción externas comienzan a

* en 0x20:

* /

#define FIRST_EXTERNAL_VECTOR 0x20

#define SYSCALL_VECTOR 0x80

5.1.2 I386 IDT

La tabla i386 CPU IDT tiene un total de 256 entradas, una para cada interrupción. Vector Cada entrada es un descriptor de interrupción que describe el vector de interrupción correspondiente. El vector de interrupción es el índice del descriptor en el IDT. Cada descriptor de interrupción tiene un tamaño de 8 bytes. De acuerdo con la terminología de INTEL, el descriptor de interrupción también se denomina "Puerta".

El descriptor de interrupción tiene los siguientes cuatro tipos:

(1) Tarea de tareas: contiene el selector de segmento TSS de un proceso. Cada vez que se produce una señal de interrupción, se utiliza para reemplazar el selector de segmento TSS del proceso actual. Linux no utiliza tareas. El formato de las tareas es el siguiente:

(2) Puerta de interrupción: la puerta de interrupción contiene un selector de segmento y un desfase entre segmentos de un controlador de interrupción. Tenga en cuenta que cuando la CPU I386 atraviesa una compuerta de interrupción hacia el controlador de interrupción correspondiente, borra el indicador IF en el registro eflag, lo que enmascara la siguiente interrupción enmascarable posible.

(3) Puerta de captura: similar a la puerta de interrupción, excepto que la CPU no borra el indicador de IF cuando se transfiere al controlador de interrupción a través de la puerta de captura.

(4) Puerta de llamada: Linux no usa la puerta de llamada.

El formato de estos tres tipos de puertas se muestra en la Figura 5-2.

5.1.3 Interrupt Controller 8259A

Todos sabemos que en la PC se utilizan dos PIC de 8359A en cascada (Controlador de interrupciones programable, PIC para abreviar). ) para gestionar las señales de interrupción de los periféricos del sistema. Cada PIC 8259A proporciona ocho líneas de entrada IRQ (solicitud de interrupción, solicitud de interrupción, IRQ). En el modo en cascada, la línea de entrada de señal de interrupción del PIC Maestro 8259A (primer PIC) IR2 se usa para conectar en cascada el pin INT del PIC esclavo 8259A (segundo PIC), por lo que los 8259A pueden proporcionar un total de 15 disponibles. Línea de entrada IRQ. Como se muestra a continuación:

Figura 5-3 Conexión en cascada de los controladores de interrupción 8259A maestro y esclavo

5.1.3.1 Principios básicos del PIC 8259A

Copyright © Conocimiento de Windows All Rights Reserved