Sophie

Sophie

distrib > * > 2010.0 > * > by-pkgid > a412ceb851151854794ced2a242192bb > files > 2766

howto-html-fr-20080722-1mdv2010.0.noarch.rpm

<!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>