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.
- Sauvegarde de tous les registres pour sauvegarder le contexte actuel, registres généraux et de segments
- Traitement effectif de l'interruption (langage C)
- Restauration de tous les registres sauf eflags (Assembleur)
- Retour à l'instruction interrompue, dépile eflags (à l'aide de iret)
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 :
- sti : Store Interrupt, pour activer toutes les interruptions
- cli : Clear Interrupt, pour désactiver toutes les interruptions
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 :
- Une partie Top Half
Cette première partie permet de prendre en compte l'information en accédant au périphérique concerné. Le processeur interroge le périphérique et si besoin récupère les informations nécessaires et les place dans un buffer.
Cette partie est non-interruptible.
- La deuxième partie Bottom-half
Cette deuxième partie s'occupe du traitement réel plus gourmand en processeur. L'accès au matériel n'est plus nécessaire et cette partie est donc interruptible.