<!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>Ce que PnP doit faire : allouer des « ressources bus »</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="index.html" title="Guide pratique du Plug-and-Play" /><link rel="next" href="ar01s03.html" title="Deuxième introduction au Plug-and-Play (PnP)" /></head><body><div class="navheader"><table summary="Navigation header" width="100%"><tr><th align="center" colspan="3">Ce que <acronym class="acronym">PnP</acronym> doit faire : allouer des « <span class="quote">ressources bus</span> »</th></tr><tr><td align="left" width="20%"><a accesskey="p" href="index.html">Précédent</a> </td><th align="center" width="60%"> </th><td align="right" width="20%"> <a accesskey="n" href="ar01s03.html">Suivant</a></td></tr></table><hr /></div><div class="sect1" lang="fr"><div class="titlepage"><div><div><h2 class="title"><a id="N1024A" />Ce que <acronym class="acronym">PnP</acronym> doit faire : allouer des « <span class="quote">ressources bus</span> »</h2></div></div></div><div class="sect2" lang="fr"><div class="titlepage"><div><div><h3 class="title"><a id="N10252" />En quoi consiste le Plug-and-Play (<acronym class="acronym">PnP</acronym>) ?</h3></div></div></div><p>Si vous ne comprenez pas cette section, lisez <a class="link" href="ar01s02.html#dev_commun" title="Périphériques matériels et la communication avec ces derniers">Périphériques matériels et la communication avec ces derniers</a>.</p><p>En simplifiant à l'extrême, Plug-and-Play indique aux pilotes de périphériques où trouver les différents matériels (périphériques) tels que modems, cartes réseau, cartes son, et cætera. La tâche du Plug-and-Play est de faire correspondre les périphériques physiques avec les logiciels (pilotes de périphériques) qui les font fonctionner, et d'établir des canaux de communication entre chaque périphérique physique et son pilote. Pour ce faire, <acronym class="acronym">PnP</acronym> alloue les « <span class="quote">ressources bus</span> » suivantes aux matériels : adresses d'entrée/sortie, plages mémoire, <acronym class="acronym">IRQ</acronym>, canaux <acronym class="acronym">DMA</acronym> (uniquement pour les bus <acronym class="acronym">LPC</acronym> et <acronym class="acronym">ISA</acronym>). Ces quatre dernières sont parfois appelées des ressources de premier ordre ou simplement des ressources. <acronym class="acronym">PnP</acronym> maintient un enregistrement de ce qu'il fait et autorise l'accès à ces informations aux pilotes de périphériques. Si vous ne comprenez pas ce que sont ces quatre ressources bus, lisez les sous-sections suivantes de ce guide pratique : Adresses d'entrée/sortie, <acronym class="acronym">IRQ</acronym>, Canaux <acronym class="acronym">DMA</acronym>, Régions mémoire. Un article de la Linux Gazette parle de trois des ressources bus. Il est disponible sur <a class="ulink" href="http://www.linuxgazette.com/issue38/blanchard.html" target="_top"> Introduction aux <acronym class="acronym">IRQ</acronym>, <acronym class="acronym">DMA</acronym> et adresses de base</a> (NdT : une traduction française est disponible sur <a class="ulink" href="http://www.linuxgazette.com/issue38/blanchard.html" target="_top">traduc.org</a>). Une fois que ces ressources bus ont été assignées (et si le bon pilote est installé), le pilote actuel et ses « <span class="quote">fichiers</span> » du répertoire <code class="filename">/dev</code> sont prêt à être utilisés.</p><p>Cette méthode d'affectation <acronym class="acronym">PnP</acronym> des ressources bus est parfois appelée « <span class="quote">configuration</span> » mais il s'agit seulement d'une configuration bas-niveau. Le répertoire <code class="filename">/etc</code> comprend beaucoup de fichiers de configuration mais un grand nombre d'entre eux ne concernent pas la configuration de <acronym class="acronym">PnP</acronym>. Donc, la grande majorité des configurations de périphériques physiques n'a rien à voir avec <acronym class="acronym">PnP</acronym> ou les ressources bus. Par exemple, l'initialisation d'un modem par une phrase d'initialisation ou la configuration de sa vitesse ne concerne pas <acronym class="acronym">PnP</acronym>. Donc lorsque nous parlons de <acronym class="acronym">PnP</acronym>, la configuration ne concerne qu'un seul type de configuration. Alors que d'autres documentations (telles que celles pour MS Windows) appellent les ressources bus « <span class="quote">ressources</span> », j'ai utilisé le terme de ressources bus au lieu du simple « <span class="quote">ressources</span> » pour les distinguer des nombreux autres types de ressources. </p><p><acronym class="acronym">PnP</acronym> est un long processus réalisé par différents logiciels et matériels. Si seul un programme gérait <acronym class="acronym">PnP</acronym> sur Linux, cela serait simple. Mais, avec Linux, chaque pilote de périphérique fait son propre <acronym class="acronym">PnP</acronym> en utilisant le logiciel fourni par le noyau. Le matériel du BIOS du PC utilise <acronym class="acronym">PnP</acronym> au démarrage du PC. Et il y a bien plus que cela.</p></div><div class="sect2" lang="fr"><div class="titlepage"><div><div><h3 class="title"><a id="dev_commun" />Périphériques matériels et la communication avec ces derniers</h3></div></div></div><p>Un ordinateur est composé d'un processeur (<acronym class="acronym">CPU</acronym>) réalisant les opérations et de mémoire vive (<acronym class="acronym">RAM</acronym>) pour stocker les programmes et les données (en accès rapide). De plus, il existe de nombreux périphériques tels que différents types de disques, une carte vidéo, un clavier, des périphériques réseaux, des cartes modem, des périphériques sons, le bus <acronym class="acronym">USB</acronym>, les ports séries et parallèles, et cætera. Dans les anciens temps, la plupart des périphériques étaient des cartes insérées dans des emplacements du PC. Aujourd'hui, beaucoup de périphériques, qui étaient auparavant des cartes, sont maintenant compris dans les composants intégrés à la carte-mère. On trouve aussi une alimentation apportant l'électricité, différents bus sur la carte mère pour connecter les périphériques au <acronym class="acronym">CPU</acronym> et une boîte pour contenir le tout.</p><p>Les cartes se connectant sur la carte mère peuvent contenir plus d'un périphérique. Les cartes mémoires sont quelque fois considérées comme des périphériques mais ils ne sont pas Plug-and-Play si on suit le sens utilisé dans ce guide pratique.</p><p>Pour que l'ordinateur fonctionne bien, chaque périphérique doit être sous le contrôle de son « <span class="quote">pilote</span> ». Il s'agit d'un logiciel faisant partie du système d'exploitation, pouvant être chargé en tant que module et exécuté à partir du <acronym class="acronym">CPU</acronym>. Les pilotes de périphériques sont associés à des « <span class="quote">fichiers spéciaux</span> » rangés dans le répertoire <code class="filename">/dev</code>, bien qu'ils ne soient pas vraiment des fichiers. Ils ont des noms tels que hda3 (troisième partition du disque a), ttyS1 (deuxième port série), eth0 (première carte Ethernet), et cætera.</p><p>Le périphérique eth0 est celui de la carte ethernet (carte réseau). Auparavant, il s'agissait de /dev/eth0 mais c'est maintenant un périphérique virtuel du noyau. Ce que eth0 référence dépend du type de carte ethernet que vous avez. Si le pilote est un module, cette affectation se trouve probablement dans une table interne du noyau mais pourrait aussi se trouver dans <code class="filename">/etc/modules.conf</code> (appelé « <span class="quote">alias</span> »). Par exemple, si vous disposez d'une carte ethernet utilisant le composant « <span class="quote">tulip</span> », vous devez placer la ligne « <span class="quote">alias eth0 tulip</span> » dans <code class="filename">/etc/modules.conf</code> pour que, lorsque votre PC cherche eth0, il trouve le pilote tulip. Néanmoins, les noyaux modernes peuvent généralement trouver le bon module du périphérique. De cette façon, vous n'aurez pas à le spécifier vous-même.</p><p>Pour contrôler un périphérique, le <acronym class="acronym">CPU</acronym> (sous le contrôle du pilote de périphérique) envoie des commandes et des données du périphérique. Il reçoit aussi l'état et des données des différents périphériques. Pour cela, chaque pilote doit connaître l'adresse du périphérique qu'il doit contrôler. Connaître cette adresse revient à mettre en place un canal de communication, même si le « <span class="quote">canal</span> » physique se trouve être le bus de données interne au PC, bus partagé avec beaucoup d'autres périphériques.</p><p>Ce canal de communication est en fait un peu plus complexe que ce qui est décrit ci-dessus. Une « <span class="quote">adresse</span> » est en fait une plage d'adresses, ce qui fait que, parfois, le mot « <span class="quote">plage</span> » est utilisé à la place du mot « <span class="quote">adresse</span> ». Il peut exister plus d'une plage (sans recoupement) pour un seul périphérique. Il existe aussi un autre canal connu sous le nom d'interruptions permettant au périphérique d'envoyer une requête de « <span class="quote">demande d'aide</span> » urgente à leur pilote. </p></div><div class="sect2" lang="fr"><div class="titlepage"><div><div><h3 class="title"><a id="N1030A" />Adresses</h3></div></div></div><p>Le bus PCI a trois plages d'adressage : les entrées/sorties, la mémoire principale (mémoire d'entrées/sorties) et la configuration. L'ancien bus <acronym class="acronym">ISA</acronym> ne dispose pas de cette dernière. Seules les entrées/sorties et la mémoire principale sont utilisées pour les entrées/sorties du périphérique. Les adresses de configuration sont fixes et ne peuvent pas être modifiées donc elles n'ont pas besoin d'être affectées. Pour plus d'informations, voir <a class="link" href="ar01s13.html#pci_conf">Espace d'adressage de la configuration PCI</a>.</p><p>Quand le CPU veut accéder à un périphérique, il place l'adresse du périphérique sur un bus important de l'ordinateur (pour le PCI : le bus d'adresse/données). Tous les types d'adresses (tels que les entrées/sorties et la mémoire principale) partagent le même bus sur le PC. Mais la présence ou l'absence de voltage sur certains fils dédiés sur le bus du PC indique l'espace occupée par une adresse : entrée/sortie, mémoire principale (voir <a class="link" href="ar01s02.html#mem_" title="Plages mémoire">Espaces d'adressage</a>) ou la configuration (seulement PCI). Ceci est un peu trop simplifié car indiquer à un périphérique PCI qu'il s'agit d'une adresse de configuration est réellement plus complexe que la description ci-dessus. Voir <a class="link" href="ar01s13.html#pci_conf">Espace d'adressage pour la configuration PCI</a> pour plus d'informations. Voir <a class="link" href="ar01s13.html#address_details" title="Détails des adresses">Détails des adresses</a> pour plus d'informations sur l'adressage en général.</p><p>Les adresses d'un périphérique sont stockées dans les registres du matériel physique. Elles peuvent être changées par logiciel et elles peuvent être désactivées pour que le périphérique ne soit plus adressable, sauf en ce qui concerne les adresses de configuration du PCI qui ne peuvent être ni modifiées ni désactivées.</p></div><div class="sect2" lang="fr"><div class="titlepage"><div><div><h3 class="title"><a id="N10326" />Adresses d'entrées/sorties (principes relatifs à d'autres ressources)</h3></div></div></div><p>Les périphériques étaient originellement situés dans la plage d'adresses des entrées/sorties mais, aujourd'hui, ils peuvent utiliser la plage en mémoire principale. Une adresse d'entrée/sortie est quelque fois simplement appelée « <span class="quote">I/O</span> », « <span class="quote">IO</span> », « <span class="quote">i/o</span> » ou « <span class="quote">io</span> ». Les termes « <span class="quote">port I/O</span> » ou « <span class="quote">plage d'entrées/sorties</span> » sont aussi utilisés. Ne confondez pas ces ports d'entrées/sorties avec la mémoire d'entrées/sorties située en mémoire principale. Il existe deux étapes principales pour allouer des adresses I/O (ou d'autres ressources bus telles que les interruptions sur le bus <acronym class="acronym">ISA</acronym>) : <div class="itemizedlist"><ul><li><p>Initialiser l'adresse I/O, et cætera. dans le matériel (dans un de ses registres),</p></li><li><p>Laisser son pilote de périphérique reconnaître l'adresse I/O, et cætera.</p></li></ul></div> </p><p>Souvent, le pilote du périphérique fait les deux (en quelque sorte). Le pilote de périphérique n'a pas réellement besoin d'initialiser une adresse d'entrée/sortie s'il découvre que l'adresse a déjà été initialisée (peut-être par le <acronym class="acronym">BIOS</acronym>) et qu'il souhaite accepter cette adresse. Une fois que le pilote a soit trouvé une adresse précédemment configurée soit configuré l'adresse lui-même, alors il sait évidemment de quelle adresse il s'agit, donc il n'est pas nécessaire de lui fournir cette information -- il la connaît déjà.</p><p>Le processus en deux étapes ci-dessus (1. configurer l'adresse au niveau matériel. 2. mettre au courant le pilote.) ressemble aux deux parties d'un problème pour trouver le numéro de la maison d'une personne dans la rue. Quelqu'un doit installer un numéro sur l'entrée de la maison pour qu'elle puisse être trouvée, puis les personnes qui souhaitent aller à cette adresse doivent obtenir (et conserver) ce numéro pour qu'elles puissent trouver la maison. En informatique, le matériel du périphérique doit d'abord obtenir son adresse, qu'il placera dans un registre matériel spécial (ce qui revient à conserver le numéro dans notre exemple), puis le pilote de périphérique doit obtenir cette adresse (écrire ce numéro dans son carnet d'adresses). Les deux doivent être réalisés, soit automatiquement par le logiciel soit en saisissant manuellement des données dans des fichiers de configuration. Des problèmes pourraient survenir si seulement un des deux est fait correctement.</p><p>Pour la configuration manuelle de <acronym class="acronym">PnP</acronym>, des personnes font l'erreur de ne faire qu'une de ces deux étapes et se demandent ensuite pourquoi l'ordinateur ne peut pas trouver le périphérique. Par exemple, ils utilisent <span class="command"><strong>setserial</strong></span> pour associer une adresse au port série sans réaliser que ceci ne fait que donner une adresse au pilote. Cela n'enregistre pas cette adresse au niveau du port série physique. Si vous avez dit une bêtise au port série, alors vous avez un problème. Une autre façon de parler au pilote est de donner l'adresse comme option au module du noyau (pilote de périphérique). Si ce que vous dites est faux, il peut y avoir des problèmes. Un pilote intelligent pourrait détecter comment le matériel est réellement configuré et rejeter les mauvaises informations fournies par l'option (ou au moins afficher un message d'erreur).</p><p> Un pré-requis évident est que le périphérique physique (comme une carte) doit connaître son adresse avant le pilote du périphérique. Comme les pilotes de périphérique se lancent souvent tout de suite après le démarrage de l'ordinateur, ils peuvent tenter d'accéder à une carte (pour vérifier sa présence, et cætera) avant que l'adresse ne soit enregistrée au niveau de la carte par le programme de configuration <acronym class="acronym">PnP</acronym>. Et vous verrez un message d'erreur indiquant l'absence de la carte même si elle est bien dans le PC (mais n'a pas encore obtenue son adresse). </p><p>Ce qui a été dit dans les derniers paragraphes concernant les adresses I/O s'applique de la même manière à la majorité des autres ressources bus : <a class="xref" href="ar01s02.html#mem_" title="Plages mémoire">la section intitulée « Plages mémoire »</a>, <a class="xref" href="ar01s02.html#interrupt_over" title="IRQ - un aperçu">la section intitulée « <acronym class="acronym">IRQ</acronym> - un aperçu »</a> et <a class="xref" href="ar01s02.html#dma_" title="DMA (accès direct à la mémoire) ou maîtrise du bus">la section intitulée « <acronym class="acronym">DMA</acronym> (accès direct à la mémoire) ou maîtrise du bus »</a>. Les trois prochaines sections expliqueront ce qu'ils sont. La seule exception est que les interruptions du bus <acronym class="acronym">PCI</acronym> ne sont pas données par les registres d'une carte mais elles sont plutôt déroutées vers les <acronym class="acronym">IRQ</acronym> par un composant de la carte mère. Ensuite, l'<acronym class="acronym">IRQ</acronym> utilisée par cette carte <acronym class="acronym">PCI</acronym> est inscrite dans un registre de la carte dans un but unique d'informer.</p><p>Pour voir quelles adresses d'entrées/sorties sont utilisées sur votre <acronym class="acronym">PC</acronym>, regardez dans le fichier <code class="filename">/proc/ioports</code>.</p></div><div class="sect2" lang="fr"><div class="titlepage"><div><div><h3 class="title"><a id="mem_" />Plages mémoire</h3></div></div></div><p>Beaucoup de périphériques disposent d'une plage mémoire en mémoire principale. C'est quelquefois appelé « <span class="quote">mémoire partagée</span> » ou « <span class="quote">mémoire d'entrées/sorties</span> ». Cette mémoire est située physiquement dans le périphérique physique mais l'ordinateur y accède comme s'il accédait à des composants mémoire. En parlant de ressources bus, c'est souvent simplement appelé « <span class="quote">mémoire</span> », « <span class="quote">mem</span> », voire « <span class="quote">iomem</span> ». En plus de l'utilisation de cette « <span class="quote">mémoire</span> », un tel périphérique peut aussi utiliser une plage mémoire conventionnelle d'entrées/sorties. Pour connaître la mémoire utilisée sur votre ordinateur, cherchez dans <code class="filename">/proc/iomem</code>. Ce « <span class="quote">fichier</span> » inclut la mémoire utilisée par les composants mémoire habituels de la RAM, donc il affiche l'allocation mémoire en général et pas seulement l'allocation iomem. Si vous apercevez un numéro étrange au lieu d'un nom, c'est probablement le numéro d'un périphérique PCI, ce que vous pouvez vérifier en exécutant « <span class="quote">lspci</span> ».</p><p>Lorsque vous insérez une carte utilisant iomem, vous êtes aussi en train d'insérer un module mémoire pour la mémoire principale. Une adresse haute est sélectionnée pour lui par <acronym class="acronym">PnP</acronym> de façon à ce que cela ne rentre pas en conflit avec les modules de la mémoire principale (composants). Cette mémoire peut être de la mémoire morte (<acronym class="acronym">ROM</acronym> ou Read Only Memory) ou de la mémoire partagée. Cette dernière est partagée entre le périphérique et le <acronym class="acronym">CPU</acronym> (ayant lancé le pilote du périphérique) de la même façon que la plage d'adresses d'entrées/sorties est partagée entre le périphérique et le <acronym class="acronym">CPU</acronym>. Cette mémoire partagée sert en tant que moyen de « <span class="quote">transfert</span> » de données entre le périphérique et la mémoire principale. C'est de l'entrée/sortie mais ce n'est pas fait dans la plage d'adresses des entrées/sorties. La carte et le pilote doivent connaître la plage d'adresses.</p><p>La <acronym class="acronym">ROM</acronym> (<span class="foreignphrase"><em class="foreignphrase">Read-Only Memory</em></span>, soit mémoire en lecture seule) est un genre différent d'iomem. C'est plutôt un programme (parfois un pilote de périphérique), utilisé avec ce périphérique. Cela peut aussi être un code d'initialisation malgré que le pilote soit encore nécessaire. Avec un peu de chance, il fonctionnera aussi sous Linux, et pas seulement sous MS Windows. Elle peut être copiée en mémoire principale pour fonctionner plus rapidement. Mais dans ce cas, elle n'est plus « <span class="quote">en lecture seule</span> ».</p></div><div class="sect2" lang="fr"><div class="titlepage"><div><div><h3 class="title"><a id="interrupt_over" /><acronym class="acronym">IRQ</acronym> - un aperçu</h3></div></div></div><p>Après avoir lu ceci, vous pouvez lire <a class="xref" href="ar01s13.html#interrupt_detail" title="Détails sur les interruptions">la section intitulée « Détails sur les interruptions »</a> pour bien plus de détails. Ce qui suit est volontairement simplifié : en plus des adresses, il existe aussi un numéro d'interruption à gérer (tel que l'<acronym class="acronym">IRQ</acronym> 5). Cela s'appelle un numéro d'<acronym class="acronym">IRQ</acronym> (Interrupt ReQuest, ou demande d'interruption), ou plus simplement une « <span class="quote">irq</span> ». Nous avons déjà mentionné ci-dessus que le pilote de périphérique doit connaître l'adresse d'une carte pour être capable de communiquer avec elle. </p><p>Mais qu'en est-il de la communication en sens inverse ? Supposez que le périphérique ait besoin de dire quelque chose à son pilote immédiatement. Par exemple, le périphérique peut recevoir un grand nombre d'octets destinés à la mémoire principale et le tampon utilisé pour stocker ces octets est pratiquement plein. Du coup, le périphérique a besoin de demander à son pilote de récupérer ces octets avant que le tampon ne se voit dépassé par le flot continu d'octets. Un autre exemple serait de signaler au pilote que le périphérique a terminé d'envoyer un ensemble d'octets et qu'il attend maintenant de nouveaux octets à envoyer.</p><p>Comment le périphérique peut-il envoyer rapidement un signal à son pilote ? Il peut ne pas être capable d'utiliser le bus de données principal car il y a des chances qu'il soit déjà utilisé. Au lieu de cela, il place un voltage sur un fil d'interruption dédié (aussi appelé ligne ou trace) qui est souvent réservé pour ce seul périphérique. Ce signal est appelé une demande d'interruption (<acronym class="acronym">IRQ</acronym>) ou plus simplement une « <span class="quote">interruption</span> ». Il existe l'équivalent de 16 (ou 24, et cætera.) fils de ce type dans un PC et chaque fil amène (indirectement) à un certain pilote de périphérique. Chaque fil a un numéro d'<acronym class="acronym">IRQ</acronym> unique. Le périphérique doit placer son interruption sur le bon fil. Le fil sur lequel le périphérique envoie ces demandes d'aide est déterminé par le numéro d'<acronym class="acronym">IRQ</acronym> enregistré dans le périphérique. Ce même numéro d'<acronym class="acronym">IRQ</acronym> doit être connu par le pilote du périphérique pour que celui-ci sache quelle interruption écouter. </p><p>Une fois que le pilote reçoit l'interruption du périphérique, il doit trouver pourquoi cette interruption a été générée et agir de manière appropriée pour régler le problème. Sur le bus <acronym class="acronym">ISA</acronym>, chaque périphérique a habituellement besoin de son propre numéro unique d'<acronym class="acronym">IRQ</acronym>. Pour le bus <acronym class="acronym">PCI</acronym> et dans d'autres cas spéciaux, le partage d'<acronym class="acronym">IRQ</acronym> est autorisé (deux périphériques <acronym class="acronym">PCI</acronym>, ou plus, pourraient avoir le même numéro d'<acronym class="acronym">IRQ</acronym>). De même, pour le <acronym class="acronym">PCI</acronym>, chaque périphérique <acronym class="acronym">PCI</acronym> a un fil fixe <span class="foreignphrase"><em class="foreignphrase">PCI Interrupt</em></span>. Mais un composant de routage programmable fait correspondre les fils <acronym class="acronym">PCI</acronym> aux interruptions de type <acronym class="acronym">ISA</acronym>. Voir <a class="xref" href="ar01s13.html#interrupt_detail" title="Détails sur les interruptions">la section intitulée « Détails sur les interruptions »</a> pour savoir comment cela fonctionne.</p></div><div class="sect2" lang="fr"><div class="titlepage"><div><div><h3 class="title"><a id="dma_" /><acronym class="acronym">DMA</acronym> (accès direct à la mémoire) ou maîtrise du bus</h3></div></div></div><p>Pour le bus <acronym class="acronym">PCI</acronym>, <acronym class="acronym">DMA</acronym> et maîtrise de bus signifient la même chose. Avant l'arrivée du bus <acronym class="acronym">PCI</acronym>, la maîtrise du bus était rare et le <acronym class="acronym">DMA</acronym> fonctionnait différemment et était lent. L'accès direct à la mémoire (<acronym class="acronym">DMA</acronym>, acronyme de <span class="foreignphrase"><em class="foreignphrase">Direct Memory Access</em></span>) est ce qui permet à un périphérique de prendre la main sur le bus principal de l'ordinateur et de transférer directement des octets vers la mémoire principale ou vers d'autres périphériques. Normalement, le processeur s'occupe des transferts d'un périphérique vers la mémoire principale par un processus en deux étapes :</p><div class="itemizedlist"><ul><li><p>lire un ensemble d'octets à partir de la page mémoire d'entrées/sorties et les stocker dans le <acronym class="acronym">CPU</acronym> lui-même ; </p></li><li><p>écrire ces octets dans la mémoire principale.</p></li></ul></div><p>Avec le <acronym class="acronym">DMA</acronym>, il s'agit d'un processus en une seule étape consistant en l'envoi des octets directement du périphérique à la mémoire. Les périphériques doivent disposer de capacités <acronym class="acronym">DMA</acronym> intégrées et, du coup, tous les périphériques ne peuvent pas faire de <acronym class="acronym">DMA</acronym>. Alors que le <acronym class="acronym">DMA</acronym> est en cours, le processeur ne peut pas faire grand chose car le bus principal est en cours d'utilisation par le transfert <acronym class="acronym">DMA</acronym>.</p><p>L'ancien bus <acronym class="acronym">ISA</acronym> peut faire du <acronym class="acronym">DMA</acronym> lentement alors que le bus <acronym class="acronym">PCI</acronym> peut faire du <acronym class="acronym">DMA</acronym> par maîtrise du bus. Le bus <acronym class="acronym">LPC</acronym> a à la fois l'ancien et le nouveau <acronym class="acronym">DMA</acronym> (maîtrise du bus). Sur le bus <acronym class="acronym">PCI</acronym>, ce qui devrait être appelé plus précisément « maîtrise du bus » est souvent appelé « Ultra DMA », « BM-DNA », « udma » ou tout simplement « DMA ». Sur le bus <acronym class="acronym">PCI</acronym>, la maîtrise du bus est souvent appelé <acronym class="acronym">DMA</acronym>. La maîtrise du bus permet aux périphériques de devenir temporairement les maîtres du bus et de transférer des octets un peu comme lorsque le maître du bus était le processeur. Il n'utilise aucun numéro de canal car l'organisation du bus <acronym class="acronym">PCI</acronym> est telle que le matériel <acronym class="acronym">PCI</acronym> sait quel périphérique est actuellement le maître du bus et quel périphérique réclame à devenir le maître du bus. Du coup, il n'y a pas d'allocation de ressources pour les canaux <acronym class="acronym">DMA</acronym> pour le bus <acronym class="acronym">PCI</acronym> et aucune ressource de canaux <acronym class="acronym">DMA</acronym> n'existe pour ce bus. Le bus <acronym class="acronym">LPC</acronym> est supposé être configuré par le <acronym class="acronym">BIOS</acronym> pour que les utilisateurs n'aient pas à se soucier des canaux <acronym class="acronym">DMA</acronym>.</p></div><div class="sect2" lang="fr"><div class="titlepage"><div><div><h3 class="title"><a id="dma_isa" />Canaux <acronym class="acronym">DMA</acronym> (non pas pour le bus <acronym class="acronym">PCI</acronym>)</h3></div></div></div><p>C'est seulement pour l'ancien bus ISA et le bus LPC. Quand un périphérique veut faire du DMA, il lance une requête de DMA en utilisant les fils dédiés à cela, un peu comme une requête d'interruption. En fait, le DMA aurait pû être géré en utilisant des interruptions mais cela aurait introduit des délais, donc il est plus rapide de faire cela en ayant un type spécial d'interruption connu en tant que requête DMA. Comme les interruptions, les demandes DMA sont numérotées pour identifier le périphérique lançant la requête. Ce nombre est appelé un canal DMA. Comme les transferts DMA utilisant tous le bus principal (et qu'un seul peut être lancé à la fois), ils utilisent tous les même canal pour le flot de données mais le numéro de « <span class="quote">canal DMA</span> » sert à identifier qui utilise le canal. Les registres matériels existent sur la carte mère, qui enregistre l'état actuel de chaque canal. Du coup, pour lancer une requête DMA, le périphérique doit connaître son numéro de canal DMA stocké dans un registre spécial du périphérique physique. </p></div><div class="sect2" lang="fr"><div class="titlepage"><div><div><h3 class="title"><a id="N10481" />« <span class="quote">Ressources</span> » du périphérique et du pilote</h3></div></div></div><p>Donc, les pilotes de périphériques doivent être « <span class="quote">attachés</span> » d'une façon quelconque au matériel qu'ils contrôlent. Ceci se fait en allouant des ressources bus (I/O, mémoire, <acronym class="acronym">IRQ</acronym>, <acronym class="acronym">DMA</acronym>) au périphérique physique et en laissant le pilote le découvrir. Par exemple, un port série utilise seulement deux ressources : une <acronym class="acronym">IRQ</acronym> et une adresse d'entrées/sorties. Ces deux valeurs doivent être fournies au pilote et au périphérique physique. Le pilote (et son périphérique) dispose d'un nom dans le répertoire /dev (tel que ttyS1). L'adresse et le numéro <acronym class="acronym">IRQ</acronym> sont stockés par le périphérique physique dans ses registres de configuration sur sa carte (ou dans un composant de la carte mère). Les vieux matériels (dans les années 1990) utilisaient des interrupteurs (ou des cavaliers) pour configurer physiquement l'<acronym class="acronym">IRQ</acronym> et l'adresse au niveau du matériel. Ce paramétrage restera fixe tant qu'une personne n'enlevera pas le boîtier pour déplacer les cavaliers.</p><p>Mais, dans le cas de <acronym class="acronym">PnP</acronym> (pas de cavaliers), les données du registre de configuration sont habituellement perdues lorsque le PC est éteint, donc les données des ressources bus doivent être fournies à chaque périphérique à chaque allumage du PC.</p></div><div class="sect2" lang="fr"><div class="titlepage"><div><div><h3 class="title"><a id="N1049F" />Les ressources sont limitées</h3></div></div></div><div class="sect3" lang="fr"><div class="titlepage"><div><div><h4 class="title"><a id="N104A2" />L'ordinateur idéal</h4></div></div></div><p> L'architecture du PC n'apporte qu'un nombre limité de ressources : <acronym class="acronym">IRQ</acronym>, canaux <acronym class="acronym">DMA</acronym>, adresses d'entrées/sorties et de plages mémoires. S'il n'existait qu'un nombre limité de périphériques et qu'ils aient tous des ressources bus standardisées (telles que des adresses d'entrées/sorties et des numéros d'<acronym class="acronym">IRQ</acronym> uniques), il n'y aurait aucun souci pour attacher un pilote à son périphérique. Chaque périphérique devrait avoir un nombre fixe de ressources qui n'entreraient pas en conflit avec tout autre périphérique sur votre ordinateur. Deux périphériques ne devraient pas avoir les mêmes adresses, il n'y aurait pas de conflit d'<acronym class="acronym">IRQ</acronym> sur le bus <acronym class="acronym">ISA</acronym>, et cætera. Chaque pilote devrait être développé avec des adresses, des <acronym class="acronym">IRQ</acronym>, et cætera, uniques codées en dur dans le programme. La vie serait simple. </p><p>Une autre façon d'empêcher les conflits d'adresses serait d'avoir un numéro d'emplacement, inclus dans l'adresse, pour chaque carte. Du coup, il n'y aurait plus de conflits d'adresses entre deux cartes différentes (car elles sont dans des emplacements différents). La conception des cartes ne permettrait pas les conflits d'adresses entre les différentes fonctions de la carte. Il en ressort que l'espace d'adressage (utilisé pour la demande et l'affectation de ressources) le fait réellement. Mais cela n'est pas pris en compte pour les adresses d'entrées/sorties et pour les régions mémoire. Partager des IRQ comme sur le bus PCI évite aussi des conflits mais peut poser d'autres problèmes.</p></div><div class="sect3" lang="fr"><div class="titlepage"><div><div><h4 class="title"><a id="N104BB" />L'ordinateur réel</h4></div></div></div><p>Mais l'architecture du PC a des problèmes de conflit. L'augmentation du nombre de périphériques (incluant les multiples périphériques de même type) a tendance à augmenter les conflits potentiels. En même temps, l'introduction du bus PCI, où deux périphériques ou plus peuvent partager la même interruption et l'introduction d'interruptions supplémentaires, a tendance à réduire les conflits. Le résultat global, dû au passage au PCI, a été une réduction des conflits car les ressources les plus faibles sont les IRQ. Néanmoins, même sur le bus PCI, c'est un peu plus efficace pour éviter le partage des IRQ. Dans certains cas où les interruptions arrivent en une succession rapide et doivent être traitées rapidement (comme en audio), le partage peut causer des dégradations dans les performances. Donc, il n'est pas bon d'affecter tous les périphériques <acronym class="acronym">PCI</acronym> au même <acronym class="acronym">IRQ</acronym>, l'affectation doit être partagée. Néanmoins, certaines personnes trouvent que tous les périphériques <acronym class="acronym">PCI</acronym> sont sur la même <acronym class="acronym">IRQ</acronym>.</p><p>Donc, les périphériques ont besoin d'avoir de la flexibilité de façon à ce qu'ils puissent être initialisés avec n'importe quelle adresse, <acronym class="acronym">IRQ</acronym>, et cætera. C'est nécessaire pour éviter tout conflit et arriver à un point d'équilibre. Mais quelques <acronym class="acronym">IRQ</acronym> et adresses sont pratiquement des standards, comme ceux de l'horloge et du clavier. Ils n'ont pas besoin d'une telle flexibilité.</p><p>En plus du problème de conflit lors de l'allocation des ressources bus, une indication erronée en indiquant au pilote de périphérique quelles sont les ressources bus peut causer un autre problème. Cela a plus de chances d'arriver dans le cas de la configuration manuelle où l'utilisateur saisit les ressources utilisées dans un fichier de configuration sur le disque dur. Ceci fonctionne généralement bien quand les ressources sont initialisées avec des cavaliers sur les cartes (en supposant que l'utilisateur sache comment elles étaient initialisées et n'a fait aucune faute en saisissant ces données dans les fichiers de configuration). Mais, avec des ressources configurées par un logiciel <acronym class="acronym">PnP</acronym>, elles ne seront pas toujours identiques et cela pourrait poser problème pour toute configuration manuelle où l'utilisateur saisit les valeurs des ressources bus configurées par <acronym class="acronym">PnP</acronym>.</p><p>L'allocation de ressources bus, lorsqu'elle est faite correctement, établit des canaux de communications sans conflit entre le matériel physique et le pilote associé. Par exemple, si une certaine plage mémoire d'entrées/sorties (ressource) est allouée à la fois au pilote de périphérique et au matériel, alors cela a établi une communication sur une voie à sens unique entre eux. Le pilote peut envoyer des commandes et des informations au périphérique. C'est donc un peu plus qu'une voie à sens unique car le pilote peut obtenir des informations du périphérique en lisant ces registres. Mais le périphérique ne peut pas initier une communication de cette façon. Pour initier une communication, le périphérique a besoin d'une <acronym class="acronym">IRQ</acronym> pour qu'il puisse envoyer une interruption à son pilote. Ceci crée un canal de communication à double-sens où le périphérique physique et son pilote peuvent initier une communication.</p></div></div></div><div class="navfooter"><hr /><table summary="Navigation footer" width="100%"><tr><td align="left" width="40%"><a accesskey="p" href="index.html">Précédent</a> </td><td align="center" width="20%"> </td><td align="right" width="40%"> <a accesskey="n" href="ar01s03.html">Suivant</a></td></tr><tr><td valign="top" align="left" width="40%">Guide pratique du Plug-and-Play </td><td align="center" width="20%"><a accesskey="h" href="index.html">Sommaire</a></td><td valign="top" align="right" width="40%"> Deuxième introduction au Plug-and-Play (<acronym class="acronym">PnP</acronym>)</td></tr></table></div></body></html>