Question

Je devrais d’abord partager tout ce que je sais – et c’est le chaos complet.Il y a plusieurs questions différentes sur le sujet, alors ne vous énervez pas :).

1) Pour trouver un ISR, le CPU reçoit un numéro d'interruption.Sur les machines x86 (286/386 et supérieures), il existe un IVT contenant des ISR ;chaque entrée de 4 octets.Nous devons donc multiplier le nombre d'interruptions par 4 pour trouver l'ISR.Donc, le premier groupe de questions est le suivant : je suis complètement confus quant au mécanisme du processeur recevant l'interruption.Pour déclencher une interruption, le périphérique doit d'abord rechercher l'IRQ - et ensuite ?Le numéro d'interruption se déplace "sur IRQ" vers le CPU ?J'ai aussi lu quelque chose comme un appareil mettant l'adresse ISR sur le bus de données ;qu'est-ce que c'est alors ?Quel est le concept des appareils remplaçant l'ISR.Quelqu'un peut-il me donner quelques exemples d'appareils sur lesquels le processeur recherche les interruptions ?Et où trouve-t-il l'ISR pour eux ?

2) Si deux appareils partagent une IRQ (ce qui est tout à fait possible), en quoi le processeur diffère-t-il entre eux ?Que se passe-t-il si les deux appareils déclenchent simultanément une interruption de même priorité.J'ai appris qu'il y aurait un masquage du même type et des interruptions de faible priorité - mais comment se déroule cette communication entre le processeur et le contrôleur de périphérique ?J'ai étudié le rôle du PIC et de l'APIC pour ce problème, mais je n'ai pas compris.

Merci d'avoir lu.Merci beaucoup d'avoir répondu.

Était-ce utile?

La solution

Les processeurs ne recherchent pas les interruptions, du moins pas au sens logiciel.En ce qui concerne les logiciels, les interruptions sont des événements asynchrones.

