<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"><head><title>Partage et conflit d'interruption</title><link href="style.css" rel="stylesheet" type="text/css" /><meta content="DocBook XSL Stylesheets V1.73.2" name="generator" /><link rel="start" href="index.html" title="Guide pratique du Plug-and-Play" /><link rel="up" href="index.html" title="Guide pratique du Plug-and-Play" /><link rel="prev" href="ar01s11.html" title="Messages d'erreurs" /><link rel="next" href="ar01s13.html" title="Annexe" /></head><body><div class="navheader"><table summary="Navigation header" width="100%"><tr><th align="center" colspan="3">Partage et conflit d'interruption</th></tr><tr><td align="left" width="20%"><a accesskey="p" href="ar01s11.html">Précédent</a> </td><th align="center" width="60%"> </th><td align="right" width="20%"> <a accesskey="n" href="ar01s13.html">Suivant</a></td></tr></table><hr /></div><div class="sect1" lang="fr"><div class="titlepage"><div><div><h2 class="title"><a id="N11289" />Partage et conflit d'interruption</h2></div></div></div><div class="sect2" lang="fr"><div class="titlepage"><div><div><h3 class="title"><a id="N1128C" />Introduction</h3></div></div></div><p>Quand deux périphériques ou plus utilisent la même ligne d'interruption, (et le même numéro d'IRQ), il s'agit soit d'un « <span class="quote">partage d'interruption</span> » soit d'un « <span class="quote">conflit d'interruption</span> ». Le bus PCI autorise tous les périphériques PCI à partager des interruptions avec les autres, ce qui est appelé le partage. Mais si un périphérique ISA (ou un périphérique LPC ??) utilise la même interruption (IRQ) qu'un autre périphérique (PCI, ISA ou LPC ??), il y habituellement un conflit d'interruption.</p><p>Il existe des exceptions. Certains périphériques PCI très anciens (pré-1995) ne permettent pas le partage d'interruption. À contrario, quelques périphériques ISA ont été conçus pour partager les interruptions (entre deux périphériques ISA ?) mais ces deux périphériques ISA doivent être conçus de cette façon et être pilotés par du logiciel au courant du partage des interruptions. La carte-mère doit aussi le supporter. La discussion suivante se rapporte aux PC qui ont un bus ISA.</p><p>Un conflit signifie que, quand une interruption survient, aucun pilote de périphérique (ou le mauvais) ne sera appelé. Cela peut aboutir à de mauvaises actions comme des dépassements de tampon (perte de données). Un périphérique peut presque immobiliser sa ligne d'interruption quand il n'envoie pas son interruption, et de ce fait empêcher tout autre dispositif d'employer cette ligne d'interruption. Cela ne pose pas de problème seulement si seul ce périphérique utilise cette interruption mais si un deuxième périphérique essaie d'utiliser la même ligne d'interruption, il ne pourra plus le faire. Si ce second périphérique immobilise aussi la ligne lorsqu'il n'envoyait pas d'interruption, alors aucun des deux périphériques ne peut utiliser l'interruption. Linux et les deux périphériques sont inconscients de ce conflit et continuent à envoyer les interruptions qui vont nul part et sont donc perdus.</p><p>Les conflits d'interruptions étaient communs quand les IRQ étaient configurées grâce à des cavaliers sur les cartes (bus ISA), souvent parce que le noyau ne connaissait pas la configuration de ces cavaliers. Le Plug-and-Play ISA (aucun cavalier) a beaucoup aidé car le logiciel pouvait modifier les IRQ. L'abandon d'ISA en faveur du PCI a pratiquement éliminé les conflits IRQ. Malgré tout, votre PC peut toujours avoir des périphériques sur la carte-mère (pas sur une carte fille) sur un bus ISA, LPC ou X. Mais le BIOS et le noyau devraient savoir comment les configurer et donc éviter de les utiliser pour les périphériques PCI, évitant ainsi les conflits d'interruption. Mais il existe toujours un problème avec PCI car il peut manquer d'interruptions disponibles, tout spécialement sur les anciens PC qui ont seulement 16 interruptions.</p><p>Mais, bien qu'ayant éliminé le problème des conflits, le partage d'IRQ sur le bus PCI a introduit un nouveau problème qui est moins sérieux, le problème d'équilibre des IRQ. Si des périphériques utilisant beaucoup les interruptions partagent la même IRQ, cela pourrait amener des délais dans la récupération des IRQ et pourrait même amener à des dépassements de tampon et d'autres erreurs. Ceci n'est pas dû à la façon dont le logiciel détermine le périphérique qui a lancé cette interruption.</p><p>Il existe deux types de conflits d'interruptions. Le premier est un vrai conflit, celui décrit ci-dessus. Dans ce cas, les interruptions ne fonctionnent plus et le pilote de périphérique continue d'essayer de contrôler son périphérique et ne sait pas que les interruptions ne fonctionnent pas. Le second type de conflit d'interruption arrive quand un pilote de périphérique est lancé mais découvre que l'interruption dont il a besoin est déjà utilisé. Il affiche un message d'erreur et quitte. Le message indique quelque chose comme « ressource en cours d'utilisation » (« ressource busy ») mais ne précise pas clairement qu'il s'agit d'un problème d'interruption.</p></div><div class="sect2" lang="fr"><div class="titlepage"><div><div><h3 class="title"><a id="N112A1" />Vrai conflit d'interruption</h3></div></div></div><p>Le BIOS et le noyau ne vont pas permettre un conflit d'interruptions en connaissance de cause. Alors comment cela peut-il arriver ? Une façon d'y parvenir arrive quand quelqu'un a indiqué un mauvais IRQ dans un fichier de configuration, par exemple en donnant un paramètre « irq=9 » à un module. Dans cet exemple, supposons que l'IRQ du périphérique est réellement le 5. Quand un autre pilote de périphérique se lance et trouve son périphérique à l'IRQ 5, vous avez deux vrai périphériques utilisant la même IRQ, ce qui aboutit à un vrai conflit. Le noyau a approuvé l'utilisation de l'IRQ 5 par le second périphérique car il a été trompé et pensait que le premier périphérique était sur l'IRQ 9.</p><p>Il existe d'autres cas où le noyau ne sait pas qu'une IRQ est utilisée. Par exemple quand une ancienne carte ISA est configuré par un cavalier mais que son pilote n'est pas encore lancé (il peut même ne pas voir de pilote). Un autre cas, le BIOS configure un IRQ au niveau matériel mais aucun pilote Linux n'est lancé pour ce matériel. Linux ne connaîtra donc pas cette IRQ. Ceci peut même arriver pour une carte PCI, celle-ci s'affichera avec la commande <span class="emphasis"><em>lspci -v</em></span> mais ne sera pas disponible dans le répertoire <span class="emphasis"><em>/proc/interrupts</em></span> et n'est donc pas connue par le noyau. Est-ce un bogue du noyau ?</p><p>Quels sont les symptômes d'un conflit d'interruption ? On pourrait penser que les périphériques ne fonctionnent pas du tout mais comme les adresses sont connues, le pilote peut communiquer. Les interruptions sont souvent utilisées pour contrôler le flux de données provenant et allant au périphérique. Sans les interruptions, le flux n'est pas contrôlé, ce qui signifie des dépassements de tampon, voire même pas de flux du tout, les interruptions pouvant aussi être utilisées pour initier le flux. Pour un modem série, le résultat est un flux extrêmement lent avec de longues pauses et des erreurs fréquentes. Pour une carte son, cela pourrait signifier qu'un mot ou deux sont entendus, puis plus rien.</p></div><div class="sect2" lang="fr"><div class="titlepage"><div><div><h3 class="title"><a id="N112B0" />Aucune interruption disponible</h3></div></div></div><p>Ceci arrive quand un pilote de périphérique est lancé mais quitte immédiatement pour éviter un conflit d'interruption. Généralement, il affiche un message d'erreur comme « ressource en cours d'utilisation » ou l'enregistre dans un journal de trace.</p><p>Un cas où un périphérique ISA est activé et ne peut se voir affecté une interruption (IRQ) car aucune n'est disponible. Ou une interruption pourrait être disponible mais ne peut pas être utilisée car le matériel du périphérique qui a besoin de cette interruption ne sait pas gérer le numéro disponible ou la carte mère ne le supporte pas non plus à cause de problèmes de routage (voir <a class="link" href="ar01s08.html" title="Interruptions PCI">PCI Interrupts</a>). Si les périphériques ISA utilisent toutes les interruptions, alors une ou plusieurs cartes PCI pourraient être en conflit car elles ne peuvent pas obtenir d'IRQ.</p><p>Normalement, le <acronym class="acronym">BIOS</acronym> affectera des interruptions et ne créera pas de conflits. Mais il pourrait être forcé de créer des conflits s'il tombe à court d'<acronym class="acronym">IRQ</acronym>. Ceci peut survenir si quelqu'un a configuré le <acronym class="acronym">BIOS</acronym> pour réserver certaines <acronym class="acronym">IRQ</acronym> pour les périphériques <acronym class="acronym">ISA</acronym> qui ne sont pas <acronym class="acronym">PnP</acronym>. Ces paramétrages pourraient être mauvais et devraient être vérifiés, tout spécialement si vous avez des problèmes. Par exemple, quelqu'un pourrait avoir réservé une <acronym class="acronym">IRQ</acronym> pour une carte <acronym class="acronym">ISA</acronym> qui a été enlevé du PC depuis longtemps. Si vous récupérez cette <acronym class="acronym">IRQ</acronym>, alors elle est disponible et un conflit disparaît. </p><p>Quelque fois, le <acronym class="acronym">BIOS</acronym> résoudra le problème du manque d'<acronym class="acronym">IRQ</acronym> en utilisant ce qu'il appelle l'<acronym class="acronym">IRQ</acronym> 0. Elle n'existe pas car la vrai <acronym class="acronym">IRQ</acronym> 0 est affectée en permanence à l'horloge de l'ordinateur mais signifie que le pilote devrait utiliser la demande au lieu des <acronym class="acronym">IRQ</acronym>. Ceci signifie que le pilote devra vérifier fréquemment le périphérique (lui demander) pour voir si le périphérique a besoin d'un service de la routine d'interruptions. Bien sûr, cela gâche du temps processeur et il y a plus de risques d'un dépassement de tampon du périphérique car il pourrait ne pas être servi assez rapidement par le pilote.</p></div></div><div class="navfooter"><hr /><table summary="Navigation footer" width="100%"><tr><td align="left" width="40%"><a accesskey="p" href="ar01s11.html">Précédent</a> </td><td align="center" width="20%"> </td><td align="right" width="40%"> <a accesskey="n" href="ar01s13.html">Suivant</a></td></tr><tr><td valign="top" align="left" width="40%">Messages d'erreurs </td><td align="center" width="20%"><a accesskey="h" href="index.html">Sommaire</a></td><td valign="top" align="right" width="40%"> Annexe</td></tr></table></div></body></html>