Interrupt Descriptor Table

La table de description des interruptions est une table qui permet au cpu de pouvoir savoir ou aller (jump) quand il y a une interruption.

Il y a deux structures utilisées (en 64bit) :

  • La table d'entrée d'interruptions
  • L'entrée de la table d'interruptions

Table d'entrée

La table d'entrée contient une adresse qui situe une table d'entrée d'IDT et la taille de la table (en mémoire).

Pour la table d'entrée la structure est comme ceci :

nomtaille
taille16 bit
adresse de la table64 bit

La table d'entrée peut être définie comme ceci:

IDT_entry_count = 64; 
IDT_Entry_t ent[IDT_entry_count];
IDT_table.addr = (uint64_t)ent;
IDT_table.size = sizeof(IDT_Entry_t) * IDT_entry_count;

entrée d'IDT

l'entrée d'une IDT en mode long doit être structurée comme ceci :

nomtaille
offset (0-16)16 bit
segment de code16 bit
index de l'ist8 bit
attributs8 bit
offset (16-32)16 bit
offset (32-64)32 bit
zéro32 bit

Le segment de code étant le segment de code utilisé pendant l'interruption.

L'offset est l'adresse où le CPU va jump si il y a une interruption.

Les attributs

l'attribut d'une entrée d'une IDT est formée comme ceci :

nombit
type d'interruption0 - 3
zéro4
niveau de privilège5 - 6
présent7

Le niveau de privilège (aka DPL) est le niveau de privilège requis pour que l'interruption soit appelée.

Il est utilisé pour éviter à ce que une application utilisatrice puisse appellée une interruption qui est réservée au kernel

Types d'interruptions

Les types d'interruptions sont les mêmes que cela soit en 64bit ou en 32bit.

valeursignification
0b0111 (7)trappe d'interruption 16bit
0b0110 (6)porte d'interruption 16bit
0b1110 (14)porte d'interruption 32bit
0b1111 (15)trappe d'interruption 32bit

La différence entre une trappe(aka trap) et une porte (aka gate) est que la gate désactive IF, ce qui veut dire que vous devrez réactiver les interruptions à la fin de l'ISR.

La trappe ne désactive pas IF donc vous pouvez désactiver / réactiver vous même dans l'isr les interrupts.

Index de l'IST

L'ist (Interrupt Stack Table) est utile au changement de stack avant une interrupt:

nombit
index de l'ist0 - 3
zéro4 - 7

Si l'index de l'ist est à 0 alors l'ist n'est pas actif. Si il n'est pas à 0 il chargeras alors la stack (RSP) à partir de l'ist correspondant dans la tss.