Ce qui se passe, c'est que le matériel du processeur reconnaît la demande d'interruption, qui est une entrée électrique sur une ligne d'interruption, et en réponse, met de côté l'exécution normale des événements pour répondre à l'interruption.Dans la plupart des processeurs modernes, ce qui se passe ensuite est déterminé par une prise de contact matérielle particulière au type de processeur, mais la plupart d'entre eux reçoivent un certain nombre d'entre eux du dispositif d'interruption.Ce nombre peut être de 8 bits ou 32 ou autre, selon la conception du processeur.La CPU utilise ensuite ce numéro d'interruption pour indexer la table des vecteurs d'interruption afin de trouver une adresse pour commencer l'exécution de la routine de service d'interruption.Une fois cette adresse déterminée (et le contexte d'exécution actuel est enregistré en toute sécurité dans la pile), le processeur commence à exécuter l'ISR.

Lorsque deux appareils partagent une ligne de demande d'interruption, ils peuvent provoquer l'exécution de différents ISR en renvoyant un numéro d'interruption différent au cours de ce processus d'établissement de liaison.Si vous disposez de suffisamment de numéros de vecteurs, chaque dispositif d'interruption peut utiliser son propre vecteur d'interruption.

Mais deux appareils peuvent même partager une ligne de demande d'interruption et un vecteur d'interruption, à condition que l'ISR partagé soit suffisamment intelligent pour revenir à toutes les sources possibles de l'interruption donnée et vérifier les registres d'état pour voir quel appareil a demandé le service.

Un peu plus de détails

Supposons que vous disposiez d'un système composé d'un processeur, d'un contrôleur d'interruption et d'un dispositif d'interruption.Autrefois, il s'agissait de dispositifs physiques distincts, mais aujourd'hui, les trois peuvent même résider dans la même puce, mais tous les signaux sont toujours présents à l'intérieur du boîtier en céramique.Je vais utiliser un processeur powerPC (PPC) avec un contrôleur d'interruption intégré, connecté à un périphérique sur un bus PCI, comme exemple qui devrait bien servir.

Disons que l'appareil est un port série qui transmet des données.Un pilote de port série typique chargera un tas de données dans le FIFO de l'appareil, et le processeur peut effectuer un travail régulier pendant que l'appareil fait son travail.Généralement, ces périphériques peuvent être configurés pour générer une demande d'interruption lorsque le périphérique manque de données à transmettre, afin que le pilote de périphérique puisse revenir et y alimenter davantage.

La logique matérielle du périphérique attendra un accusé de réception d'interruption du bus PCI, auquel cas plusieurs choses peuvent se produire.Certains appareils utilisent le « autovectoring », ce qui signifie qu'ils s'appuient sur le contrôleur d'interruption pour veiller à ce que la routine de service correcte soit sélectionnée.D'autres auront un registre, que le pilote de périphérique préprogrammera, qui contient un vecteur d'interruption que le périphérique placera sur le bus de données en réponse à l'accusé de réception de l'interruption, pour que le contrôleur d'interruption le récupère.

Un bus PCI n'a que quatre lignes de demande d'interruption, notre périphérique série devra donc en affirmer une.(Peu importe lequel pour le moment, cela dépend généralement quelque peu de l'emplacement.) Le prochain en ligne est le contrôleur d'interruption (par ex.PIC/APIC), qui décidera s'il faut accuser réception de l'interruption en fonction des bits de masque définis dans ses propres registres.En supposant qu'il accuse réception de l'interruption, soit il obtient alors le vecteur du dispositif d'interruption (via les lignes de bus de données), soit il peut, s'il est ainsi programmé, utiliser une valeur « prédéfinie » fournie par le propre pilote de périphérique de l'APIC.Jusqu'à présent, le processeur ignorait parfaitement tout cela, mais cela est sur le point de changer.

Il est maintenant temps pour le contrôleur d'interruption d'attirer l'attention du cœur du processeur.Le CPU aura son propre(s) bit(s) de masque d'interruption qui peuvent l'amener à ignorer simplement la demande du PIC.En supposant que le processeur soit prêt à accepter des interruptions, il est maintenant temps de passer à l'action réelle.L'instruction actuelle doit généralement être retirée avant que l'ISR puisse commencer, donc avec les processeurs pipeline, c'est un peu compliqué, mais il suffit de dire qu'à un moment donné du flux d'instructions, le contexte du processeur est enregistré dans la pile et dans le matériel. -l'ISR déterminé prend le relais.

Certains cœurs de processeur ont plusieurs lignes de requête et peuvent démarrer le processus de réduction des exécutions ISR via une logique matérielle qui fait passer le pointeur d'instruction du processeur à l'un des rares gestionnaires de niveau supérieur.L'ancien 68K, et peut-être d'autres, l'ont fait de cette façon.Le powerPC (et je crois, le x86) ont une seule entrée de demande d'interruption.Le x86 lui-même se comporte un peu comme un PIC et peut obtenir un vecteur à partir du ou des PIC externes, mais le powerPC passe simplement à une adresse fixe, 0x00000500.

Dans le PPC, le code à 0x0500 va probablement immédiatement sauter à un endroit de la mémoire où il y a suffisamment de place pour un code de prise de décision sérieux, mais il s'agit toujours de la routine de service d'interruption.Cette routine ira d'abord au PIC et obtiendra le vecteur, et demandera également au PIC d'arrêter d'affirmer la demande d'interruption dans le cœur du processeur.Une fois le vecteur connu, l'ISR de niveau supérieur peut s'adresser à un gestionnaire plus spécifique qui prendra en charge tous les appareils connus pour utiliser ce vecteur.Le gestionnaire spécifique au vecteur parcourt ensuite la liste des périphériques attribués à ce vecteur, vérifiant les bits d'état d'interruption de ces périphériques, pour voir lesquels ont besoin d'être réparés.

Lorsqu'un périphérique, comme le port série hypothétique, manque de service, l'ISR de ce périphérique prend les mesures appropriées, par exemple en chargeant la valeur de la prochaine FIFO de données depuis un tampon du système d'exploitation dans la FIFO de transmission du port.Certains appareils abandonnent automatiquement leur demande d'interruption en réponse à un accès. Par exemple, l'écriture d'un octet dans la FIFO de transmission peut amener le périphérique du port série à annuler l'affirmation de la ligne de demande.D'autres appareils nécessiteront qu'un bit de registre de contrôle spécial soit basculé, défini, effacé, etc., afin d'abandonner la demande.Il existe des millions de périphériques d'E/S différents et aucun d'entre eux ne semble jamais le faire de la même manière, il est donc difficile de généraliser, mais c'est généralement ainsi.

Maintenant, il y a évidemment plus à dire : qu'en est-il des priorités d'interruption ?que se passe-t-il dans un processeur multicœur ?Qu’en est-il des contrôleurs d’interruption imbriqués ?Mais j'ai brûlé suffisamment d'espace sur le serveur.J'espère que tout cela aidera.

Autres conseils

Je suis venu cette question comme après 3 ans .. Espoir je peux aider;)

Le processeur Intel 8259A ou simplement le "PIC" a 8 broches, IRQ0-IRQ7, chaque broche se connecte à un seul appareil ..

Lets Soit u appuyé sur un bouton sur le clavier .. la tension de la broche de IRQ1, qui est connecté au KBD, est élevé .. donc après que la CPU est interrompu, reconnaître l'interruption bla bla bla ... le PIC ne suffit d'ajouter 8 au nombre de la ligne IRQ donc des moyens de IRQ1 1 + 8 ce qui signifie 9

la CPU définit sa CS et IP sur l'entrée 9 dans le tableau vectoriel .. et parce que le IVT est un tableau de positions longues, il suffit de multiplier le nombre de cellules par 4;)

= CPU.CS IVT [9] .CS CPU.IP = IVT [9] .IP

les offres ESR avec le dispositif par l'intermédiaire des ports d'E / S;) Désolé pour mon mauvais anglais .. suis un Arabe bien:)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top