Linux maneja las excepciones e interrumpe

  

1. Manejo de excepciones

Linux usa excepciones para lograr dos propósitos distintos:

· Envíe una señal al proceso para notificar una situación anómala

· Administre los recursos de hardware < Br>

Para el primer caso, por ejemplo, si el proceso realiza una operación de dividir por 0, la CPU generará una excepción de <; error de división " y el controlador de excepciones correspondiente enviará un SIGFPE al proceso actual Señal Después de que el proceso actual recibe esta señal, toma varios pasos necesarios para recuperarse del error o terminar la ejecución (si no hay un controlador de señal correspondiente para esta señal).

Para el segundo caso, el kernel usa dos excepciones para administrar eficientemente los recursos de hardware, y los controladores correspondientes son más complicados. En este caso, la excepción no indica una condición de error:

· use la excepción "Dispositivo no disponible" para diferir la carga de los registros de punto flotante.

· Use " Acerca de la página '; excepción para posponer el nuevo marco de página al proceso.

El kernel tiene una estructura estándar para la llamada del controlador de excepciones, que consta de las siguientes tres partes:

· Guarda el contenido de la mayoría de los registros en la pila del kernel (implementado en lenguaje ensamblador)

· Al llamar al controlador de excepciones escrito por C

· se sale de la excepción a través de la función ret_from_exception ().

El manejo específico de las excepciones en el kernel no se describe en detalle aquí. En el Capítulo 6, Administración de memoria, nos referiremos al controlador de excepciones "pageout". El enfoque de esta sección es el manejo de interrupciones.

2. Manejo de interrupciones

Cuando se produce una interrupción, no todas las operaciones tienen la misma urgencia. De hecho, no es apropiado colocar todas las operaciones en el propio controlador de interrupciones. Las operaciones largas y no críticas que requieren mucho tiempo deberían retrasarse, ya que cuando se está ejecutando un controlador de interrupciones, la señal que se vuelve a emitir en la línea de interrupción de IRQ correspondiente se ignora. Más importante aún, el controlador de interrupciones se ejecuta en nombre del proceso, y el proceso que representa debe estar siempre en el estado TASK_RUNNING. De lo contrario, puede ocurrir un zombie del sistema. Por lo tanto, el controlador de interrupciones no puede realizar ningún proceso de bloqueo, como las operaciones del dispositivo de E /S. Por lo tanto, Linux divide las operaciones a realizar por una interrupción en las siguientes tres categorías:

(1) Crítico (

operaciones como los controladores de interrupción cuando llega una interrupción Confirme, reprograme el controlador de interrupción o el controlador del dispositivo, o modifique la estructura de datos a la que accede tanto el dispositivo como el procesador. Estas operaciones son urgentes y deben realizarse muy rápidamente, es decir, las operaciones de emergencia deben realizarse inmediatamente dentro de un controlador de interrupciones, y la interrupción está deshabilitada.

(2) No crítico (No crítico)

Operaciones como la modificación de estructuras de datos a las que solo puede acceder el procesador (por ejemplo, después de escanear una tecla, lea el código de escaneo). Estas operaciones también se realizan muy rápidamente, por lo que son ejecutadas inmediatamente por el controlador de interrupciones, pero con la interrupción habilitada.

(3) Deferrable no crítico

Esta operación, por ejemplo, copia el contenido de un búfer al espacio de direcciones de algunos procesos (por ejemplo, el búfer de línea del teclado) El contenido se envía al proceso del controlador de terminal). Estas operaciones pueden demorarse por intervalos más largos sin afectar las operaciones del kernel: los procesos interesados ​​esperarán los datos requeridos. Las operaciones retardables que no son de emergencia se realizan mediante una serie de funciones llamadas "mitad inferior" (mitades inferiores). Discutiremos la "parte inferior" en la siguiente sección.

Todos los manejadores de interrupciones realizan cuatro operaciones básicas:

· Guarda el valor de IRQ y el contenido del registro en la pila del núcleo.

· Envía un acuse de recibo al controlador de interrupción conectado a la línea de interrupción IRQ, lo que permitirá que se envíen más solicitudes de interrupción en esta línea de interrupción.

· Ejecute la rutina de servicio de interrupción (ISR) para todos los dispositivos que comparten este IRQ.

· Salta a la dirección de ret_from_intr () y termina.

Copyright © Conocimiento de Windows All Rights Reserved