CONCEPTION D'UN OS - Segmentation & Interruptions

Interruptions - Routine

Routine

Une routine se déroule en 4 étapes principales, découpées dans des fonctions aux langages différents. L'assembleur est utilisé pour la gestion de la pile, et le langage C est utilisé en général pour le traitement réel de la routine.

  1. Sauvegarde de tous les registres pour sauvegarder le contexte actuel, registres généraux et de segments
  2. Traitement effectif de l'interruption (langage C)
  3. Restauration de tous les registres sauf eflags (Assembleur)
  4. Retour à l'instruction interrompue, dépile eflags (à l'aide de iret)
Tous les registres sont restitués à l'identique avant de revenir au programme interrompu.

Activation/Désactivation des interruptions

Il est possible d'activer ou de désactiver toutes les IRQ, comme je l'ai déjà mentionné. Cela peut être utile pour être sûr qu'aucune autre interruption ne viendra perturber l'exécution d'une routine.
Pour réaliser cette opération, il existe 2 instructions assembleurs :

Ces instructions permettent de modifier le bit IF (Interrupt flag) du registre eflags du processeur.
eflags est un registre 32 bits qui rend compte de l'état du processeur après chaque instruction. Il est composé du sous-registre flags (16 bits de poids faible). On n'accède jamais à ce registre dans son intégralité, mais toujours bit par bit lorsqu'on veut une information bien précise sur, par exemple, le résultat d'une comparaison ou d'une opération arithmétique, ou dans notre cas l'état du masque sur les interruptions

Top-Halves et Bottom-Halves

Le fait de rendre les routines interruptibles peut poser des problèmes mais la solution de désactiver les interruptions lors d'un traitement d'une routine pose des problèmes de réactivité. En effet, le traitement est alors mis en attente et le système perd énormément en réactivité, puisqu'aucune interruption matérielle ne peut être servie pendant ce temps

Pour cela, certains OS découpent le traitement de la routine en 2 parties :