Conservatoire national des arts et métiers
Architectures des systèmes informatiques
CHAPITRE 7
Gestion des événements, systèmes d'interruptions
Année 2002-2003

Suite N°1...

7.3. DESCRIPTION SUCCINCTE DE CONTRÔLEURS (ou codeurs) DE PRIORITÉS

7.3.1 Contrôleur de priorité Intel 8214

Ce circuit de la même génération que les microprocesseurs précédents, gérait huit niveaux d'interruptions pour les Intel 8080 et 8085.

Le circuit accepte huit demandes d'interruption, tient compte du niveau en cours, construit l'interruption pour l'unité centrale si le niveau de la demande d'interruption est supérieur au niveau du registre d'état et active le circuit 8212. Les huit niveaux doivent être connectés au 8214 dans l'ordre de priorité défini par l'utilisateur. Les entrées du registre d'état sont commandées par une instruction de type entrée sortie (OUT). L'entretien de ce registre est fait par la routine d'interruption. Le programmeur doit y placer le niveau en cours, ou tout autre niveau selon ses besoins.
Le circuit 8212 code l'instruction RST et la place sur le bus de données quand il est en mode entrée.

Cascade de contrôleurs 8214.

Quand on a besoin de plus de huit interruptions, on met plusieurs 8214 en cascade en utilisant les signaux réservés prévus pour cet usage. Chacun de ces circuits possède une priorité par rapport aux autres, suivant leur ordre dans la cascade. Ceci forme des groupes de priorités.

7.3.2 Contrôleur de priorité programmable Intel 8259

Ce circuit a été conçu pour le microprocesseur 8085. Sa version 8259A a été utilisée dans les PC qui n'avaient que 8 entrées d'interruptions physiques numérotées de 0 à 7. Il gère 8 niveaux ou demandes d'interruption et possède des signaux pour des extensions en cascade. La cascade a été prévue pour augmenter le nombre de sources d'interruption sans modifier le nombre d'entrées sur le processeur. Une sélection de mode de priorité est offerte au programmeur de telle sorte que ce circuit gère les interruptions pour répondre aux besoins du système. Ces modes de priorité peuvent être redéfinis dynamiquement à tout moment. L'organisation en cascade est faite en prenant pour entrée n°2 (IRQ 9) la sortie d'un deuxième 8259 et ainsi de suite jusqu'à 64 au plus.

Table des IRQ pour un bus 16 bit ISA, EISA et MCA

IRQ BUS PRIORITÉ FONCTION REMARQUES
0 non 1 Horloge système Câblé sur la carte mère
1 non 2 Contrôleur clavier Câblé sur la carte mère
2 reroutée - Cascade Remplacée par IRQ9
3 8/16 bits 11 COM2 Peut-être utilisée par COM4 (conflit)
4 8/16 bits 12 COM1 Peut-être utilisée par COM3 (conflit)
5 8/16 bits 13 LPT2 souvent libre
6 8/16 bits 14 Contrôleur Floppy -
7 8/16 bits 15 LPT1 -
8 - 3 horloge temps-réel Câblé sur la carte mère
9 16 bits 4 - -
10 16 bits 5 - -
11 16 bits 6 - -
12 16 bits 7 Port souris PS2 Occupé seulement si port PS2
13 - 8 Coprocesseur Câblé sur la carte mère
14 16 bits 9 Premier contrôleur IDE -
15 16 bits 10 Second contrôleur IDE -

Les mots de commande du contrôleur autorisent les opérations suivantes :

Dans le mode variable, le programmeur peut définir une priorité rotative automatique ou spécifique. Dans le cas automatique, un niveau venant d'être traité possède la priorité la plus basse. Dans ce mode de fonctionnement, un niveau attend, dans le plus mauvais des cas, sept demandes d'interruption au plus. Dans le mode spécifique, le programmeur fixe à chaque fois la priorité la plus basse, de ce fait la priorité la plus forte est immédiatement déduite.

- Signification de la fin du sous programme d'interruption. Cela a pour effet de remettre à zéro un niveau actif spécifique ou de remettre à zéro le niveau actif le plus prioritaire suivant le choix de programmation.

Ces mots de commande peuvent être redéfinis à tout moment pendant l'exécution du programme. Ce circuit, on l'a dit plus haut, est particulièrement destiné à un microprocesseur 8085 non pas à cause de son mode de fonctionnement qui peut être programmé pour tout microprocesseur mais par le fait qu'il émet une instruction particulière du 8085. C'est l'instruction CALL vue précédemment. Il y a donc trois échanges entre le microprocesseur et le contrôleur d'interruption.

Exemple d'instruction CALL pour un pointeur de niveau 4, intervalle de 4 adresses :

  D7 D6 D5 D4 D3 D2 D1 D0  
1er octet 1 1 0 0 1 1 0 0 code CALL
2e octet A7 A6 A5 1 0 0 0 0 poids faible du pointeur
3e octet A15 A14 A13 A12 A11 A10 A9 A8 poids fort du pointeur

