Gestión de IRQs en Linux: Todo lo que necesitas saber
Las Solicitudes de Interrupción (IRQ) son llamadas que los dispositivos pueden hacer para solicitar atención especial del procesador.
La mayoría de las computadoras ofrece solo 16 interrupciones de hardware. Puede parecer poco para las configuraciones modernas con los más diversos dispositivos. Afortunadamente los IRQs pueden ser compartidos.
El mecanismo de manejo de las interrupciones hace que la CPU esté atenta a los eventos externos a la secuencia de instrucciones que está ejecutando, para cuando sea necesaria una interrupción del procesamiento normal para atender a otra solicitud.
En grandes sistemas multiusuario, una constante ráfaga de interrupciones se dirige al procesador.
Respuestas rápidas a estas interrupciones son esenciales para mantener los recursos del sistema bien utilizados, y para proporcionar tiempos de respuesta aceptables para los usuarios.
Es importante saber que estos recursos son limitados y necesitan ser administrados para que los conflictos entre los dispositivos sean evitados.
De esta forma, los sistemas operativos reaccionan a eventos que representan las solicitudes de servicios.
Por ejemplo, si una aplicación necesita la lectura de un archivo, realiza la solicitud a una función ejecutada por el sistema operativo.
Este accederá al controlador del periférico y solicitará la transferencia de los datos hacia la dirección de memoria informada en la solicitud del servicio.
El controlador del periférico al terminar avisa al procesador a través de una solicitud de interrupción que hará que el sistema operativo ejecute una rutina para su manejo.
Las interrupciones pueden ser generadas por los siguientes eventos:
- Generadas por programa que son implementadas con el uso de instrucciones especiales;
- Por error, como en la división por cero, referencia a la memoria fuera del espacio permitido, etc.;
- Por tiempo, como en la planificación;
- Falla de hardware;
- Por eventos de entrada y salida de datos señalando el final de operación o condición de error.
- Entonces, los eventos generados por las interrupciones provocan la ejecución de la rutina de manejo correspondiente a la fuente de la interrupción en el sistema operativo.
Al hacer el manejo de las interrupciones de hardware, el dispositivo solicitante interrumpe el procesador.
Este termina la ejecución de la instrucción actual, verifica la existencia de interrupción y guarda el estado actual del proceso que perderá el control del procesador en la memoria.
El procesador carga el contador de programa con la dirección de la rutina de manejo de la interrupción y transfiere su control a la rutina de manejo de la interrupción.
La rutina de manejo de la interrupción se ejecuta y, al finalizar, restaura el estado anterior para retornar a la ejecución de la rutina interrumpida.
Un núcleo simple deshabilita el manejo de interrupciones mientras responde a una interrupción. Estas son nuevamente habilitadas después de que el procesamiento esté completo.
Si hay un flujo permanente de interrupciones, como en los sistemas multiusuario, este esquema puede causar interrupciones deshabilitadas por un gran tiempo y respuestas insatisfactorias.
Para evitar esto, el Kernel debe estar atento al tiempo máximo de procesamiento permitido para cada interrupción. Si esa porción de tiempo se excede, pasa el resto del procesamiento de la interrupción a otro proceso apropiado del sistema que terminará de manejarlas, mientras el núcleo continúa apto para recibir nuevas interrupciones.
Esto significa que pueden mantenerse habilitadas durante mucho tiempo, y el sistema se vuelve más eficiente en responder a las solicitudes de las aplicaciones de los usuarios.
La lista de IRQs del sistema se puede ver en el archivo
# cat /proc/interrupts
CPU0
0: 78 IO-APIC 2-edge timer
1: 9 xen-pirq 1-ioapic-edge i8042
4: 3409 xen-pirq 4-ioapic-edge
8: 2 xen-pirq 8-ioapic-edge rtc0
9: 0 xen-pirq 9-ioapic-level acpi
12: 3 xen-pirq 12-ioapic-edge i8042
14: 0 IO-APIC 14-edge ata_piix
15: 0 IO-APIC 15-edge ata_piix
48: 14474493 xen-percpu-virq timer0
49: 0 xen-percpu-ipi resched0
50: 0 xen-percpu-ipi callfunc0
51: 0 xen-percpu-virq debug0
52: 0 xen-percpu-ipi callfuncsingle0
53: 0 xen-percpu-ipi spinlock0
54: 211 xen-dyn-event xenbus
55: 755401 xen-dyn-event blkif
56: 887240 xen-dyn-event eth0
NMI: 0 Non-maskable interrupts
LOC: 0 Local timer interrupts
SPU: 0 Spurious interrupts
PMI: 0 Performance monitoring interrupts
IWI: 0 IRQ work interrupts
RTR: 0 APIC ICR read retries
RES: 0 Rescheduling interrupts
CAL: 0 Function call interrupts
TLB: 0 TLB shootdowns
TRM: 0 Thermal event interrupts
THR: 0 Threshold APIC interrupts
DFR: 0 Deferred Error APIC interrupts
MCE: 0 Machine check exceptions
MCP: 1216 Machine check polls
HYP: 16105716 Hypervisor callback interrupts
ERR: 0
MIS: 0
PIN: 0 Posted-interrupt notification event
PIW: 0 Posted-interrupt wakeup event
¿Quieres aprender más sobre Linux? Conoce nuestro curso para el examen LPI
Aprende mucho más sobre Linux en nuestro curso en línea. Puedes hacer la inscripción aquí con trial de 7 días gratis. Si ya tienes una cuenta, puedes acceder aquí.
¿Te gustó? ¡Compártelo :-)
Eso fue solo una pieza. El curso enseña el camino completo — desde tu primer comando hasta el día del examen.