2010-04-10 18 views
8

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 s'il vous plaît ne soyez pas irrités :).Comment CPU trouve ISR et distingue entre les périphériques

1) Pour trouver un ISR, la CPU est fournie avec un numéro d'interruption. Dans les machines x86 (286/386 et plus), il existe une IVT avec des ISR; chaque entrée de 4 octets en taille. Nous devons donc multiplier le nombre d'interruptions par 4 pour trouver les ISR. Donc le premier tas de questions est - je suis complètement confus dans le mécanisme de l'unité centrale de traitement recevant l'interruption. Pour déclencher une interruption, l'appareil doit d'abord rechercher l'IRQ, puis quoi? Le numéro d'interruption se déplace "sur IRQ" vers le processeur? J'ai aussi lu quelque chose comme un périphérique mettant l'adresse ISR sur le bus de données; Quoi alors? Quel est le concept de périphériques remplaçant les ISR. Quelqu'un peut-il me dire quelques exemples de périphériques où le processeur interroge les interruptions? Et où trouve-t-il ISR pour eux?

2) Si deux périphériques partagent une IRQ (ce qui est très possible), comment le CPU diffère-t-il entre eux? Que faire si les deux appareils déclenchent une interruption de même priorité simultanément. Je dois savoir qu'il y aura un masquage du même type et des interruptions de faible priorité - mais comment cette communication se produit entre le CPU et le contrôleur de périphérique? J'ai étudié le rôle de PIC et APIC pour ce problème, mais je ne pouvais pas comprendre.

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

Répondre

12

Les processeurs n'interrogent pas les interruptions, du moins pas dans un 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 de la CPU reconnaît la demande d'interruption, qui est une entrée électrique sur une ligne d'interruption, et, en réponse, annule 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 poignée de main matérielle particulière au type d'unité centrale, mais la plupart d'entre eux reçoivent un certain numéro de l'appareil d'interruption. Ce nombre peut être 8 bits ou 32 ou autre, selon la conception de la CPU. La CPU utilise ensuite ce numéro d'interruption pour indexer dans la table de 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 sauvegardé en toute sécurité dans la pile), la CPU commence à exécuter l'ISR.

Lorsque deux périphériques 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 pendant ce processus d'établissement de liaison. Si vous avez suffisamment de nombres de vecteurs disponibles, chaque dispositif d'interruption peut utiliser son propre vecteur d'interruption. Mais deux périphériques peuvent même partager une ligne de demande d'interruption et un vecteur d'interruption, à condition que l'ISR partagé soit assez intelligent pour retourner à toutes les sources possibles de l'interruption donnée, et vérifier les registres d'état pour voir quel périphérique a demandé le service .

Un peu plus en détail

Supposons que vous ayez un système composé d'une unité centrale de traitement et contrôleur d'interruption, et un dispositif d'interruption. Dans l'ancien temps, il s'agissait de dispositifs physiques séparés, mais maintenant tous les trois peuvent même résider dans la même puce, mais tous les signaux sont toujours là à l'intérieur du boîtier en céramique. Je vais utiliser un CPU powerPC (PPC) avec un contrôleur d'interruption intégré, connecté à un périphérique sur un bus PCI, comme exemple qui devrait bien fonctionner.

Supposons que le périphérique soit un port série qui transmet des données. Un pilote de port série typique chargera un paquet de données dans le FIFO du périphérique, et le processeur peut effectuer un travail régulier pendant que le périphérique 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 est à court de données à transmettre, de sorte que le pilote de périphérique peut revenir et alimenter davantage.