Cette instruction provoque la sauvegarde du compteur ordinal dans la pile et le branchement à l'adresse définie par les deux octets suivants.

Table des IRQ pour un bus 16 bits ISA, EISA ou MCA

Schéma général :


Le circuit Pentium II contient son contrôleur d'interruptions prêt à l'emploi sous le nom d'Advanced Programmable Interrupt Controller (APIC).

NOTE DE MISE EN CORRESPONDANCE

Les systèmes d'interruptions sont finalement constitués de trois dispositifs ou mécanismes :
1. le recueil des demandes;
2. la sélection parmi les demandes selon le travail en cours ou selon les demandes présentes;
3. la sauvegarde et la restitution du contexte.

Le point 3 est le seul qui soit spécifique de l'interruption.

Les points 1 et 2 correspondent pratiquement trait pour trait aux dispositifs d'arbitrage de bus.

 
Bus Interruptions
le bus est occupé un processus est en cours d'exécution
apparition de requêtes d'utilisation apparition de demandes d'interruption
arbitrage entre les requêtes choix parmi les demandes

 

Ces mises en correspondance sont 
des clefs de compréhension
en matière d'architectures.

Apprendre des techniques est utile,
savoir reconnaître que des mécanismes présentés sous des noms divers sont au fond les mêmes
est encore mieux.

7.4 COMPLÉMENT RELATIF AUX SYSTÈMES D'INTERRUPTIONS LOGICIELLES

Cet complément est donné à titre d'exemple. Il est construit sur la gamme 80XXX, 8086 et suivants d'Intel, munis du système d'exploitation MS-DOS. Les interruptions logicielles sont propres, d'une part au BIOS en mémoire morte et au système d'exploitation.

Dans MS-DOS, elles sont appelées par INT NN. L'argument NN est le numéro de l'interruption en notation hexadécimale.

Au chargement du système, les 1024 premiers octets de la mémoire centrale sont réservés pour une table à 256 entrées de 4 octets chacune. Ces octets sont remplis, pour les deux premiers d'un déplacement IP (adresse sur 16 bits), pour les deux autres d'une adresse de segment de code CS et pour certaines d'un segment de données. Cette table est dite table des interruptions ou encore table des vecteurs. Les auteurs ont utilisé sensiblement la même technique que pour le début du disque. À la table des partitions correspond la table des vecteurs.

L'exécution de INT NN logicielle provoque la sauvegarde du contenu du compteur ordinal (adresse suivante du processus), et des indicateurs d'état dans la pile du système. Le compteur ordinal est ensuite chargé par l'adresse constituée des 4 octets sous la forme CS:IP (code segment - déplacement). Le retour au processus est provoqué par l'instruction IRET qui termine le programme de gestion de l'interruption. L'exécution de cette instruction restaure les indicateurs d'état et l'adresse de l'instruction suivante du processus par déchargement de la pile.

Ces interruptions ont pour paramètre des contenus particuliers de certains registres. Ceux-ci doivent avoir été chargés au préalable par le processus appelant. Les contenus d'autres registres ou des mêmes sont chargés pour le retour par des valeurs indiquant le résultat du traitement.

Les manuels indiquent pour chaque numéro d'IT valide et documenté les paramètres de chargement, les registres susceptibles d'être modifiés et les codes de retour.

Le déroutement d'interruptions est donc réalisable par programme, en général des programmes résidants qui modifient les fonctionnalités du système. Il suffit pour ces programmes de modifier, à leur chargement, les adresses correspondantes de la table pour faire exécuter des programmes qui leur sont propres en réponse aux demandes d'interruptions. Cette façon de modifier le système est couramment admise encore que génératrice de blocages de fonctionnement quand deux programmes déroutent sans autre précaution la même interruption. On les dit alors incompatibles.

Il existe des outils sur le marché qui analysent la table des interruptions, détectent celles qui ont été modifiées et en fournissent la liste ainsi que le nom du programme en cause.

Exemples d'interruptions dans un système ancien, MS DOS versions 2 et suivantes,

INT 21H, paramètre n° 1 en registre AL : 41H,
fonction : suppression de fichier d'un répertoire,
paramètre auxiliaire DS:DX contient l'adresse de la chaîne de caractères qui contient le numéro d'unité, le chemin et le nom du fichier, chaîne terminée par l'octet 0 qui est le délimiteur de fin.

INT 21H, paramètre n° 1 en registre AL : 36H,
fonction : donner l'espace libre sur le disque,
paramètre auxiliaire DL contient le numéro d'unité (0, 1 etc.),
valeurs de retour : BX contient le nombre de granules libres,
DX contient le nombre total de granules du disque,
AX contient le nombre de secteurs par granule.

Exemples de redirection d'interruptions :

Le résident PRINT, fonction externe du DOS était le seul outil à caractère multitâche. Il déroutait les interruptions 05, 13, 14, 15, 17, 19, 1C, 28, 2F et imprimait des fichiers en tâche de fond. Remarquons de plus que l'interruption 2F ne figurait pas dans la documentation officielle.

