2009-04-03 11 views
7

Je veux savoir quels processus traite les interruptions de périphériques. Que se passe-t-il en cas d'interruption lorsqu'un thread en mode utilisateur est en cours d'exécution? Est-ce que les autres threads utilisateur ont également une chance de s'exécuter lorsque le système traite une interruption? Veuillez me suggérer quelques documents de référence décrivant comment les interruptions sont traitées par Windows.Traitement des interruptions dans Windows

Répondre

3

Les interruptions de périphérique elles-mêmes sont (généralement) traitées par n'importe quel thread ayant la CPU qui a pris l'interruption, mais dans un anneau 0 et à un niveau de protection différent. Cela limite certaines des actions qu'un gestionnaire d'interruption peut effectuer, car la plupart du temps, le thread en cours ne sera pas lié au thread qui attend que l'événement se produise et que l'interruption indique.

Le noyau lui-même est une source fermée, et uniquement documenté via son API interne. Cette API est exposée aux auteurs de pilotes de périphériques et décrite dans les kits de développement de pilote.

Quelques ressources pour vous aider à démarrer:

  • Toute édition d'Microsoft Windows Internals par Salomon et Russinovich. Le courant semble être la 4ème édition, mais même une ancienne édition aidera.

  • Le DDK de Windows, désormais renommé WDK. Sa documentation est également available online. Soyez sûr de lire le Kernel Mode Design Guide ...

  • Sysinternals a des outils et des articles pour sonder et expliquer le comportement du noyau. C'était un site indépendant jusqu'à ce que Microsoft se lasse de Mark Russinovich qui semblait en savoir plus sur le fonctionnement du noyau qu'eux. ;-)

Notez que le code source de nombreux pilotes de périphériques communs est inclus dans le DDK dans les exemples. Bien que les versions de production soient presque certainement différentes, la lecture des pilotes d'échantillons peut répondre à certaines questions même si vous ne voulez pas implémenter vous-même un pilote.

1

Comme tout autre système d'exploitation, Windows traite les interruptions en mode noyau, avec un niveau de priorité d'interruption élevé (je pense qu'ils les appellent IRPL, mais je ne sais pas ce que le «R» signifie). Tout thread utilisateur ou thread noyau de niveau inférieur s'exécutant sur la même machine sera interrompu pendant le traitement de la demande d'interruption et sera repris lorsque le traitement ineterrupt sera terminé.

+0

En fait, c'est IRQL (Interrupt ReQuest Level). Il y en a 32. Le code du mode utilisateur fonctionne au niveau PASSIF (0). Les périphériques IRQL/DIRQL sont plus élevés que le niveau DISPATCH (2). – dragonfly

+0

Vous vous souvenez probablement que la représentation interne d'un appel système qui est livré à un pilote de périphérique s'appelle un IRP (paquet de demande d'E/S) ... – RBerteig

+0

Je ne devrais pas répondre à des questions si tard dans la nuit.Je me souvenais du système d'exploitation VMS, où ils sont appelés IPL - Interrupt Priority Levels. Revenir à mon enfance technique. –

0

Pour en savoir plus sur les interruptions de l'appareil sous Windows, vous devez étudier le développement du pilote de périphérique. C'est un sujet de niche, je ne pense pas que vous pouvez trouver beaucoup de ressources utiles sur le Web et vous devrez peut-être chercher un livre ou un cours de formation.

Quoi qu'il en soit, Windows gère les interruptions avec les niveaux de requête d'interruption (IRQL) et Deferred procedure calls. Une interruption est gérée en mode noyau, qui est prioritaire par rapport au mode utilisateur. Un gestionnaire d'interruptions approprié doit réagir très rapidement. Il effectue uniquement les opérations absolument nécessaires et enregistre un appel de procédure différée pour l'exécuter ultérieurement. Cela se produit lorsque le système est dans un niveau de demande d'interruption.

+0

hi @ kgiannakakis, J'ai un problème de pilote Windows et je pense que vous êtes celui qui peut m'aider. Je m'explique en bref. Je travaille sur le pilote de port série.Interrupt est créé pour l'enfant dans le pilote de bus. & Je dois l'utiliser dans le pilote de port.Maintenant obtenir H/W interrompre & lire le registre mais le pilote de bus ne reçoit pas d'accusé de réception servi.J'ai cherché sur le web, mais je n'ai pas trouvé de réponse correcte. s'il vous plaît aidez-moi à résoudre ce problème si vous le pouvez. & Désolé de poster ma requête ici. [posted-stackoverflow] (http://stackoverflow.com/questions/26713360/serial-port-driver-got-stuck-in-serialisr-routine) – Akatsuki

Questions connexes