¿Cómo gestiona una CPU las peticiones de componentes y periféricos?

Las CPU no hacen más que procesar programas de manera secuencial, pero somos tan impertinentes que estamos haciendo que continuamente dejen de ejecutar el programa y las interrumpimos. ¿Cómo? Pues al pulsar una tecla, mover el ratón. En este artículo os vamos a explicar cómo funcionan las peticiones de interrupción o IRQ.

Una petición de interrupción o más conocida como IRQ, siglas que significan Interrupt ReQuest, es un mecanismo indispensable en toda CPU para poder interactuar con ella a todos los niveles, tanto por parte de los usuarios como el resto del hardware.

¿Qué son las peticiones de interrupción o IRQ?

Render CPU Código

Una CPU lo que hace es ejecutar un programa de forma secuencial, pero de repente pulsamos una tecla y la vemos imprimida en pantalla. En muy poco tiempo la CPU ha tenido que parar el programa principal y atender la petición del teclado para imprimir dicha letra en pantalla, por lo que ha habido una interrupción del hilo de ejecución principal. A este fenómeno de interrumpir una CPU se le llama petición de interrupción o IRQ.

Las peticiones de interrupción o IRQ son en general señales enviadas por la CPU por dispositivos externos, en especial periféricos conectados a los puertos de E/S. La forma de gestionar las interrupciones depende de cuál sea su origen, pero en cuanto a hardware ocurren cuando un periférico o un componente requiere la atención de la CPU. Puede ser que necesiten intercambiar datos con la CPU a través del espacio de memoria común, coherente, o avisen que una tarea que estaban haciendo ya ha sido terminada.

Las peticiones a interrupción vía hardware se dividen en dos tipos distintos:

  • Interrupciones enmascarables: En el caso de que haya varias peticiones de interrupción, estas son las que tienen menos preferencia a la hora de resolverse.
  • Interrupciones no enmascarables: Cuando hay varias interrupciones al mismo tiempo estas son las que mayor preferencia tienen a la hora de solucionarse.

Peticiones de interrupción o IRQ vía software

petición interrupción software

El software también puede generar interrupciones a través de la rutina para los mismos del sistema operativo, esto se hace a través de una «llamada al sistema». En todo ordenador que ejecute un sistema operativo avanzado el sistema operativo ha de ser capaz de invocar el sistema de interrupciones de la CPU si le es necesario.

El motivo de ello es que esto es necesario de cara a gestionar los accesos a los programas en multitarea, ya que cada programa es un hilo de ejecución distinto que se podría ejecutar en un núcleo diferente. Ahora bien, contad la cantidad de aplicaciones abiertas y los núcleos de vuestra CPU y veréis que no todas se pueden gestionar al mismo tiempo, es por ello que el sistema operativo hace interrumpir un hilo de ejecución de un programa para iniciar otro.

En el caso de las aplicaciones de segundo plano, estos dejan su estado actual en la RAM del sistema, pero están siempre a punto para volverse a invocar a través de una llamada al sistema. Con los SSD y la unificación del direccionamiento entre SSD y memoria, será posible enviar las aplicaciones en segundo plano al SSD e invocarlas tal cual estaban.

¿Cómo gestiona una CPU una petición de interrupción o IRQ?

Mecanismo interrupciones

Para gestionar una petición de interrupción la CPU ha de parar en seco el ciclo de instrucción, cada vez que una instrucción es completada la propia CPU va a comprobar si existe una petición de interrupción. En el caso de que no exista ejecutará la siguiente línea de código del programa. Si existe lo que hará será almacenar el estado del programa en un registro especial. Siendo el estado el valor de la siguiente instrucción en el contador de programa.

Dependiendo del cual sea el tipo de instrucción, la CPU cargará en el contador de programa una dirección de memoria especial que apunta a la ROM de instrucciones, un programa en una memoria aparte del procesador que tiene codificado como la CPU tiene que gestionar dicha instrucción. Las instrucciones no enmascarables son las que tienen preferencia y una vez ejecutada el proceso de interrupción desde el registro en el que está almacenado valor del contador de programa se copia en este para continuar con la ejecución habitual.

Los FLAGS de una CPU

FLAGS x86

Toda CPU tiene una serie de registros de un solo bit que indican cuando se producen ciertos fenómenos, los FLAGS en las CPU con ISA x86 los podéis ver en la imagen de arriba bien descritos. Todos ellos se encuentran resumidos en un registro de 32 bits de ancho, donde cada bit representa un estado de la CPU distinto.

En el caso de los x86 es necesario que un dispositivo de hardware llamado PIC, Programmable Interrupt Controller, al que están conectados los diferentes periféricos se encarga de realizar las peticiones de interrupción. Este agente intermedio originalmente era un chip aparte y se ideó para disminuir la cantidad de interfaces hacía la CPU, pero con la adopción del controlador de E/S en las CPU modernas ha pasado a formar parte del SoC.

Es por tanto el PIC, el que se encarga remotamente de enviar peticiones de interrupción a la CPU, para ello solo necesita la señal que active uno de los bits del registro de los registros FLAGS del procesador. Pero si observamos bien veremos que existen tres bits que gestionan las interrupciones: Interrupt Enable Flag en el bit 9, Virtual Interrupt Flag en el bit 19 y Virtual Interrupt Pending en el bit 20.

Interrupciones Virtuales

interrupción IRQ Virtual

Muchos sistemas contemporáneos hacen uso de máquinas virtuales, esto significa que el sistema operativo no es el software más cercano y con más privilegios del procesador sino el hipervisor sobre el que está corriendo. Esto provoca un conflicto a la hora de manejar las interrupciones a nivel de software. ¿La solución? Darle al hipervisor una mayor jerarquía y crear FLAGS adicionales. El Interrupt Enable Flag se activa cuando un sistema operativo es ejecutado sin un hipervisor debajo y por tanto en solitario. En el caso de que haya un hipervisor es el propio hipervisor el que tiene preferencia sobre el Interrupt Enable Flag.

Si un sistema operativo esta virtualizado, entonces el bit que se activará es el Virtual Enable Flag. El motivo de esta separación es que en cada momento los diferentes sistemas operativos que se están ejecutando ven los periféricos de manera distinta y de ahí la necesidad de una gestión de las interrupciones aparte. Básicamente al activar el Virtual Enable Flag lo que hace es recordarle a la CPU que son los hilos de ejecución relacionados con la máquina virtual los que se tienen que parar para gestionar la interrupción y no otros.