ECRANOFF éteignait l'écran au bout de 3 minutes si aucune touche n'a été pressée. Il interceptait les vecteurs 08 et 10.

Les interruptions logicielles, comme certains codes d'opérations, ne figurent pas toutes présentes dans la documentation officielle.

7.5 PRISE EN COMPTE DES INTERRUPTIONS DANS UN PIPELINE

Sans pipeline, les interruptions perturbent le déroulement du processus en cours. La présence d'un pipeline contenant plusieurs instructions à des stades divers d'exécution, rend la situation plus complexe.

Compléments de vocabulaire.

Apparition d'une interruption :
Expression qui regroupe la demande d'interruption, son acceptation et sa prise en compte. On distinguera dans la suite la gestion de l'apparition de l'interruption de la gestion classique de l'interruption qui la suit.

Instruction valide ou invalide :
On considère ici les seules instructions du flot du processus qui sont dans une unité d'exécution ou dans le pipeline à l'apparition d'une l'interruption. Une instruction est valide si son exécution peut être poursuivie, elle est invalide dans le cas contraire. Si l'interruption est appelée par une instruction, les instructions qui la précèdent dans l'ordre du programme sont valides, celles qui suivent sont invalides.

Les différences par rapport aux schémas sans pipeline :

Chaque fabricant gère les apparitions d'interruptions en toute indépendance selon la structure qu'il a choisie pour le pipeline. Cette gestion propre au pipeline est nécessairement câblée et n'interfère pas avec la gestion de l'interruption proprement dite. En principe, la gestion de l'apparition d'une interruption fait les opérations suivantes : Ce fonctionnement de principe a des conséquences : Le branchement retardé doit être pris en compte, il peut l'être comme suit :

Si la première instruction invalide est dans un emplacement de branchement retardé et que celui-ci était pris, l'exécution ne peut pas être reprise avec un seul compteur ordinal. On doit conserver le compteur ordinal de l'instruction en cause et celui du branchement qui ne peut pas être exécuté immédiatement. Pour cela, on sauvegarde les compteurs ordinaux de la ou des instructions invalides et le compteur ordinal de la cible de branchement. On restaure le tout au retour de la gestion de l'interruption.

Une situation nouvelle est celle de plusieurs interruptions dans le désordre.

Un défaut de page de donnée dans une instruction peut exister dans le même temps qu'un défaut de page d'instruction dans une instruction suivante. Selon le pipeline, le défaut de page d'instruction peut se manifester avant le défaut de page de donnée de l'instruction précédente. Pour traiter ce cas, il faut reconnaître, accepter les interruptions et marquer les instructions invalides soigneusement. On opère parfois comme suit :

À l'apparition d'une interruption, on marque non seulement les instructions qui suivent mais celle-ci aussi et on les évacue du pipeline. On gère l'interruption et on reprend l'exécution par l'instruction qui a causé l'interruption. Si une autre interruption apparaît, causée par une instruction valide, c'est-à-dire avant la précédente dans le pipeline, on la traitera en premier.

Quelques autres complications

Les processeurs contiennent désormais plusieurs unités fonctionnelles, une unité entière et une unité flottante par exemple. Dans son principe, ceci n'est pas matière à difficulté. Celle-ci survient quand la durée de transit dans une unité fonctionnelle est plus grande que dans les autres étages. Il faut alors vérifier qu'il n'y a pas des instructions à des stades différents dans les unités fonctionnelles. Sinon il faut attendre la fin, tout en veillant à ce que des conflits structurels ne surviennent pas, de types WAR et WAW, qui seraient dus à des dates de fin d'exécution différentes d'instructions qui étaient pourtant lancées dans le bon ordre.

Plus difficile est le cas où une instruction a été finie d'exécuter et est sortie du flot courant, alors qu'une instruction qui la précédait et n'a pas été traitée aussi rapidement cause une interruption. Les moyens usuels précédents sont inefficaces. Il y plusieurs solutions comme :

Opinion personnelle.

Les interruptions dues aux appels au système pourraient être traitées par l'insertion d'un deuxième processeur spécialisé pour ces opérations. Il disposerait d'un pipeline réduit, trois à cinq étages, d'une UAL simple, sans opérateurs en virgule flottante. Un appel au système provoquerait la sauvegarde du compteur ordinal seul et la mise en sommeil du pipeline principal, jusqu'à achèvement. Cette duplication n'est pas parfaitement originale puisqu'une version très réduite a existé dans les années 1975-1976, un microprocesseur de Mostek avait deux compteurs ordinaux. Le processus normal utilisait le premier, une interruption provoquait sa mise en sommeil et l'activation du second. On y gagnait le câblage et le temps de sauvegarde du compteur ordinal. Le système de fenêtres de registres du F8 de Fairchild avait une ambition de même nature.

 Questionnaire

Conservatoire national des arts et métiers
Architectures des systèmes informatiques
CHAPITRE 7
Gestion des événements, systèmes d'interruptions
Année 2002-2003