CONCEPTION D'UN OS - Segmentation & Interruptions
Interruptions - Vecteur d'interruption
Vecteur d'interruption
Une table permet d'associer a chaque interruption une routine à exécuter, c'est la table IDT (Interrupt Descriptor Table). A chaque interruption est associée un "vecteur" qui est un index dans cette table afin de déclencher la bonne procédure.
Le processeur accède à cette procédure grâce à l'index sur l'IDT associé à l'interruption.
Cette table contient donc 256 entrées, une par interruptions. Les 32 premières sont réservées aux exceptions, les 16 suivantes aux interruptions matérielles puis les suivantes aux interruptions logicielles.
Il faut que le contrôleur d'interruptions soit configuré pour que lors d'une levée d'IRQ0 le processeur accède à l'entrée 32 de la table. Pour l'IRQ x, il faut donc accéder à l'entrée x + 32 de l'IDT pour trouver l'adresse de la routine associée à l'interruption.
Entrées de l'IDT
La table IDT contient des descripteurs systèmes appeles 'gates'. Il y a plusieurs types de gates, mais pour traiter les interruptions materielles et les exceptions, on utilise classiquement les 'interrupt gate'. Un descripteur est une structure qui pointe sur une routine.
Un descripteur a une longueur fixe de 64 bits.
Il y a 3 types de descripteurs :
-
trap gates
Type le plus simple. On donne l'adresse de la routine (32 bits), le segment de code à utiliser, et le privilège requis pour exécuter l'interruption. -
interrupt gates
Similaire au trap gate, mais un bit change, signifiant que la routine associée est non interruptible. Les interruptions vont être désactivées avant l'appel à la routine task gates
Les "task gate" référence un « TSS descriptor » de la GDT. C’est à dire que lorsque le processeur recevra l’interruption, il effectuera une commutation de tâche c’est à dire le mécanisme de préemption, habituel des systèmes multitâches.
Registre important
IDTR
La table IDT est à implémenter par le développeur du système d'exploitation. Il est donc important de pouvoir trouver son adresse.
Pour cela, il y a un registre IDTR qui contient l'adresse de l'IDT.
Le registre IDTR, de longueur 48 bits, se compose de deux champs. Le premier champ contient l’adresse du début de l'IDT en mémoire.
Le second champ correspond à la limite de l'IDT en mémoire, et est calculé de la manière suivante :
IDT_limit = taille IDT – 1.
Grâce à ce registre, on peut placer l’IDT dans n’importe quel emplacement mémoire.
2 instructions assembleurs sont nécessaires aussi :
- sidt : pour stocker l'adresse de la table
- lidt : pour récupérer l'adresse de la table