Controlador d'interrupcions

De la Viquipèdia, l'enciclopèdia lliure
Diagrama que mostra el flux d'una rutina d'interrupció.

En la programació de sistemes informàtics, un controlador d'interrupcions, també conegut com a rutina de servei d'interrupció o ISR, també manegador o gestor, és un bloc especial de codi associat a una condició d'interrupció específica. Els controladors d'interrupcions s'inicien per interrupcions de maquinari, instruccions d'interrupció de programari o excepcions de programari i s'utilitzen per implementar controladors de dispositius o transicions entre modes de funcionament protegits, com ara crides al sistema.

Una animació que mostra el flux d'una interrupció d'una manera simplificada.

[1]

Exemple de vector d'interrupció, el text en hebreu significa "Manejgador d'interrupcions"

La forma tradicional de controlador d'interrupcions és el controlador d'interrupcions de maquinari. Les interrupcions de maquinari sorgeixen de condicions elèctriques o protocols de baix nivell implementats en lògica digital, normalment s'envien mitjançant una taula codificada de vectors d'interrupció, de manera asíncrona al flux d'execució normal (tal com ho permeten els nivells d'emmascarament d'interrupcions), sovint utilitzant una pila separada, i entrant automàticament en un context d'execució diferent (nivell de privilegis) durant la durada de l'execució del controlador d'interrupcions. En general, les interrupcions de maquinari i els seus controladors s'utilitzen per gestionar condicions d'alta prioritat que requereixen la interrupció del codi actual que està executant el processador.[2][3]

Més tard es va trobar convenient que el programari pogués activar el mateix mecanisme mitjançant una interrupció de programari (una forma d'interrupció síncrona). En lloc d'utilitzar una taula de distribució d'interrupcions codificada en dur a nivell de maquinari, les interrupcions de programari sovint s'implementen a nivell de sistema operatiu com una forma de funció de devolució de crida.

Els gestors d'interrupcions tenen multitud de funcions, que varien en funció del que va activar la interrupció i de la velocitat a la qual el gestor d'interrupcions completa la seva tasca. Per exemple, prémer una tecla del teclat d'un ordinador,[4] o moure el ratolí, desencadena interrupcions que criden a controladors d'interrupcions que llegeixen la tecla, o la posició del ratolí, i copien la informació associada a la memòria de l'ordinador.[5] Un controlador d'interrupcions és una contrapartida de baix nivell dels controladors d'esdeveniments. No obstant això, els controladors d'interrupcions tenen un context d'execució inusual, moltes restriccions dures en el temps i l'espai, i la seva naturalesa intrínsecament asíncrona els fa notòriament difícils de depurar per la pràctica estàndard (generalment no existeixen casos de prova reproduïbles), per la qual cosa exigeixen un conjunt d'habilitats especialitzats, un subconjunt important de programació del sistema: d'enginyers de programari que participen a la capa d'interrupció de maquinari.

Semàfor d'interrupció[modifica]

A diferència d'altres gestors d'esdeveniments, s'espera que els gestors d'interrupcions estableixin els indicadors d'interrupció als valors adequats com a part de la seva funcionalitat bàsica.

Fins i tot en una CPU que admet interrupcions imbricades, sovint s'arriba a un controlador amb totes les interrupcions globalment emmascarades per una operació de maquinari de la CPU. En aquesta arquitectura, un controlador d'interrupcions normalment guardaria la menor quantitat de context necessària i, a continuació, restabliria el senyalador de desactivació d'interrupcions globals a la primera oportunitat, per permetre que interrupcions de prioritat més alta interrompin el controlador actual. També és important que el gestor d'interrupcions sufoqui la font d'interrupció actual per algun mètode (sovint canviant un bit de senyal d'algun tipus en un registre perifèric) de manera que la interrupció actual no es repeteixi immediatament a la sortida del controlador, donant lloc a un bucle infinit.

Gestors dividits en sistemes operatius moderns[modifica]

En diversos sistemes operatius — , Unix, macOS, Microsoft Windows, z/OS, DESQview i alguns altres sistemes operatius utilitzats en el passat — ‌ els controladors es divideixen en dues parts: el controlador d'interrupcions de primer nivell (FLIH) i els controladors d'interrupcions de segon nivell (SLIH). Els FLIH també es coneixen com a controladors d'interrupcions durs o gestors d'interrupcions ràpides, i els SLIH també es coneixen com a controladors d'interrupcions lents/soft o crides de procediment diferit a Windows.

Els FLIH que serveixen el maquinari solen emmascarar la seva interrupció associada (o mantenir-la emmascarada segons sigui el cas) fins que finalitzin la seva execució. Un FLIH (inusual) que desemmascara la seva interrupció associada abans de completar-se s'anomena gestor d'interrupcions reentrants. Els controladors d'interrupcions reentrants poden provocar un desbordament de pila a partir de múltiples preempcions pel mateix vector d'interrupció i, per tant, normalment s'eviten. En un sistema d'interrupció de prioritat, el FLIH també emmascara (breument) altres interrupcions d'igual o menor prioritat.

Referències[modifica]

  1. «Interrupt Handling - an overview | ScienceDirect Topics» (en anglès). https://www.sciencedirect.com.+[Consulta: 10 setembre 2023].
  2. «The Linux Kernel Module Programming Guide, Chapter 12. Interrupt Handlers» (en anglès). The Linux Documentation Project, 18-05-2007. [Consulta: 20 febrer 2015].
  3. Jonathan Corbet. «Linux Device Drivers, Chapter 10. Interrupt Handling» (en anglès). O'Reilly Media, 27-01-2005. [Consulta: 20 febrer 2015].
  4. «The Linux Kernel Module Programming Guide, Chapter 12. Interrupt Handlers» (en anglès). The Linux Documentation Project, 18-05-2007. [Consulta: 20 febrer 2015].
  5. Jonathan Corbet. «Linux Device Drivers, Chapter 10. Interrupt Handling» (en anglès). O'Reilly Media, 27-01-2005. [Consulta: 20 febrer 2015].