Title: Etienne Tremblay
1Etienne Tremblay
- Ordinateurs, Structure et Applications
GIF-16116
Cours 10, Les interruptions
Université Laval, Hiver 2007
2Les interruptions du 8086
- Une interruption interrompt lexécution
séquentielle des instructions par le CPU. Lors
dune interruption, lexécution du programme
principal est suspendue. Linterruption est
exécutée, puis le programme principal est
continué. - Les sauts conditionnels ou inconditionnels ainsi
que les appels de sous-routines ne sont pas des
interruptions. - Il existe 2 catégories dinterruptions les
interruptions hardware et les interruptions
software. Les interruptions hardware surviennent
lorsque les lignes RST, NMI ou INTR du 8086 sont
activées. Les interruptions software surviennent
lorsque linstruction INT apparaît ou lors
dexceptions logicielles (exemples débordement
de pile (stack overflow), division par zéro). - Toutes les interruptions ont un numéro de 0 à
255d, sauf reset. Certains numéros sont fixés par
le matériel, dautres par les concepteurs du 8086
et finalement il en reste de disponibles pour le
programmeur. - Les interruptions ont des priorités. Elles sont,
du plus prioritaire au moins prioritaire Reset,
Exceptions, INT, NMI et INTR. À lintérieur dune
de ces catégories, lINT avec le numéro le plus
bas est habituellement la plus prioritaire. Une
interruption de haute priorité peut interrompre
une interruption de priorité inférieure. Une
interruption de basse priorité ne peut pas
interrompre une interruption de priorité égale ou
supérieure. Linterruption Reset est la plus
prioritaire.
3Interruptions vectorisée
- La table des vecteurs dinterruption contient
ladresse des instructions à exécuter lorsquun
interruption survient. Pour chaque interruption,
la table contient 4 bytes dinformation CS et
IP. La taille de la table des vecteurs
dinterruption est donc 256ints 4bytes 1Ko. - La table des vecteurs dinterruption commence à
ladresse 00000h et elle finit à ladresse
003FFh. Ne pas mettre de segments à cet
endroit!!! - Lorsquune interruption survient, le numéro de
linterruption permet de trouver lemplacement
des instructions à exécuter. Le numéro de
linterruption est multiplié par 4 afin de
trouver ladresse du CS et du IP à rechercher (IP
est à ladresse inférieure, suivi de CS). Puis un
JMP à CSIP est fait. CSIP est un vecteur
vers le code à exécuter afin de répondre à
linterruption. - Exemple Si le contenu de la mémoire, à partir de
ladresse 00000h est 00h, 01h, 02h, 03h, 04h,
05h, 06h, 07h, 08h, etc... et que linterruption
1 survient, alors la routine à ladresse
07060504 sera exécutée. - Reset est la seule interruption sans numéro. Pour
reset, CSIP FFFF0H.
4Séquence dévènements aprèsune interruption
- Lors dune interruption logicielle ou matérielle,
les évènements suivants se produisent - Le 8086 termine linstruction en cours.
- Le drapeau IF est testé si linterruption
provient de la ligne dinterruption matérielle
(INTR). Si le drapeau est à 0, linterruption est
ignorée. - Si une autre interruption de priorité supérieure
ou égale est en cours, linterruption est
ignorée. - 3 registres sont mis sur la pile (PUSH) dans
lordre qui suit les drapeaux, CS actuel, puis
IP actuel. Le drapeau IF est mis à 0 après le
PUSH des flags. - Un JMP est exécuté avec à ladresse CSIP trouvée
dans la table des vecteurs dinterruption à
partir du numéro de linterruption. - La routine de service de linterruption (ISR ou
Interrupt Service Routine) est exécutée. - Théoriquement, la dernière instruction de lISR
est IRET (Interrupt RETurn). Un IRET est
équivalent à trois POP dans cet ordre IP, CS et
drapeaux.
5Interruptions Internes (Exceptions)
- Les interruptions internes sont des interruptions
qui peuvent se produire sans que linstruction
INT soit présente. Il sagit dexceptions qui
surviennent quand un évènement logiciel spécial
arrive (division par zéro par exemple) - Linterruption 0 survient lorsque le diviseur de
DIV ou IDIV est 0. - Linterruption 4 survient lorsque le drapeau
Overflow est 1 et que linstruction INTO est
exécutée. - Les interruptions 1 et 3 servent pour du debug de
programme. - Note Comme pou toutes les interruptions, les
interruptions internes désactivent les
interruptions matérielles.
6Interruptions matérielle (1)
7Interruptions matérielles (2)
- Le 8086 a 3 pins pour les interruptions
hardwares RESET, NMI et INTR. - La ligne RESET crée un reset du CPU si est HIGH
pendant au moins 4 cycles dhorloge. - La ligne NMI (Non Maskable Interrupt) déclenche
linterruption 2 lorsquelle passe de LOW à HIGH.
Linterruption NMI nest pas désactivé lorsque IF
est 0, contrairement aux interruptions sur INTR,
doù son nom. Une utilisation typique de NMI est
la détection de coupure de lalimentation
électrique. - La ligne INTR sert à toutes les autres
interruptions matérielles du 8086. Une
interruption est se produit lorsque la ligne est
à Vcc. - Étant donné que le 8086 nutilise quune ligne
pour la plupart des interruptions matérielles
(INTR), un PIC (Programmable Interrupt Controler)
servait initialement a multiplexer 8
interruptions pour nen former quune seule.
Comme 8 interruptions sest révélé rapidement
insuffisant, un autre PIC a été ajouté. Afin de
respecter le design déjà en place, linterruption
hardware 2 a été re-dirigée (voir plus loin). Le
8086 supporte donc 16 interruptions matérielles
(nommée IRQ0 à IRQ15). - De nos jours, les PICs sont inclus dans le
chipset. - À chaque interruption matérielle correspond un
numéro dinterruption qui nest pas égal au
numéro dinterruption matériel. Par exemple, IRQ0
est lINT 08. La page suivante donne une
correspondance typique entre les IRQ et les
périphériques du PC.
8Interruptions matérielles (3)
9Interruptions matérielles (4)
- La séquence dévènements suivante se produit
lorsquun périphérique produit une interruption - Le PIC reçoit et traite linterruption
- Un registre interne du PIC permet au programmeur
du 8086 de masquer (désactiver) certaines
interruptions - Le PIC met linterruption dans un buffer
- Le PIC regarde les priorités des interruptions et
détermine si linterruption matérielle courante
est la plus prioritaires - La ligne INTR est activée par le PIC pour dire au
8086 quil y a interruption - Un pulse de 0Vdc provenant du 8086 apparaît sur
la ligne INTA pour signaler au PIC que
linterruption est reçue (Acknowledged). La ligne
INTR est désactivée après le pulse. - Un deuxième pulse de 0Vdc provenant du 8086
demande au PIC de mettre le numéro de
linterruption sur le bus de donnée. - Le PIC met le numéro de lINT sur le bus de
donnée il ne met pas le numéro de lIRQ. - Le 8086 exécute la routine de service de
linterruption - Le 8086 envoit un EOI (End Of Interrupt) pour
dire au PIC que linterruption est terminée.
10Interruptions matérielles (5)
- Linsertion dun deuxième PIC sur la ligne IRQ2
du premier PIC a plusieurs conséquences découlant
surtout dun désir de conserver la compatibilité
avec les designs nayant quun seul PIC - Les périphériques connectées sur IRQ2 ont été
connectés sur IRQ9 (re-direction). Comme le
vecteur dinterruption de IRQ9 nest pas le même
que celui de IRQ2, il faut que IRQ9 appelle le
vecteur dinterruption de IRQ2 pour les designs
avec un seul PIC. - Désactiver lIRQ2 à lintérieur du PIC principal
désactive les IRQ8 à IRQ15. - Les interruptions hardware 8 à 15 sont plus
prioritaires que les interruptions hardware 3 à
7. - Les routines de service dinterruption hardware
IRQ8 à IRQ15 doivent gérer 2 PICs (cest-à-dire
en voyer 2 End Of Interrupt).
11Interruptions Logicielles
- Les interruptions logicielles sont utilisées pour
exécuter des tâches logicielles ayant priorité
sur le programme principal. - Une interruption logicielle sappelle avec
linstruction INT où est le numéro de
linterruption. - Chaque interruption peut avoir des
sous-fonctions. Pour spécifier une sous-fonction,
il faut placer dans un registre prédéterminé le
numéro de la sous-fonction voulu avant d'appeler
l'interruption (le registre est souvent AH). La
sous-routine de service de linterruption testera
la valeur du registre prédéterminé et aiguillera
la sous-routine en conséquence. - Voici quelques exemples tirés de EMU8086
- INT 20h - Quitte le système d'exploitation.INT
21h / AH09h - Sortie d'une chaîne de caractères
depuis DSDX.INT 21h / AH0Ah - Entrée d'une
chaîne de caractères vers DSDX, le premier octet
indique la taille du buffer, le deuxième octet
indique le nombre de caractères réellement
lus.INT 21h / AH4Ch - Quitte le système
d'exploitation.INT 21h / AH01h - lit un
caractère sur l'entrée standard, avec écho, le
résultat est stocké dans AL.INT 21h / AH02h -
écrit un caractère vers la sortie standard, DL
le caractère à écrire, après exécution, AL DL.
12Table résumée des INTs
Tiré de http//www.beyondlogic.org/interrupts/int
erupt.htm
13Détournement des Interruptions
- Lors du démarrage du PC, la table des vecteurs
dinterruption est chargées avec des valeurs par
défaut. - Pour détourner une interruption, il suffit de
changer la table des vecteurs dinterruptions.
Changer le CS et lIP à ladresse 4( de lINT à
détourner) permet de changer le code exécuté
lorsque linterruption se produira. - En temps normal, la nouvelle ISR appellera
lancienne ISR sous certaines conditions. Pour
cette raison, sauvegarder le CS et lIP de
linstruction que lon remplace est une pratique
recommandée (habituellement la sauvegarde se fait
dans des variables déclarée à cet effet). - Le fichier DetourneInt21h.asm est un exemple de
programme détournant une interruption.
14Références et exercices
- Références
- Irv Englander, section 9.3
- DetourneInt21h.asm
- http//www.beyondlogic.org/interrupts/interupt.htm
- http//coen.boisestate.edu/ssmith/ee332/overheads/
Interrupts-11.pdf - Exercices
- Quest quune interruption?
- Supposons que les 256 premiers bytes de la
mémoire valent de 00h à FFh. À quelle adresse se
trouvera le code à exécuter lors de lIRQ12? - Donnée la priorité de chaque interruption dans la
Table résumée des INTs . Mettre 0 pour lINT
la plus prioritaire et 255 pour la moins
prioritaire. - Comment fonctionnent les interruptions
matérielles dun 8086 avec 2 PICs?