Interrupt Descriptor Table

Un article de Wikipédia, l'encyclopédie libre.

L'IDT ou Interrupt Descriptor Table, est une table système d'interruptions sur les architectures x86.

Il s'agit d'un tableau stocké dans la mémoire vive (à l'adresse 0x0 par défaut) qui associe chaque vecteur d'interruption à un descripteur appelé porte.

Chaque descripteur correspond à une interruption. Les 32 premières sont réservées aux exceptions (erreurs) générées par le microprocesseur. Les interruption matérielles peuvent aussi être utilisées avec ce tableau. Toutes sont librement appelables par les programmes utilisateurs par le biais de l'instruction int[1] d'assembleur. Au total, il y a un maximum de 256 interruptions.

Sommaire

[modifier] Descripteur et classification

[modifier] Format d'un descripteur

Chaque descripteur a la structure suivante : (des bits les plus hauts vers les bits les plus bas)

  • 16 bits : les 16 bits les plus faibles de l'offset de la fonction (gestionnaire d'interruption ou d'exception ) associée à l'interruption
  • 16 bits : le sélecteur du segment de code
  • 1 bit : Drapeau IF ( sur "1" pour activer le masquage des interruptions masquables)
  • 2 bits : DPL, de 0 à 3 inclus, qui indique le niveau de privilèges requis pour appeler l'interruption (0 est le plus élevé)
  • 1 bit : doit être mis à 0
  • 4 bits : le type d'interruption ( Porte d'interruption, de trappe ou de tâche)
  • 8 bits : tout à 0
  • 16 bits : les 16 bits les plus hauts de l'offset de la fonction associée à l'interruption

[modifier] Classification et terminologie Intel

Intel classe les différents types de porte comme cela :

  • Les portes de type interruption dont le drapeau IF est toujours baissé (désactivation des interruptions)
  • Les portes de type trappe semblable au porte de type interruption mais le drapeau IF est levé
  • Les portes de type tâche contiennent le sélecteur du TSS du processus courant (très peu utilisés)

[modifier] Classification et terminologie Linux

Linux classe différemment les différents types de portes (descripteur) qu'il intègre dans l'IDT :

  • les portes d'interruption sont des portes intel de type interruption dont le DPL est égal à 0 (les programmes utilisateurs ne peuvent appeler ces vecteurs par l'interruption "int").
  • La porte d'interruption systèmes est une porte intel de type interruption dont le DPL est égal à 3. Il n'en existe qu'une seule : l'instruction "int3".
  • Les portes de trappe sont des portes de trappe intel dont le DPL est égal à 0.
  • Les portes systèmes sont des portes de trappe intel dont le DPL est égal à 3. Elles concernent les exeptions "into" "bound" et "int0x80" (appel système)
  • La porte de tâche est une porte de type tâche intel dont le DPL est égal à 0. Elle concerne uniquement l'exception "erreur double"

[modifier] Initialisation de l'IDT

Pour créer une IDT, vous devez enregistrer dans la mémoire les différentes entrées, puis créer un descripteur de 48 bits (16 bits forts pour la taille en octets de l'IDT et 32 bits faibles pour l'offset en mémoire où est stockée la première entrée) et le passer au microprocesseur par l'intermédiaire de l'instruction d'assembleur lidt

[modifier] IDT sur d'autres architectures de processeur

L'IDT de x86 et celle de AMD64 sont très semblables, le but étant d'assurer une bonne compatibilité de chaque noyau de système d'exploitation par rapport au processeur utilisé (Intel ou AMD).

Par contre, sur d'autres architectures de processeur, l'équivalent de l'IDT a un format bien différent.

[modifier] Notes

  1. (en) INT (x86 instruction)
Autres langues