5 votes

Quelqu'un peut-il m'expliquer comment le CPU trouve la source d'une interruption dans la théorie de l'OS ?

Je suis actuellement en train de suivre un module sur la théorie des systèmes d'exploitation et j'ai quelques concepts que je n'arrive pas à saisir - est-ce que c'est le bon endroit pour poser des questions ?

Ma question principale porte sur les interruptions. Lorsque l'unité centrale détecte qu'il y a eu une interruption, je comprends qu'elle doit trouver l'origine de cette interruption. Ma compréhension est la suivante, quelqu'un pourrait-il me dire si c'est correct, et expliquer quelques lacunes dans mes connaissances ?

Pour que l'unité centrale détecte l'origine de l'interruption, elle pourrait interroger tous les objets pour identifier la source, mais ces questions basées sur les E/S prendraient beaucoup de temps. Au lieu de cela, il utilise le cycle d'interruption et attend un identifiant d'interruption sur le bus de données. S'il s'agit d'un bus de données de 8 bits, il y a 256 niveaux d'interruption (c'est-à-dire 2^8). (Pourquoi cela ?)

Une routine de service d'interruption (ISR) est donc écrite pour chaque niveau d'interruption possible et stockée dans une table à un emplacement fixe (vecteur d'interruption) qui est normalisé par le processeur. Dans mes notes, il est dit "L'emplacement doit être connu avant d'obtenir l'adresse". (Qu'est-ce que cela signifie ?)

L'identificateur de niveau d'interruption reçu dans le cadre du cycle d'interruption est utilisé comme un index dans le vecteur d'interruption. (Quelqu'un pourrait-il nous expliquer un peu plus en détail ?) . D'après ce que j'ai compris, une valeur, l'identifiant du niveau d'interruption, est transmise à l'unité centrale et utilisée pour pointer vers le vecteur d'interruption.

De plus, que signifie le fait de dire qu'une interruption est "servie" ?

Merci beaucoup, et désolé pour les longs paragraphes, je suis juste un peu confus par de nombreux aspects de tout ceci !

4voto

Shaun Killingbeck Points 334

Qu'est-ce que cela signifie quand on dit qu'une interruption est "servie" ?

Lorsque la chose qui demande l'interruption est prise en charge, on dit qu'elle est "servie". Cela peut être aussi simple que de lire le prochain caractère du clavier ou d'envoyer le prochain paquet de données par la carte Ethernet. Certaines interruptions sont plus importantes que d'autres, il est donc possible de leur donner la priorité.

Un article utile peut être trouvé aquí .

L'identificateur de niveau d'interruption reçu dans le cadre du cycle d'interruption est utilisé comme un index dans le vecteur d'interruption.

Comme vous l'avez mentionné, lorsqu'une interruption se produit, l'unité centrale demande essentiellement "qui a fait ça ?" et le dispositif d'interruption place son identifiant d'interruption sur le bus de données. Le CPU prend alors ce numéro et le consulte dans la table des ISR pour transférer l'exécution au gestionnaire.

Une interruption est une demande du processeur de suspendre son programme en cours et de transférer le contrôle à un nouveau programme appelé Interrupt Service Routine (ISR). Des mécanismes matériels spéciaux, conçus pour une vitesse maximale, forcent le transfert. L'ISR détermine la cause de l'interruption, prend les mesures appropriées, puis rend le contrôle au processus original qui a été suspendu.

2voto

LawrenceC Points 70381

Au lieu de cela, il utilise le cycle d'interruption, et attend un identifiant d'interruption sur le bus de données. Si c'est un bus de données de 8 bits, il y a 256 niveaux d'interruption (c'est-à-dire 2^8). (Pourquoi cela ?)

L'alternative à cela est d'avoir une broche sur le CPU pour chaque type ou niveau d'IRQ que vous voulez supporter. C'est ce que faisaient les 68000, qui disposaient de 3 broches d'interruption permettant d'exprimer des IRQ de niveau 0 (NMI) à 7. Les CPU Intel n'ont qu'une seule broche IRQ et attendent une adresse sur le bus (fournie par un dispositif intermédiaire appelé PIC) pour fournir son type (je pense que sur Intel cette "adresse", en réalité un index, va directement dans un registre. Certains PICs peuvent en fait indiquer directement au CPU l'adresse à laquelle aller).

Je crois qu'ils ont une broche NMI séparée (et il y a d'autres interruptions avec leurs propres broches telles que SMI, IPI, et une réinitialisation est un type d'interruption).

Une routine de service d'interruption (ISR) est donc écrite pour chaque niveau d'interruption possible et stockée dans une table à un emplacement fixe (vecteur d'interruption) qui est normalisé par le processeur.

Il n'est pas nécessaire d'écrire 256 ISRs, vous pouvez créer un "stub" qui se contente de "retourner de l'interruption", l'ignorant effectivement.

Dans mes notes, il est écrit "L'emplacement doit être connu avant d'obtenir l'adresse" (Qu'est-ce que cela signifie ?).

C'est un peu ambigu - je ne sais pas si cela signifie que vous devez connaître l'adresse de base de la table vectorielle ou si cela signifie simplement que vous ne pouvez pas connaître l'adresse de l'ISR si vous ne connaissez pas le numéro de l'IRQ concernée.

L'identificateur de niveau d'interruption reçu dans le cadre du cycle d'interruption est utilisé comme un index dans le vecteur d'interruption (quelqu'un peut-il expliquer un peu plus en détail ?).

Le PIC reçoit une IRQ d'un périphérique. Ce périphérique est réglé pour déclencher l'IRQ #3. L'unité centrale, à la réception de l'IRQ du PIC, voit 3 sur le bus, et saute à l'adresse dans sa table de vecteurs d'IRQ locale, index 3.

D'après ce que j'ai compris, une valeur, l'identifiant du niveau d'interruption, est transmise à l'unité centrale et utilisée pour pointer vers le vecteur d'interruption.

Bien.

De plus, que signifie le fait de dire qu'une interruption est "servie" ?

En général, vous ne voulez pas que le CPU soit interrompu pendant qu'il traite une interruption. Les CPU et les combinaisons CPU + PIC font diverses choses pour désactiver les interruptions après la réception d'une IRQ. Vous devez donc "annoncer" quand vous avez fini de la gérer. Sur Intel, vous devez réactiver le bit d'activation d'interruption du système, et dire au PIC que vous avez fini de traiter l'IRQ. Le PIC "retient" d'autres IRQ jusqu'à ce que l'unité centrale lui dise qu'il a terminé.

J'ai laissé de côté certains détails pour simplifier et aussi parce que cela fait longtemps que je n'ai pas étudié ces sujets, mais j'espère que cela vous aidera.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X