La logique matérielle dans le périphérique s'attend à un accusé de réception d'interruption de bus PCI, à quel point, deux choses peuvent se produire. Certains périphériques utilisent 'autovectoring', ce qui signifie qu'ils s'appuient sur le contrôleur d'interruption pour s'assurer que la routine de service correcte est sélectionnée. D'autres auront un registre, que le pilote de périphérique va préprogrammer, 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 d'interruption, pour que le contrôleur d'interruption prenne le relais. Un bus PCI ne dispose que de quatre lignes de requête d'interruption. Notre périphérique série devra donc en faire une. (Peu importe ce qui est actuellement, il dépend généralement de l'emplacement.) Ensuite, le contrôleur d'interruption (par exemple PIC/APIC), qui décidera s'il faut acquitter l'interruption en fonction des bits de masque qui ont été réglés ses propres registres. En supposant qu'il acquitte l'interruption, il obtient alors le vecteur du dispositif d'interruption (via les lignes de bus de données), ou peut, si tel est le cas, utiliser une valeur «conservée» fournie par le propre pilote de l'APIC. Jusqu'à présent, le CPU a été parfaitement inconscient de toutes ces choses, mais c'est sur le point de changer.

Maintenant, il est temps pour le contrôleur d'interruption d'attirer l'attention du cœur du processeur. Le CPU aura son propre bit (s) de masque d'interruption qui pourrait l'amener à ignorer la requête du PIC. En supposant que le processeur est prêt à prendre des interruptions, il est maintenant temps que l'action réelle démarre. L'instruction courante doit généralement être retirée avant que les ISR puissent commencer, donc avec les processeurs pipelinés c'est un peu compliqué, mais il suffit de dire qu'à un moment donné dans le flux d'instructions, le contexte du processeur est sauvegardé dans la pile et le matériel ISR -determiné prend le relais. Certains cœurs de processeur ont plusieurs lignes de requête et peuvent commencer à réduire le routage ISR via une logique matérielle qui fait passer le pointeur d'instruction de l'UC à l'un des rares gestionnaires de niveau supérieur. Le vieux 68K, et peut-être d'autres l'ont fait de cette façon. Le powerPC (et je crois, le x86) a une seule entrée de requête d'interruption. Le x86 lui-même se comporte un peu comme un PIC, et peut obtenir un vecteur du (des) PIC externe (s), mais le powerPC saute juste à une adresse fixe, 0x00000500.

Dans le code PPC, le code à 0x0500 va probablement sauter immédiatement à quelque part dans la mémoire où il y a assez de place pour un code décisionnel sérieux, mais c'est toujours la routine de service d'interruption. Cette routine ira d'abord au PIC et obtiendra le vecteur, et demandera également au PIC de cesser d'affirmer la requête d'interruption dans le coeur du CPU. Une fois que le vecteur est connu, l'ISR de niveau supérieur peut faire référence à un gestionnaire plus spécifique qui s'occupera de tous les dispositifs connus pour utiliser ce vecteur. Le gestionnaire spécifique au vecteur parcourt ensuite la liste des périphériques affectés à ce vecteur, en vérifiant les bits d'état d'interruption dans ces périphériques, pour voir lesquels ont besoin de service. Lorsqu'un périphérique, tel que le port série hypothétique, est détecté comme défaillant, l'ISR de ce périphérique prend les mesures appropriées, par exemple, charger les données FIFO suivantes dans un tampon du système d'exploitation dans la FIFO de transmission du port. Certains périphériques abandonnent automatiquement leur demande d'interruption en réponse à l'accès, par exemple, l'écriture d'un octet dans la FIFO de transmission peut entraîner la désactivation de la ligne de demande par le périphérique du port série. D'autres appareils nécessiteront un bit de registre de contrôle spécial pour basculer, définir, effacer, what-have-you, afin de supprimer la demande. Il y a 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 le cas. Maintenant, évidemment, il y a plus à dire - qu'en est-il des priorités d'interruption? ce qui se passe dans un processeur multi-core? Qu'en est-il des contrôleurs d'interruption imbriqués? Mais j'ai assez d'espace sur le serveur. J'espère que cela aide.

+0

Merci Jeff. Bien que ma question soit toujours là. Je comprends qu'il y a un numéro d'interruption utilisé pour trouver ISR. Puis ma question suivante était de savoir comment le CPU est alors fourni avec ce numéro? Cela arrive-t-il par bus de données ou comment? Où les APIC se situent-ils dans l'image pour les appareils partageant des IRQ? Votre message a été très utile pour me rappeler l'utilisation des registres d'état des appareils. Merci beaucoup. –

+0

Belle explication Jeff. Merci encore pour les efforts. J'ai eu des pensées similaires, comme s'il pouvait y avoir une structure arborescente pour gérer les interruptions. Mais maintenant je sais que d'autres pensent également de la même manière et vous avez fait un bon commentaire à ce sujet. Merci encore. –

+0

Une petite question. _Interrupt vector_ est juste un nombre qui est une entrée de la table de vecteur d'interruption pour obtenir l'adresse de ISR. Alors, comment est-ce un ** Vector **? ** Le numéro d'interruption ** est correct. – Shashwat

4

je suis tombé sur 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. Supposons que vous ayez appuyé sur un bouton du clavier .. la tension de la broche IRQ1, qui est connectée au KBD, est haute .. donc après l'interruption de la CPU, reconnaissez le bla bla bla bla .. le PIC ajoute simplement 8 au nombre de la ligne IRQ donc IRQ1 signifie 1 + 8 ce qui signifie 9

SO la CPU place ses CS et IP sur la 9ème entrée dans le vecteur table .. et parce que l'IVT est un tableau de longs, il suffit de multiplier le nombre de cellules par 4;)

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

l'ESR traite de l'appareil via les ports d'E/S;) Désolé pour mon mauvais anglais .. suis un arabe si :)