Etienne Tremblay
Ordinateurs, Structure et Applications
GIF-1001
Université Laval, Hiver 2012
Cours 10, Les interruptions
Les interruptions du 8086
• Une interruption interrompt l’exécution séquentielle des instructions par le CPU. Lors d’une interruption, l’exécution du programme principal est
suspendue. Une sous-routine traitant l’interruption 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 plusieurs catégories d’interruptions: les exceptions, les interruptions matérielles et les interruptions logicielles. Les interruptions matérielles
surviennent lorsque les lignes RST, NMI ou INTR du 8086 sont activées.
Les interruptions logicielles surviennent lorsque l’instruction INT apparaît et les exceptions se produisent quand le microprocesseur ne peut exécuter une instruction (exemples: instruction invalide, 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, d’autres 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. À l’intérieur d’une de ces catégories, l’INT 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
Interruptions vectorisées
• La table des vecteurs d’interruption contient l’adresse de la sous-routine à exécuter lorsqu’un interruption survient. Pour chaque interruption, la table contient 4 bytes d’information: CS et IP. Chaque entrée de la table est un “vecteur” qui mène aux instruction à exécuter pour traiter l’interruption. La taille de la table des vecteurs d’interruption est donc 256ints * 4bytes = 1Ko.
• La table des vecteurs d’interruption commence à l’adresse 00000h et elle finit à l’adresse 003FFh. Ne pas mettre de segments à cet endroit!!!
# d'Int 4 040506
07
Mémoire
CS et IP pour Int 0 CS et IP pour Int 1 CS et IP pour Int 2 CS et IP pour Int 3 CS et IP pour Int 4
00000h 07564h (0706:0504)
00004h
Code exécuté lorsque l'INT1
survient
• Lorsqu’une interruption survient, le numéro de l’interruption permet de trouver l’emplacement des instructions à exécuter. Le numéro de l’interruption est multiplié par 4 afin de trouver l’adresse du CS et du IP à rechercher (IP est à l’adresse inférieure, suivi de CS). Puis un JMP à CS:IP est fait. CS:IP est un « vecteur » vers le code à exécuter afin de répondre à l’interruption.
- Exemple: Si le contenu de la mémoire, à partir de l’adresse 00000h est 00h, 01h, 02h, 03h, 04h, 05h, 06h, 07h, 08h, etc... et que l’interruption 1 survient, alors la routine à l’adresse 0706:0504 sera
exécutée.
• Reset est la seule interruption sans numéro.
Pour reset, CS:IP = FFFF0H. Ce sont les valeurs de CS et IP au démarrage de l’ordinateur
Séquence d’évènements après une interruption
• Lors d’une interruption logicielle ou matérielle, les évènements suivants se produisent:
– Le 8086 termine l’instruction en cours.
– Le drapeau IF est testé si l’interruption provient de la ligne d’interruption
matérielle (INTR). Si le drapeau est à 0, l’interruption est masquée (ignorée, mais toujours active).
– Si une autre interruption de priorité supérieure ou égale est en cours, l’interruption est mise de côté pour être exécutée ultérieurement.
– Trois registres sont mis sur la pile (PUSH) dans l’ordre 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é à l’adresse CS:IP trouvée dans la table des vecteurs d’interruption à partir du numéro de l’interruption.
– La routine de service de l’interruption (ISR ou Interrupt Service Routine) désignée par la table des vecteurs d’interruption est exécutée.
– Théoriquement, la dernière instruction de l’ISR est IRET (Interrupt RETurn). Un IRET est équivalent à trois POP dans cet ordre: IP, CS et drapeaux.
Exceptions
• Les exceptions surviennent quand un évènement logiciel spécial arrive. Lors de la plupart des exceptions le microprocesseur ne peut pas exécuter
l’instruction en cours pour diverses raisons: instruction invalide, division par 0, référence à une adresse invalide, accès invalide à une adresse protégée (pas avec le 8086), faute matérielle, etc. Voici quelques exceptions du 8086:
– L’interruption 0 survient lorsque le diviseur de DIV ou IDIV est 0.
– L’interruption 4 survient lorsque le drapeau Overflow est 1 et que l’instruction INTO est exécutée.
– Les interruptions 1 et 3 servent pour du debug de programme.
• Les exceptions désactivent les interruptions matérielles et elles sont plus prioritaires que les interruptions logicielles.
Interruptions matérielles (1)
Interruptions matérielles (2)
• Le 8086 a trois broches pour les interruptions matérielles: RESET, NMI et INTR.
• La broche RESET crée un reset du CPU si elle est HIGH pendant au moins quatre cycles d’horloge.
• La broche NMI (Non Maskable Interrupt) déclenche l’interruption 2
lorsqu’elle passe de LOW à HIGH. L’interruption NMI n’est pas désactivé lorsque IF est 0, contrairement aux interruptions sur INTR, d’où son nom.
Une utilisation typique de NMI est la détection de mise hors tension.
• La broche 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 n’utilise qu’une ligne pour la plupart des
interruptions matérielles (INTR), un PIC (Programmable Interrupt Controler) servait initialement a multiplexer 8 interruptions pour n’en former qu’une seule. Comme 8 interruptions s’est révélé rapidement insuffisant, un autre PIC a été ajouté. Afin de respecter le design déjà en place, l’interruption matérielle 2 a été re-dirigée (voir plus loin). Le 8086 supporte donc 16 interruptions matérielles (nommées IRQ0 à IRQ15).
– De nos jours, les PICs sont inclus dans le chipset.
– À chaque interruption matérielle correspond un numéro d’interruption qui n’est pas égal au numéro d’interruption matériel. Par exemple, IRQ0 est l’INT 08. La page suivante donne une correspondance typique entre les IRQ et les
périphériques du PC.
Interruptions matérielles (3)
INT (Hex) IRQ Function
77 IRQ15 Reserved
76 IRQ14 Hard Disk Drive
75 IRQ13 Maths Co-Processor
74 IRQ12 PS/2 Mouse
73 IRQ11 Reserved
72 IRQ10 Reserved
71 IRQ9 Redirected IRQ2 70 IRQ8 Real Time Clock 0F IRQ7 Parallel Port
0E IRQ6 Floppy Disk Controller 0D IRQ5 Reserved/Sound Card 0C IRQ4 Serial Port
0B IRQ3 Serial Port
0A IRQ2 PIC2
Interruptions matérielles (4)
• La séquence d’évènements suivante se produit lorsqu’un périphérique produit une interruption:
– Le PIC reçoit et traite l’interruption
• Un registre interne du PIC permet au programmeur du 8086 de masquer (désactiver) certaines interruptions
• Le PIC met l’interruption dans un buffer
• Le PIC regarde les priorités des interruptions et détermine si l’interruption matérielle courante est la plus prioritaire
– La ligne INTR est activée par le PIC pour dire au 8086 qu’il y a interruption
– Un pulse de 0Vdc provenant du 8086 apparaît sur la ligne INTA pour signaler au PIC que l’interruption 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 l’interruption sur le bus de donnée.
– Le PIC met le numéro de l’INT sur le bus de donnée: il ne met pas le numéro de l’IRQ.
– Le 8086 exécute la routine de service de l’interruption
– Une instruction à la fin de la routine envoie un EOI (End Of Interrupt) au PIC pour lui signaler que l’interruption est traitée.
Interruptions matérielles (5)
• L’insertion d’un deuxième PIC sur la ligne IRQ2 du premier PIC a plusieurs conséquences découlant surtout d’un désir de conserver la compatibilité avec les designs n’ayant qu’un seul PIC:
– Les périphériques connectées sur IRQ2 ont été connectés sur IRQ9 (re- direction). Comme le vecteur d’interruption de IRQ9 n’est pas le même que celui de IRQ2, il faut que IRQ9 appelle le vecteur d’interruption de IRQ2 pour les designs avec un seul PIC.
– Désactiver l’IRQ2 à l’intérieur du PIC principal désactive les IRQ8 à IRQ15.
– Les interruptions matérielles 8 à 15 sont plus prioritaires que les interruptions matérielles 3 à 7.
– Les routines de service d’interruptions matérielles IRQ8 à IRQ15 doivent gérer deux PICs, c’est-à-dire envoyer deux End Of Interrupt.
Interruptions logicielles
• Une interruption logicielle s’appelle avec l’instruction INT # où # est le numéro de l’interruption.
• 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 l’interruption 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 / AH=09h - Sortie d'une chaîne de caractères depuis DS:DX.
INT 21h / AH=0Ah - Entrée d'une chaîne de caractères vers DS:DX, le premier octet indique la taille du buffer, le deuxième octet indique le nombre de
caractères réellement lus.
INT 21h / AH=4Ch - Quitte le système d'exploitation.
INT 21h / AH=01h - lit un caractère sur l'entrée standard, avec écho, le résultat est stocké dans AL.
INT 21h / AH=02h - écrit un caractère vers la sortie standard, DL = le caractère à écrire, après exécution, AL = DL.
Interruptions logicielles et système d’exploitation
• Les systèmes d’exploitations gèrent habituellement les périphériques. Les
programmes de l’usager accèdent aux périphériques par la biais de fonctions du système d’exploitation.
• Les ordinateurs ont souvent du matériel différent et les fonctions permettant d’accéder à ce matériel changent en fonction du matériel. Le programmeur ne veut pas se
soucier de toutes les configurations de matériel possibles lorsqu’il accède à un périphérique.
• La table des vecteurs d’interruption permet de changer facilement l’adresse de la routine traitant l’interruption d’un périphérique. Avec le 8086, cette table est
habituellement gérée par le système d’exploitation.
• Le programmeur ne veut pas apprendre les adresses des fonctions du système d’exploitation, ni changer son programme si le système d’exploitation change.
• Les interruptions logicielles sont généralement utilisées pour appeler des fonctions du système d’exploitation, principalement afin d’accéder aux périphériques.
– Le BIOS fournit un ensemble de fonctions d’accès aux périphériques
– Le système fournit un ensemble de fonctions d’accès aux périphériques. Il change la table des vecteurs d’interruption en fonction du matériel de l’ordinateur.
– Périphérique = clavier, écran, horloge…
– Les interruptions sont habituellement exécutées en mode superviseur: il s’agit d’un mode privilégié (celui du système d’exploitation) ayant tout le contrôle du système.
– Le terme SVC (SuperVisor Call instruction) est habituellement employé pour désigner une interruption logicielle appelant une fonction du système d’exploitation.
Table résumée des INTs
INT (Hex) IRQ Common Uses
00 - 01 Exception Handlers -
2 Non-Maskable IRQ Non-Maskable IRQ (Parity Errors)
03 - 07 Exception Handlers -
8 Hardware IRQ0 System Timer
9 Hardware IRQ1 Keyboard
0A Hardware IRQ2 Redirected
0B Hardware IRQ3 Serial Comms. COM2/COM4
0C Hardware IRQ4 Serial Comms. COM1/COM3
0D Hardware IRQ5 Reserved/Sound Card
0E Hardware IRQ6 Floppy Disk Controller
0F Hardware IRQ7 Parallel Comms.
10 - 6F Software Interrupts -
70 Hardware IRQ8 Real Time Clock
71 Hardware IRQ9 Redirected IRQ2
72 Hardware IRQ10 Reserved
73 Hardware IRQ11 Reserved
74 Hardware IRQ12 PS/2 Mouse
75 Hardware IRQ13 Math's Co-Processor
76 Hardware IRQ14 Hard Disk Drive
77 Hardware IRQ15 Reserved
78 - FF Software Interrupts -
Détournement des Interruptions
• Lors du démarrage du PC, la table des vecteurs d’interruption, en RAM
parce qu’il faut pouvoir la changer, est chargée avec des valeurs par défaut.
• Pour détourner une interruption, il suffit de changer la table des vecteurs d’interruptions. Changer le CS et l’IP à l’adresse 4*(# de l’INT à détourner) permet de changer le code exécuté lorsque l’interruption se produira.
• En temps normal, la nouvelle ISR appellera l’ancienne ISR sous certaines conditions. Pour cette raison, sauvegarder le CS et l’IP de l’instruction que l’on remplace est une pratique recommandée (habituellement la sauvegarde se fait dans des variables déclarées à cet effet).
• Le fichier DetourneInt21h.asm est un exemple de programme détournant une interruption.
Ré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
– Qu’est qu’une 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 l’IRQ2?
– Donnée la priorité de chaque interruption dans la « Table résumée des INTs ». Mettre 0 pour l’INT la plus prioritaire et 255 pour la moins
prioritaire.
– Comment fonctionnent les interruptions matérielles d’un 8086 avec 2 PICs?