diff options
Diffstat (limited to 'fr_FR.ISO8859-1/books/handbook/internals/chapter.sgml')
-rw-r--r-- | fr_FR.ISO8859-1/books/handbook/internals/chapter.sgml | 2141 |
1 files changed, 0 insertions, 2141 deletions
diff --git a/fr_FR.ISO8859-1/books/handbook/internals/chapter.sgml b/fr_FR.ISO8859-1/books/handbook/internals/chapter.sgml deleted file mode 100644 index 1f05f5a3b5..0000000000 --- a/fr_FR.ISO8859-1/books/handbook/internals/chapter.sgml +++ /dev/null @@ -1,2141 +0,0 @@ -<!-- - The FreeBSD Documentation Project - The FreeBSD French Documentation Project - - $FreeBSD$ - Original revision: 1.8 ---> - -<chapter id="internals"> - <title>Les “internes” de FreeBSD</title> - &trans.a.haby; - - <sect1 id="booting"> - <title>Le processus de démarrage</title> - - <para><emphasis>Contribution de &a.phk;. v1.1, 16 Avril - 1995.</emphasis></para> - - <para>Le démarrage de FreeBSD est essentiellement un processus en - trois étapes : charger le noyau, identifier le système - de fichiers racine et initialiser utilisateur. Cela autorise - d'intéressantes combinaisons décrites plus loin.</para> - - <sect2> - <title>Charger un noyau</title> - - <para>Nous disposons actuellement des trois mécanismes de base - décrits ci-dessous pour charger un noyau : ils transmettent - tous des informations au noyau afin de l'aider à décider - de ce qu'il doit faire ensuite.</para> - - <variablelist> - <varlistentry> - <term>Biosboot</term> - - <listitem> - <para>Biosboot est notre “code de démarrage”. - Il consiste en deux fichiers qui seront copiés sur les huit - premiers kilo-octets de la disquette ou de la - “tranche” - <foreignphrase>slice</foreignphrase> - du - disque dur à partir de laquelle on démarrera.</para> - - <para>Biosboot peut charger un noyau donné par son nom dans - un système de fichiers FreeBSD.</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Dosboot</term> - - <listitem> - <para>Dosboot a été écrit par DI. Christian - Gusenbauer, et c'est malheureusement actuellement l'un des - quelques codes qui ne compilent pas sous FreeBSD, parce qu'il est - écrit pour les compilateurs Microsoft.</para> - - <para>Dosboot peut charger un noyau depuis un fichier MS-DOS ou un - système de fichiers FreeBSD sur disque. Il essaye de - négocier avec les divers et étranges - gestionnires de mémoire qui hantent les adresses hautes des - systèmes MS-DOS et les gagne en général - à sa cause.</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Netboot</term> - - <listitem> - <para>Netboot recherche une carte Ethernet supportée et - utilise BOOTP, TFTP et NFS pour trouver un noyau permettant de - démarrer.</para> - </listitem> - </varlistentry> - </variablelist> - </sect2> - - <sect2> - <title>Identifier le système de fichiers racine</title> - - <para>Dès que le noyau est chargé et que le code de - démarrage lui passe la main, le noyau s'initialise, il essaie de - déterminer quels sont les matériels installés, et - ainsi de suite; il lui faut ensuite trouver le système de - fichiers racine.</para> - - <para>Nous reconnaissons actuellement les types suivants de - systèmes de fichiers racine :</para> - - <variablelist> - <varlistentry> - <term>UFS</term> - - <listitem> - <para>C'est le type de système de fichiers racine le plus - habituel. Il peut être sur disquette ou sur disque - dur.</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>MSDOS</term> - - <listitem> - <para>Bien que ce soit techniquement possible, ce n'est pas - particulièrement utile, du fait de l'impossibilité - pour le système de fichiers <acronym>FAT</acronym> de - gérer les liens, les fichiers spéciaux et autres - particularités “UNIX”.</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>MFS</term> - - <listitem> - <para>Il s'agit en rélité d'un système de - fichiers UFS intégré au noyau à la - compilation de ce dernier. Cela signifie que le noyau n'a pas - vraiment besoin de disque dur, disquette ou autre matériel - pour s'exécuter.</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>CD9660</term> - - <listitem> - <para>Cela permet d'utiliser un CD-ROM comme système de - fichiers racine.</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>NFS</term> - - <listitem> - <para>Cela permet d'utiliser un serveur de fichiers comme - système de fichiers racine, essentiellement pour - faire fonctionner une machine sans disque dur.</para> - </listitem> - </varlistentry> - </variablelist> - </sect2> - - <sect2> - <title>Initialiser l'environnement utilisateur</title> - - <para>Pour que les programmes utilisateur puissent s'exécuter, le - noyau, quand la phase d'initialisation est terminée, lance un - processus de <literal>pid == 1</literal> et exécute - un programme du système de fichiers racine;, normalement - <filename>/sbin/init</filename>.</para> - - <para>Vous pouvez remplacer <command>/sbin/init</command> par n'importe - quel programme, tant que vous vous rappelez que :</para> - - <para>Il n'y a pas de stdin/out/err à moins que vous ne les ouvriez - vous-même. Si vous sortez du programme, la machine panique. La - gestion des signaux par le processus de <literal>pid == 1</literal> est - particulière à ce processus.</para> - - <para>Le programme <command>/stand/sysinstall</command> de la disquette - d'installation est un exemple d'“init” adapté.</para> - </sect2> - - <sect2> - <title>Combinaisons intéressantes</title> - - <para>Démarrer un noyau contenant un système de fichiers MFS - avec un programme <filename>/sbin/init</filename> particulier - qui...</para> - - <variablelist> - <varlistentry> - <term>A — En utilisant DOS</term> - - <listitem> - <itemizedlist> - <listitem> - <para>monte votre disque <filename>C:</filename> sous le - répertoire <filename>/C:</filename></para> - </listitem> - - <listitem> - <para>attache le fichier spécial - <filename>/dev/vn0</filename> au fichier - <filename>C:/freebsd.fs</filename></para> - </listitem> - - <listitem> - <para>monte <filename>/dev/vn0</filename> sous - <filename>/rootfs</filename></para> - </listitem> - - <listitem> - <para>crée les liens symboliques - <filename>/rootfs/bin</filename> -> - <filename>/bin</filename>, - <filename>/rootfs/etc</filename> -> - <filename>/etc</filename>, - <filename>/rootfs/sbin</filename> -> - <filename>/sbin</filename> (etc.)</para> - </listitem> - </itemizedlist> - - <para>Vous faites maintenant tourner FreeBSD sans avoir - repartitionné votre disque dur...</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>B — En utilisant NFS</term> - - <listitem> - <itemizedlist> - <listitem> - <para>monte avec NFS votre - <filename>serveur:~vous/FreeBSD</filename> sur - <filename>/nfs</filename>, redéfinit la racine comme - <filename>/nfs</filename> - avec - <citerefentry><refentrytitle>chroot</refentrytitle> - <manvolnum>8</manvolnum></citerefentry> - et - y exécute <filename>/sbin/init</filename></para> - </listitem> - </itemizedlist> - - <para>Vous faites maintenant tourner FreeBSD sans disque dur, bien - que vous n'ayez pas le contrôle du serveur NFS...</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>C — Démarre un serveur X</term> - - <listitem> - <para>Vous avez maintenant un terminal X, bien plus efficace que X - sous Windows, tellement lent que vous pouvez- voir- tout- ce - qu'il- fait, alors que votre patron assure que cela est toujours - mieux que de dépenser encore de l'argent en - matériel.</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>D — En utilisant une bande</term> - - <listitem> - <itemizedlist> - <listitem> - <para>copie <filename>/dev/rwd0</filename> sur un lecteur de - bandes sur le réseau ou sur un serveur de - fichiers.</para> - </listitem> - </itemizedlist> - - <para>Vous avez finalement la sauvegarde que vous auriez dû - faire il y a un an déjà...</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>E — Fonctionne - comme coupe-feu / serveur Web / que sais-je - encore...</term> - - <listitem> - <para>C'est particulièrement intéressant parce que - vous pouvez démarrer à partir d'une disquette - protégée en écriture, et pouvez malgré - tout écrire sur votre système de fichiers - racine.</para> - </listitem> - </varlistentry> - </variablelist> - </sect2> - </sect1> - - <sect1 id="memoryuse"> - <title>Utilisation de la mémoire du PC</title> - - <para><emphasis>Contribution de &a.joerg;. 16 Avril 1995.</emphasis></para> - - <para><emphasis>Une brève description de la manière dont - FreeBSD utilise la mémoire sur les plates-formes - i386</emphasis></para> - - <para>Le secteur de démarrage est chargé à l'adresse - <literal>0:0x7c00</literal>, et se reloge immédiatement à - l'adresse <literal>0x7c0:0</literal>. (Il n'y a rien de mystérieux - là-dedans, c'est seulement un ajustement du registre - <literal>%cs</literal>, effectué par un - <literal>ljmp</literal>.)</para> - - <para>Il charge ensuite les quinze premiers secteurs à l'adresse - <literal>0x10000</literal> (segment <makevar>BOOTSEG</makevar> dans le - <filename>Makefile</filename> de - <citerefentry><refentrytitle>biosboot</refentrytitle></citerefentry>), et - initialise la pile pour qu'elle travaille aux adresses en-dessous - de <literal>0x1fff0</literal>. Il passe ensuite au point d'entrée - <literal>boot2</literal> de ce code, i.e. il se branche au-delà de - lui-même et de la table de partition (fictive), et ajuste le - registre <literal>%cs</literal>—nous sommes alors encore en - mode 16-bits.</para> - - <para><literal>boot2</literal> recherche le fichier de démarrage, et - examine son en-tête <filename>a.out</filename>. Il masque le point - d'entrée de ce fichier (habituellement - <literal>0xf0100000</literal>) avec <literal>0x00ffffff</literal> et - charge le code à l'adresse ainsi obtenue. Il est donc - généralement chargé à l'adresse 1 MB - (<literal>0x00100000</literal>). Pendant le chargement, le code va et - vient entre le mode réel et le mode protégé, pour - utiliser le BIOS en mode réel.</para> - - <para>Le code de démarrage lui-même utilise les - sélecteurs de segment <literal>0x18</literal> et - <literal>0x20</literal> pour <literal>%cs</literal> et - <literal>%ds/%es</literal> en mode protégé, et - <literal>0x28</literal> pour revenir en mode réel. Le noyau est - finalement lancé avec <literal>%cs</literal> - <literal>0x08</literal> et <literal>%ds/%es/%ss</literal> - <literal>0x10</literal>, qui constituent des descripteurs fictifs - recouvrant la totalité de l'espace d'adressage.</para> - - <para>Le noyau démarre à l'adresse à laquelle il est - chargé. Comme son édition de liens a été - effectuée pour une autre adresse (haute), il doit exécuter - du code <literal>PIC</literal> jusqu'à ce que la table de pages et - le répertoire des pages soient correctement renseignés, la - pagination peut alors être activée et le noyau - s'exécuter à l'adresse pour laquelle il a été - généré.</para> - - <para><emphasis>Contribution de &a.dg;. 16 Avril 1995.</emphasis></para> - - <para>Les pages physiques qui suivent immédiatement le segment - <literal>BSS</literal> du noyau contiennent le répertoire de pages - de <literal>proc0</literal>, ses tables de pages et les - pages utilisateur. Plus tard, quand le système de - mémoire virtuelle est initialisé, la mémoire - physique entre <literal>0x1000-0x9ffff</literal> et la mémoire - physique après le noyau (<literal>text+data+bss+proc0+d'autres - choses</literal>) est mise à disposition sous forme de pages de - mémoire virtuelle ordinaires et ajoutée à la liste - globales des pages libres.</para> - </sect1> - - <sect1 id="dma"> - <title>L'accès direct à la - mémoire - -<foreignphrase>DMA</foreignphrase> : - Qu'est-ce que c'est et comment ça marche</title> - - <para><emphasis>Copyright © 1995,1997 &a.uhclem;, Tous Droits - Réservés. 10 Décembre 1996. Dernière mise - à jour le 8 Octobre 1997.</emphasis></para> - - <para>L'accès direct à la - mémoire - <foreignphrase>Direct - Memory Access (DMA)</foreignphrase> - est une technique qui - permet que les mouvements de données entre la mémoire et - les périphériques se fassent sans intervention de - l'unité centrale (<foreignphrase>CPU</foreignphrase>).</para> - - <para>L'implémentation de l'accès direct à la - mémoire diffère selon les architectures matérielles, - nous limiterons donc la discussion à son implémentation sur - l'ordinateur personnel IBM (<foreignphrase>PC</foreignphrase>), sur l'IBM - PC/AT, ses successeurs et ses différents clones.</para> - - <para>Le sous-système DMA du PC repose sur le contrôleur DMA - Intel 8237. Ce contrôleur gère quatre canaux DMA qui peuvent - être programmés séparément et chacun de ces - canaux peut être le canal actif à un moment donné. Ces - canaux sont numérotés 0, 1, 2 et 3. Depuis le PC/AT, IBM a - ajouté une seconde puce 8237, et numéroté ces canaux - 4, 5, 6 et 7.</para> - - <para>Le contrôleur DMA d'origine (0,1, 2 et 3) effectue les - transferts octet par octet. Le second contrôleur DMA (4, 5, 6 et 7) - effectue les transferts 16 bits par 16 bits, le premier octet étant - toujours un octet d'adresse paire. Les deux contrôleurs sont des - composants identiques, la différence dans la taille des transferts - vient du càblage différent du second - contrôleur.</para> - - <para>Il y a deux signaux électriques par canal sur le 8237, - appelés DRQ (<foreignphrase>Data Request</foreignphrase>) et -DACK - (<foreignphrase>Data Acknowledge</foreignphrase>). Il y a des signaux supplémentaires dont les noms sont HRQ (<foreignphrase>Hold - Request</foreignphrase>), HLDA (<foreignphrase>Hold - Ackwnoledge</foreignphrase>), -EOP (<foreignphrase>End Of - Process</foreignphrase>) et des signaux de contrôle du bus -MEMR - (<foreignphrase>Memory Read</foreignphrase>), -MEMW (<foreignphrase>Memory - Write</foreignphrase>), -IOR (<foreignphrase>I/O Read</foreignphrase>) et - IOW (<foreignphrase>I/O Write</foreignphrase>).</para> - - <para>Le contrôleur DMA 8237 est un contrôleur - “<foreignphrase>fly-by</foreignphrase>” - transparent. - Cela signifie que les données transférées ne - transitent pas par la puce DMA et n'y sont pas mémorisées. - En conséquence, le DMA ne peut effectuer de transferts qu'entre un - port d'entrée/sortie et la mémoire, pas entre deux ports - d'entrée/sortie ou deux adresses mémoire.</para> - - <note> - <para>Le 8237 autorise l'interconnexion de deux de ses canaux pour - permettre les opérations DMA de mémoire à - mémoire, en mode - non-“<foreignphrase>fly-by</foreignphrase>”, mais nul dans - l'industrie du PC n'utilise cette ressource rare de cette façon, - parce qu'il est plus rapide de transférer des données - entre deux adresses mémoire en passant par le processeur.</para> - </note> - - <para>Dans l'architecture PC, chaque canal DMA est normalement activé - uniquement quand le matériel qui utilise le canal DMA en question - demande un transfert en validant la ligne DRQ pour ce canal.</para> - - <sect2> - <title>Un exemple de transfert DMA</title> - - <para>Voici un exemple des étapes successives qui provoquent et - effectuent un transfert DMA. Dans cet exemple, le contrôleur - du lecteur de disquette - <foreignphrase>floppy disk - controller (FDC)</foreignphrase> - vient de lire un octet sur - la disquette et demande au DMA de le ranger à l'adresse - mémoire <literal>0x00123456</literal>. Le processus commence - quand le FDC active le signal DRQ2 (la ligne DRQ pour le canal DMA - numéro 2) pour prévenir le contrôleur DMA.</para> - - <para>Le contrôleur DMA s'aperçoit que le signal DRQ2 est - positionné et s'assure que le canal DMA 2 est programmé - et non-masqué (activé). Le contrôleur DMA s'assure - aussi qu'aucun autre canal DMA n'est actif ou ne demande à - l'être et possède une plus haute priorité. Ces - vérifications faites, le DMA demande au processeur de - libérer le bus pour pouvoir l'utiliser. Il le fait en activant - le signal HRQ, envoyé au processeur.</para> - - <para>Le CPU détecte le signal HRQ et termine l'exécution de - l'instruction en cours. Dès que le processeur est en mesure de - libérer le bus, il le fait. Tous les signaux normalement - générés par le processeur (-MEMR, -MEMW, -IOR, - -IOW et quelques autres) sont positionnés dans un état - intermédiaire (ni haut, ni bas), puis le CPU positionne le - signal HDLA qui prévient le contrôleur DMA qu'il a - maintenant le contrôle du bus.</para> - - <para>Selon le processeur, le CPU peut encore être capable - d'exécuter quelques instructions supplémentaires bien - qu'il n'ait plus accès au bus, mais il peut aussi devoir - attendre lorsqu'il arrive sur une instruction qui doit lire une - donnée en mémoire et que celle-ci ne se trouve pas dans le - cache interne du processeur ou dans son - canal - “<foreignphrase>pipeline</foreignphrase>”.</para> - - <para>Maintenant que le DMA “a la main”, il active ses signaux - de sortie -MEMR, -MEMW, -IOR, -IOW, et fixe l'adresse de sortie du DMA - en <literal>0x3456</literal>, adresse qui sera utilisée pour - diriger l'octet qui va être transféré vers une - adresse mémoire donnée.</para> - - <para>Le DMA avertit ensuite le périphérique qui a - demandé le transfert que celui-ci commence, en positionnant le - signal -DACK, ou, dans le cas du contrôleur de disquette, le - signal -DACK2.</para> - - <para>C'est maintenant au contrôleur de disquette de placer l'octet - à transférer sur les lignes de données du bus. A - moins qu'il ne faille plus de temps au contrôleur de disquette - pour placer l'octet de donnée sur le bus (et dans ce cas, il - prévient le DMA via le signal READY), le DMA attend un cycle de - son horloge, puis désactive les signaux -MEMW et -IOR, de - façon à ce que la mémoire bascule et stocke - l'octet qui se trouve sur le bus, et que le contrôleur de - disquette sache que l'octet a été - transféré.</para> - - <para>Comme le DMA ne transfère qu'un seul octet à la fois - et par cycle, le FDC désactive maintenant le signal DRQ2, de - sorte que le DMA sache que l'on n'a plus besoin de ses services. Le - DMA désactive alors le signal -DACK2, pour avertir le FDC de - ne plus mettre de donnée sur le bus.</para> - - <para>Le DMA regarde alors si les autres canaux DMA ont des - opérations à effectuer. Si aucun des canaux n'a sa ligne - DRQ active, le travail du contrôleur DMA est terminé et il - positionne ses signaux -MEMR, -MEMW, -IOR, -IOW et d'adresse dans un - état intermédiaire.</para> - - <para>Pour finir, le DMA désactive le signal HRQ. Le CPU s'en - aperçoit et désactive le signal HOLDA puis active ses - signaux -MEMR, -MEMW, -IOR, -IOW et d'adresse et enfin reprend - l'exécution des instructions et ses accès à la - mémoire et aux périphériques.</para> - - <para>Pour un secteur de disquette typique, le processus ci-dessus est - répété 512 fois, une fois pour chaque octet. Chaque - fois qu'un octet est transféré, le registre d'adresse du - DMA est incrémenté et le compteur du DMA qui indique - combien d'octets ont été transférés, - décrémenté.</para> - - <para>Quand le compteur arrive à zéro, le DMA positionne le - signal EOP, qui indique que son compteur est nul et qu'aucune autre - donnée ne sera transférée tant que le - contrôleur DMA n'aura pas été reprogrammé par - le CPU. Cet événement est aussi appelé - “fin de décompte” - <foreignphrase>Terminal - Count (TC)</foreignphrase>. Il n'y a qu'un seul signal EOP, et comme il - ne peut y avoir qu'un seul canal DMA actif à un moment - donné, c'est nécessairement le canal DMA actuellement - actif qui vient de terminer sa tâche.</para> - - <para>Si un périphérique veut générer une - interruption à la fin du transfert d'un tampon, il peut tester si - les signaux -DACKn et EOP sont simultanément actifs. Quand cela - se produit, c'est que le DMA ne transférera plus d'autre - donnée pour ce périphérique sans intervention du - CPU. Le périphérique peut alors positionner un de ses - signaux d'interruption pour avertir le CPU. Dans l'architecture PC, le - circuit DMA lui-même ne peut pas générer - d'interruption. Le périphérique et l'électronique - associée sont responsables de la génération de - toutes les interruptions qui peuvent intervenir. Il est en - conséquence impossible d'avoir des périphériques - qui utilisent le DMA mais n'emploient pas d'interruptions.</para> - - <para>Il est important de comprendre que bien que le CPU laisse toujours - l'accès au bus au DMA quand le DMA effectue sa demande, cette - action est transparente pour les applications et pour le - système d'exploitation, hormis pour le petit temps - supplémentaire que met le processeur agrave; exécuter des - instructions quand le DMA est actif. En conséquence, le - processeur doit interroger les périphériques, les - registres du DMA ou recevoir une interruption du - périphérique pour être sûr qu'un transfert DMA - est terminé.</para> - </sect2> - - <sect2> - <title>Les registres de page DMA et la limite d'adressage de 16Mo</title> - - <para>Vous avez peut-être déjà remarqué qu'au - lieu de prendre pour adresse la valeur <literal>0x00123456</literal>, le - DMA utilise la valeur <literal>0x3456</literal>. Cela mérite - quelques explications.</para> - - <para>Quand l'IBM PC d'origine a été conçu, IBM a - choisi d'utiliser à la fois des circuits contrôleur DMA et - contrôleur d'interruptions prévus pour le 8085, un - processeur 8-bits avec un espace adressable sur 16 bits (64Ko). Comme - l'IBM PC supportait plus de 64Ko de mémoire, il fallait trouver - le moyen de permettre au DMA de lire ou d'écrire à des - emplacements mémoire au-delà de la limite de 64Ko. Pour - résoudre le problème, IBM a ajouté un registre - externe pour chaque canal DMA qui reçoit les bits de poids fort - de l'adresse où lire ou écrire. Chaque fois - qu'un canal DMA est actif, le contenu de ce registre est écrit - sur le bus d'adresse et y reste jusqu'à ce que l'opération - DMA pour ce canal soit terminée. IBM a appelé ces - registres “registres de page”.</para> - - <para>Dans notre exemple précédent donc, le DMA mettrait la - partie <literal>0x3456</literal> de l'adresse sur le bus et le registre - de page du canal DMA 2 mettrait la partie <literal>0x0012xxxx</literal> - sur le bus. Ensemble, ces deux valeurs constituent l'adresse - mémoire complète de l'accès.</para> - - <para>Comme le registre de page est indépendant du circuit DMA, la - zone mémoire où lire ou écrire ne doit pas franchir - la limite d'une plage de 64Ko. Par exemple, si le DMA accède - à l'adresse <literal>0xffff</literal>, après transfert, le - DMA incrémente le registre d'adresse et accède à - l'octet d'adresse suivante <literal>0x0000</literal> et non - <literal>0x10000</literal>. Ce n'est probablement pas le résultat - attendu.</para> - - <note> - <para>Les limites “physiques” de 64Ko ne doivent pas - être confondues avec les “segments” de 64Ko du mode - 8086, qui sont définis par l'addition d'un registre de segment - et d'un registre de déplacement. Les registres de page ne - peuvent pas recouvrir d'adresses communes car ils font l'objet d'un - <literal>OU</literal> logique avec l'adresse basse.</para> - </note> - - <para>Pour compliquer encore les choses, les registres externes d'adresse - DMA du PC/AT n'ont que 8 bits, ce qui nous donne 8+16=24 bits, ce qui - signifie que le DMA ne peut adresser la mémoire qu'entre 0 et - 16Mo. Sur les ordinateurs plus récents, qui permettent d'utiliser - plus de 16Mo de mémoire, le DMA compatible PC standard ne peut - adresser au-delà de 16Mo.</para> - - <para>Pour contourner cette restriction, les systèmes - d'exploitation réservent une zone de mémoire en - dessous de 16Mo qui n'inclue pas une limite de plage de 64 Ko. Le DMA - est alors programmé pour effectuer les transferts dans cette zone - tampon. Une fois que ce transfert est terminé, le système - d'exploitation copie alors les données à l'adresse - où elles doivent effectivement être stockées.</para> - - <para>Pour transférer des données d'une adresse - au-delà de 16Mo vers un périphérique utilisant le - DMA, les données doivent d'abord être copiées dans - un tampon en dessous de 16Mo, et de là, le DMA peut les - transférer au périphérique. Sous FreeBSD, ces - tampons réservés sont appelés “tampons - à rebonds” - <foreignphrase>Bounce - Buffers</foreignphrase>. Dans le monde MS-DOS, ils sont parfois - appelés “tampons - intelligents” - <foreignphrase>Smart - Buffers</foreignphrase>.</para> - - <note> - <para>Une nouvelle implémentation du 8237, appelée 82374, - possède des registres de page de 16 bits, ce qui permet - l'adressage 32 bits, sans avoir à utiliser de tampon à - rebonds.</para> - </note> - </sect2> - - <sect2> - <title>Modes opératoires et configurations du DMA</title> - - <para>Le DMA 8237 peut opérer selon différents modes. Les - principaux sont :</para> - - <variablelist> - <varlistentry> - <term>Simple</term> - - <listitem> - <para>Un seul octet (ou mot) est transféré. Le DMA - doit libérer et réobtenir le bus pour chaque nouvel - octet. Ce mode est habituellement utilisé par les - périphériques qui ne peuvent transférer - immédiatement un bloc entier de données. Le - périphérique fait appel au DMA chaque fois qu'il est - prêt à un nouveau transfert.</para> - - <para>Le contrôleur de disquette standard des compatibles PC - (NEC 765) n'a qu'un tampon d'un octet. Il utilise donc ce - mode.</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Bloc/A la Demande</term> - - <listitem> - <para>Une fois que le DMA a eu le contrôle du bus - système, il transfère un bloc entier de - données, de 64Ko au plus. Si le périphérique - a besoin de plus de temps, il peut activer le signal READY pour - suspendre brièvement le transfert. READY doit être - utilisé parcimonieusement et, pour un - périphérique lent, il faut plutôt utiliser le - mode simple.</para> - - <para>Le différence entre les modes Bloc et A la Demande est - que dès qu'un transfert Bloc est entamé, il se - poursuit jusqu'à ce que le compteur d'octets - transférés atteigne la valeur zéro. Le signal - DRQ ne doit être actif que jusqu'à ce que le signal - -DACK soit activé. En mode A la Demande, les octets sont - transférés jusqu'à ce que le signal DRQ soit - désactivé, le DMA interrompt alors le transfert et - rend le contrôle du bus au CPU. Quand le signal DRQ est - ensuite réactivé, le transfert reprend là - où il a été interrompu.</para> - - <para>Les anciens contrôleurs de disques durs utilisaient le - mode A la Demande, jusqu'à ce que la puissance des - processeurs augmente au point qu'il soit plus efficace de - transférer les données en utilisant le CPU, en - particulier lorsque les adresses mémoire utilisées - pour le transfert se situent au-delà de la limite des - 16Mo.</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Cascade</term> - - <listitem> - <para>Ce mécanisme permet à un canal DMA de - prendre le contrôle du bus, mais c'est ensuite le - périphérique associé et non le DMA qui est - chargé de paramétrer le bus d'adresse. Ce mode est - aussi utilisé pour mettre en oeuvre une technique - appelée “Maîtrise du - bus” - <foreignphrase>Bus - Mastering</foreignphrase>.</para> - - <para>Quand un canal DMA en mode Cascade reçoit le - contrôle du bus, le DMA ne met pas les adresses et les - signaux de contrôle des entrées/sorties sur le bus - comme le DMA le fait normalement quand il est actif. Au lieu de - cela, il positionne uniquement le signal -DACK pour le canal - DMA actif.</para> - - <para>C'est au périphérique relié - à ce canal DMA de fournir l'adresse et les signaux de - contrôle du bus. Le périphérique - contrôle alors intégralement le bus système - et peut effectuer des opérations de lecture et/ou - d'écriture à n'importe quelle adresse en dessous de - 16 Mo. Quand le périphérique en a terminé, - il désactive le signal DRQ et le contrôleur DMA peut - alors rendre le main au processeur ou à un autre canal - DMA.</para> - - <para>Le mode Cascade peut servir à mettre plusieurs - contrôleurs DMA en série, et c'est exactement - à cela que sert le canal DMA 4 dans l'architecture PC. - Quand un périphérique demande le bus sur un des - canaux DMA 0, 1, 2 ou 3, le contrôleur DMA esclave active - le signal HLDREQ, mais ce dernier est en fait relié - à la ligne DRQ4 du contrôleur DMA primaire et non au - processeur. Le contrôleur DMA primaire, pensant qu'il a - un transfert à effectuer sur le canal 4, demande le bus au - processeur avec le signal HLDREQ. Une fois que le CPU lui a - octroyé le bus, le signal -DACK4 est positionné et - ce dernier est en fait relié au signal HLDA du - contrôleur DMA esclave. Le contrôleur DMA esclave - transfère alors des données pour le canal DMA - (0, 1, 2 ou 3) qui l'a demandé ou bien confie le bus - à un périphérique qui veut en avoir la - maîtrise, un contrôleur SCSI, par exemple.</para> - - <para>A cause de ce câblage, seuls les canaux DMA 0, 1, 2, 3, - 5, 6 et 7 peuvent être utilisés par des - périphériques sur les systèmes PC/AT.</para> - - <note> - <para>Le canal DMA 0 était réservé pour les - opérations de rafraîchissement sur les premiers - IBM PC, mais est habituellement disponible pour les - périphériques sur les systèmes - récents.</para> - </note> - - <para>Quand un périphérique prend le contrôle du - bus, il faut qu'il transfère des données de ou vers - la mémoire de façon constante, tant qu'il garde le - contrôle du bus système. Si le - périphérique ne peut pas le faire, il faut qu'il - libère fréquemment le bus, pour que le - système puisse rafraîchir la mémoire.</para> - - <para>La RAM dynamique utilisée par tous les PCs doit - être rafraîchie fréquemment pour que les bits - stockés par ses composants restent - “chargés”. La RAM dynamique est essentiellement constituée de millions de condensateurs représentant - chacun un bit de donnée. Ces condensateurs sont - chargés pour représenter un <literal>1</literal> ou - déchargés pour représenter un - <literal>0</literal>. Comme tous les condensateurs fuient, il faut - les recharger à intervalles réguliers pour conserver - les valeurs <literal>1</literal>. Les circuits de mémoire - s'occupent en fait de la tâche de recharger les cases - mémoire appropriées, mais le reste du système - doit leur dire quand le faire, pour que cela n'interfère - pas avec les accès normaux du système à la - mémoire. Si l'ordinateur ne peut pas rafraîchir la - mémoire, le contenu de cette dernière sera corrompu - en quelques millisecondes.</para> - - <para>Comme les cycles de lecture et d'écriture en - mémoire “comptent” pour des cycles de - rafraîchissement (un cycle de rafraîchissement de la - RAM dynamique est en fait un cycle de lecture incomplet), tant que - le périphérique continue de lire ou d'écrire - des données en séquence en mémoire, cette - opération rafraîchit la totalité de la - mémoire.</para> - - <para>La prise de contrôle du bus est utilisée par les - interfaces SCSI et d'autres contrôleurs de - périphérique de haute performance.</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Autoinitialisation</term> - - <listitem> - <para>Dans ce mode, le DMA opère des transferts d'octet, de - bloc, ou à la demande mais, lorsque le compteur de - transferts du DMA arrive à zéro, le compteur et - l'adresse sont réinitialisés avec les valeurs - initialement programmées pour le canal DMA. Cela signifie - que tant que le périphérique demande des transferts, - ils lui sont accordés. C'est au processeur de placer les - données à l'avance dans le tampon fixe d'où - le DMA les déplacera lors d'opérations de sortie, et - de lire les données du tampon avant que le DMA n'y - réécrive lors d'opérations - d'entrée.</para> - - <para>Cette technique est couramment utilisée par les - périphériques audio qui n'ont qu'un petit ou pas - de tampon matériel pour les échantillons. - Il y a occupation supplémentaire du processeur pour - gérer ce tampon “circulaire” mais, dans - certains cas, c'est la seule façon d'éliminer le - temps de latence qui intervient lorsque le compteur du DMA - arrive à zéro et que le DMA arrête le - transfert jusqu'à ce qu'il soit reprogrammé.</para> - </listitem> - </varlistentry> - </variablelist> - </sect2> - - <sect2> - <title>Programmation du DMA</title> - - <para>Le canal DMA qui va être programmé doit toujours - être “masqué” avant de le paramétrer. - Cela parce que le matériel pourrait inopinément activer - le signal DRQ pour ce canal avant que tous les paramètres n'aient - été chargés ou mis à jour.</para> - - <para>Une fois masqué, le processeur doit préciser le sens - du transfert (de la mémoire vers le périphérique - ou du périphérique vers la mémoire), le mode - d'opération du DMA (Simple, Bloc, A la Demande, Cascade, etc.) - qui sera utilisé pour le transfert et, pour finir, l'adresse et - le volume de données à transférer. La - quantité de données à indiquer est - inférieure d'un octet à celle que vous voulez que le DMA - transfère. Le LSB (octet bas) et le MSB (octet haut) de l'adresse - et de la quantité sont écrites sur le même port - d'entrée/sortie 8 bits, il y a donc un autre - port sur lequel il faut écrire d'abord pour s'assurer que le - DMA comprenne le premier octet comme le LSB et le second comme le MSB - de la quantité et de l'adresse.</para> - - <para>Enfin, il faut mettre à jour le registre de page, qui est - externe au DMA et est accessible via un autre jeu de ports - d'entrée/sortie.</para> - - <para>Une fois que toutes ces valeurs sont définies, le canal DMA - peut être démasqué. Le canal DMA en question est - maintenant considéré “armé”, et - répondra quand la ligne DRQ correspondante sera - activée.</para> - - <para>Reportez-vous à un manuel documentant le matériel - pour connaître les détails de la programmation du 8237. - Vous aurez aussi besoin de la carte des ports d'entré/sortie des - systèmes PC, qui donne les adresses des ports du DMA et du - registre de page. Vous trouverez ci-dessous une table donnant une - description complète de ces ports.</para> - </sect2> - - <sect2> - <title>Ports DMA</title> - - <para>Les contrôleurs DMA sont situés sur les mêmes - ports d'entrée/sortie sur tous les systèmes de type IBM-PC - et PC/AT. La table ci-dessous en donne la liste complète. Les - ports affectés au deuxième contrôleur DMA ne sont - pas définis sur les systèmes non-AT.</para> - - <sect3> - <title>0x00–0x0f Contrôleur numéro 1 (Canaux 0, 1, 2 - et 3)</title> - - <para>Registres d'adresse et compteur DMA</para> - - <informaltable frame="none"> - <tgroup cols="3"> - <tbody> - <row> - <entry>0x00</entry> - <entry>écriture</entry> - <entry>Adresse initiale Canal 0</entry> - </row> - - <row> - <entry>0x00</entry> - <entry>lecture</entry> - <entry>Adresse courante Canal 0</entry> - </row> - - <row> - <entry>0x01</entry> - <entry>écriture</entry> - <entry>Compteur initial Canal 0</entry> - </row> - - <row> - <entry>0x01</entry> - <entry>lecture</entry> - <entry>Compteur courant Canal 0</entry> - </row> - - <row> - <entry>0x02</entry> - <entry>écriture</entry> - <entry>Adresse initiale Canal 1</entry> - </row> - - <row> - <entry>0x02</entry> - <entry>lecture</entry> - <entry>Adresse courante Canal 1</entry> - </row> - - <row> - <entry>0x03</entry> - <entry>écriture</entry> - <entry>Compteur initial Canal 1</entry> - </row> - - <row> - <entry>0x03</entry> - <entry>lecture</entry> - <entry>Compteur courant Canal 1</entry> - </row> - - <row> - <entry>0x04</entry> - <entry>écriture</entry> - <entry>Adresse initiale Canal 2</entry> - </row> - - <row> - <entry>0x04</entry> - <entry>lecture</entry> - <entry>Adresse courante Canal 2</entry> - </row> - - <row> - <entry>0x05</entry> - <entry>écriture</entry> - <entry>Compteur initial Canal 2</entry> - </row> - - <row> - <entry>0x05</entry> - <entry>lecture</entry> - <entry>Compteur courant Canal 2</entry> - </row> - - <row> - <entry>0x06</entry> - <entry>écriture</entry> - <entry>Adresse initiale Canal 3</entry> - </row> - - <row> - <entry>0x06</entry> - <entry>lecture</entry> - <entry>Adresse courante Canal 3</entry> - </row> - - <row> - <entry>0x07</entry> - <entry>écriture</entry> - <entry>Compteur initial Canal 3</entry> - </row> - - <row> - <entry>0x07</entry> - <entry>lecture</entry> - <entry>Compteur courant Canal 3</entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Registres de commande du DMA</para> - - <informaltable frame="none"> - <tgroup cols="3"> - <tbody> - <row> - <entry>0x08</entry> - <entry>écriture</entry> - <entry>Registre de commande</entry> - </row> - - <row> - <entry>0x08</entry> - <entry>lecture</entry> - <entry>Registre d'état</entry> - </row> - - <row> - <entry>0x09</entry> - <entry>écriture</entry> - <entry>Registre de requête</entry> - </row> - - <row> - <entry>0x09</entry> - <entry>lecture</entry> - <entry>-</entry> - </row> - - <row> - <entry>0x0a</entry> - <entry>écriture</entry> - <entry>Registre de masque de bit</entry> - </row> - - <row> - <entry>0x0a</entry> - <entry>lecture</entry> - <entry>-</entry> - </row> - - <row> - <entry>0x0b</entry> - <entry>écriture</entry> - <entry>Registre de mode</entry> - </row> - - <row> - <entry>0x0b</entry> - <entry>lecture</entry> - <entry>-</entry> - </row> - - <row> - <entry>0x0c</entry> - <entry>écriture</entry> - <entry>Remise à zéro du LSB/MSB de la - bascule</entry> - </row> - - <row> - <entry>0x0c</entry> - <entry>lecture</entry> - <entry>-</entry> - </row> - - <row> - <entry>0x0d</entry> - <entry>écriture</entry> - <entry>Remise à zéro/réinitialisation - maître</entry> - </row> - - <row> - <entry>0x0d</entry> - <entry>lecture</entry> - <entry>Registre temporaire (non disponible sur les versions - récentes)</entry> - </row> - - <row> - <entry>0x0e</entry> - <entry>écriture</entry> - <entry>Registre de remise à zéro du masque</entry> - </row> - - <row> - <entry>0x0e</entry> - <entry>lecture</entry> - <entry>-</entry> - </row> - - <row> - <entry>0x0f</entry> - <entry>écriture</entry> - <entry>Registre d'écriture de tous les bits du - masque</entry> - </row> - - <row> - <entry>0x0f</entry> - <entry>lecture</entry> - <entry>Registre de lecture de tous les bits du masque (Intel - 82374 uniquement)</entry> - </row> - </tbody> - </tgroup> - </informaltable> - </sect3> - - <sect3> - <title>0xc0–0xdf Contrôleur numéro 2 (Canaux 4, 5, 6 - et 7)</title> - - <para>Registres d'adresse et compteur DMA</para> - - <informaltable frame="none"> - <tgroup cols="3"> - <tbody> - <row> - <entry>0xc0</entry> - <entry>ériture</entry> - <entry>Adresse initiale Canal 4</entry> - </row> - - <row> - <entry>0xc0</entry> - <entry>lecture</entry> - <entry>Adresse courante Canal 4</entry> - </row> - - <row> - <entry>0xc2</entry> - <entry>écriture</entry> - <entry>Compteur initial Canal 4</entry> - </row> - - <row> - <entry>0xc2</entry> - <entry>lecture</entry> - <entry>Compteur courant Canal 4</entry> - </row> - - <row> - <entry>0xc4</entry> - <entry>écriture</entry> - <entry>Adresse initiale Canal 5</entry> - </row> - - <row> - <entry>0xc4</entry> - <entry>lecture</entry> - <entry>Adresse courante Canal 5</entry> - </row> - - <row> - <entry>0xc6</entry> - <entry>écriture</entry> - <entry>Compteur initial Canal 5</entry> - </row> - - <row> - <entry>0xc6</entry> - <entry>lecture</entry> - <entry>Compteur courant Canal 5</entry> - </row> - - <row> - <entry>0xc8</entry> - <entry>écriture</entry> - <entry>Adresse initiale Canal 6</entry> - </row> - - <row> - <entry>0xc8</entry> - <entry>lecture</entry> - <entry>Adresse courante Canal 6</entry> - </row> - - <row> - <entry>0xca</entry> - <entry>écriture</entry> - <entry>Compteur initial Canal 6</entry> - </row> - - <row> - <entry>0xca</entry> - <entry>lecture</entry> - <entry>Compteur courant Canal 6</entry> - </row> - - <row> - <entry>0xcc</entry> - <entry>écriture</entry> - <entry>Adresse initiale Canal 7</entry> - </row> - - <row> - <entry>0xcc</entry> - <entry>lecture</entry> - <entry>Adresse courante Canal 7</entry> - </row> - - <row> - <entry>0xce</entry> - <entry>écriture</entry> - <entry>Compteur initial Canal 7</entry> - </row> - - <row> - <entry>0xce</entry> - <entry>lecture</entry> - <entry>Compteur courant Canal 7</entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Registres de commande du DMA</para> - - <informaltable frame="none"> - <tgroup cols="3"> - <tbody> - <row> - <entry>0xd0</entry> - <entry>écriture</entry> - <entry>Registre de commande</entry> - </row> - - <row> - <entry>0xd0</entry> - <entry>lecture</entry> - <entry>Registre d'état</entry> - </row> - - <row> - <entry>0xd2</entry> - <entry>écriture</entry> - <entry>Registre de requête</entry> - </row> - - <row> - <entry>0xd2</entry> - <entry>lecture</entry> - <entry>-</entry> - </row> - - <row> - <entry>0xd4</entry> - <entry>écriture</entry> - <entry>Registre de masque de bit</entry> - </row> - - <row> - <entry>0xd4</entry> - <entry>lecture</entry> - <entry>-</entry> - </row> - - <row> - <entry>0xd6</entry> - <entry>écriture</entry> - <entry>Registre de mode</entry> - </row> - - <row> - <entry>0xd6</entry> - <entry>lecture</entry> - <entry>-</entry> - </row> - - <row> - <entry>0xd8</entry> - <entry>écriture</entry> - <entry>Remise à zéro du LSB/MSB de la - bascule</entry> - </row> - - <row> - <entry>0xd8</entry> - <entry>lecture</entry> - <entry>-</entry> - </row> - - <row> - <entry>0xda</entry> - <entry>écriture</entry> - <entry>Remise à zéro/réinitialisation - maître</entry> - </row> - - <row> - <entry>0xda</entry> - <entry>lecture</entry> - <entry>Registre temporaire (non disponible sur l'Intel - 82374)</entry> - </row> - - <row> - <entry>0xdc</entry> - <entry>écriture</entry> - <entry>Registre de remise à zéro du masque</entry> - </row> - - <row> - <entry>0xdc</entry> - <entry>lecture</entry> - <entry>-</entry> - </row> - - <row> - <entry>0xde</entry> - <entry>écriture</entry> - <entry>Registre d'écriture de tous les bits du - masque</entry> - </row> - - <row> - <entry>0xdf</entry> - <entry>lecture</entry> - <entry>Registre de lecture de tous les bits du masque (Intel - 82374 uniquement)</entry> - </row> - </tbody> - </tgroup> - </informaltable> - </sect3> - - <sect3> - <title>0x80–0x9f Registres de page du DMA</title> - - <informaltable frame="none"> - <tgroup cols="3"> - <tbody> - <row> - <entry>0x87</entry> - <entry>lecture/écriture</entry> - <entry>Canal 0 octet bas (23-16) du registre de page</entry> - </row> - - <row> - <entry>0x83</entry> - <entry>lecture/écriture</entry> - <entry>Canal 1 octet bas (23-16) du registre de page</entry> - </row> - - <row> - <entry>0x81</entry> - <entry>lecture/écriture</entry> - <entry>Canal 2 octet bas (23-16) du registre de page</entry> - </row> - - <row> - <entry>0x82</entry> - <entry>lecture/écriture</entry> - <entry>Canal 3 octet bas (23-16) du registre de page</entry> - </row> - - <row> - <entry>0x8b</entry> - <entry>lecture/écriture</entry> - <entry>Canal 5 octet bas (23-16) du registre de page</entry> - </row> - - <row> - <entry>0x89</entry> - <entry>lecture/écriture</entry> - <entry>Canal 6 octet bas (23-16) du registre de page</entry> - </row> - - <row> - <entry>0x8a</entry> - <entry>lecture/écriture</entry> - <entry>Canal 7 octet bas (23-16) du registre de page</entry> - </row> - - <row> - <entry>0x8f</entry> - <entry>lecture/écriture</entry> - <entry>Octet bas rafraîchissement de page</entry> - </row> - </tbody> - </tgroup> - </informaltable> - </sect3> - - <sect3> - <title>0x400–0x4ff Registres du DMA Etendu 82374</title> - - <para>Le composant système EISA - <foreignphrase>EISA - System Component (ESC)</foreignphrase> - Intel 82374 est - apparu au début de 1996 et comporte un contrôleur DMA - qui fournit un sur-ensemble des fonctionnalités du 8237 en - même temps que d'autres composants périphériques - compatibles PC de base sur une seule puce. Ce composant est - destiné à la fois aux plates-formes EISA et PCI et - offre des fonctionnalités DMA récentes telles que - dispersion/regroupement, tampons en anneau et accès direct - via le DMA à la totalité de l'espace d'adressage sur 32 - bits.</para> - - <para>Lorsque ces possibilités sont utilisées, il faut - aussi fournir le code qui procure les mêmes - fonctionnalités aux ordinateurs compatibles PC des 16 - années précédentes. Pour des raisons de - compatibilité, il faut programmer certains registres du 82374 - <emphasis>après</emphasis> avoir programmé les registres - traditionnels du 8237, pour chaque transfert. Ecrire dans un registre - 8237 traditionnel remet à zéro certains registres - étendus du 82374 de façon à assurer la - rétro-compatibilité du logiciel.</para> - - <informaltable frame="none"> - <tgroup cols="3"> - <tbody> - <row> - <entry>0x401</entry> - <entry>lecture/écriture</entry> - <entry>Canal 0 octet haut (23-16) du compteur de mots</entry> - </row> - - <row> - <entry>0x403</entry> - <entry>lecture/écriture</entry> - <entry>Canal 1 octet haut (23-16) du compteur de mots</entry> - </row> - - <row> - <entry>0x405</entry> - <entry>lecture/écriture</entry> - <entry>Canal 2 octet haut (23-16) du compteur de mots</entry> - </row> - - <row> - <entry>0x407</entry> - <entry>lecture/écriture</entry> - <entry>Canal 3 octet haut (23-16) du compteur de mots</entry> - </row> - - <row> - <entry>0x4c6</entry> - <entry>lecture/écriture</entry> - <entry>Canal 5 octet haut (23-16) du compteur de mots</entry> - </row> - - <row> - <entry>0x4ca</entry> - <entry>lecture/écriture</entry> - <entry>Canal 6 octet haut (23-16) du compteur de mots</entry> - </row> - - <row> - <entry>0x4ce</entry> - <entry>lecture/écriture</entry> - <entry>Canal 7 octet haut (23-16) du compteur de mots</entry> - </row> - - <row> - <entry>0x487</entry> - <entry>lecture/écriture</entry> - <entry>Canal 0 octet haut (23-16) du registre de page</entry> - </row> - - <row> - <entry>0x483</entry> - <entry>lecture/écriture</entry> - <entry>Canal 1 octet haut (23-16) du registre de page</entry> - </row> - - <row> - <entry>0x481</entry> - <entry>lecture/écriture</entry> - <entry>Canal 2 octet haut (23-16) du registre de page</entry> - </row> - - <row> - <entry>0x482</entry> - <entry>lecture/écriture</entry> - <entry>Canal 3 octet haut (23-16) du registre de page</entry> - </row> - - <row> - <entry>0x48b</entry> - <entry>lecture/écriture</entry> - <entry>Canal 5 octet haut (23-16) du registre de page</entry> - </row> - - <row> - <entry>0x489</entry> - <entry>lecture/écriture</entry> - <entry>Canal 6 octet haut (23-16) du registre de page</entry> - </row> - - <row> - <entry>0x48a</entry> - <entry>lecture/écriture</entry> - <entry>Canal 7 octet haut (23-16) du registre de page</entry> - </row> - - <row> - <entry>0x48f</entry> - <entry>lecture/écriture</entry> - <entry>Octet haut rafraîchissement de page</entry> - </row> - - <row> - <entry>0x4e0</entry> - <entry>lecture/écriture</entry> - <entry>Canal 0 registre Stop (bits 7-2)</entry> - </row> - - <row> - <entry>0x4e1</entry> - <entry>lecture/écriture</entry> - <entry>Canal 0 registre Stop (bits 15-8)</entry> - </row> - - <row> - <entry>0x4e2</entry> - <entry>lecture/écriture</entry> - <entry>Canal 0 registre Stop (bits 23-16)</entry> - </row> - - <row> - <entry>0x4e4</entry> - <entry>lecture/écriture</entry> - <entry>Canal 1 registre Stop (bits 7-2)</entry> - </row> - - <row> - <entry>0x4e5</entry> - <entry>lecture/écriture</entry> - <entry>Canal 1 registre Stop (bits 15-8)</entry> - </row> - - <row> - <entry>0x4e6</entry> - <entry>lecture/écriture</entry> - <entry>Canal 1 registre Stop (bits 23-16)</entry> - </row> - - <row> - <entry>0x4e8</entry> - <entry>lecture/écriture</entry> - <entry>Canal 2 registre Stop (bits 7-2)</entry> - </row> - - <row> - <entry>0x4e9</entry> - <entry>lecture/écriture</entry> - <entry>Canal 2 registre Stop (bits 15-8)</entry> - </row> - - <row> - <entry>0x4ea</entry> - <entry>lecture/écriture</entry> - <entry>Canal 2 registre Stop (bits 23-16)</entry> - </row> - - <row> - <entry>0x4ec</entry> - <entry>lecture/écriture</entry> - <entry>Canal 3 registre Stop (bits 7-2)</entry> - </row> - - <row> - <entry>0x4ed</entry> - <entry>lecture/écriture</entry> - <entry>Canal 3 registre Stop (bits 15-8)</entry> - </row> - - <row> - <entry>0x4ee</entry> - <entry>lecture/écriture</entry> - <entry>Canal 3 registre Stop (bits 23-16)</entry> - </row> - - <row> - <entry>0x4f4</entry> - <entry>lecture/écriture</entry> - <entry>Canal 5 registre Stop (bits 7-2)</entry> - </row> - - <row> - <entry>0x4f5</entry> - <entry>lecture/écriture</entry> - <entry>Canal 5 registre Stop (bits 15-8)</entry> - </row> - - <row> - <entry>0x4f6</entry> - <entry>lecture/écriture</entry> - <entry>Canal 5 registre Stop (bits 23-16)</entry> - </row> - - <row> - <entry>0x4f8</entry> - <entry>lecture/écriture</entry> - <entry>Canal 6 registre Stop (bits 7-2)</entry> - </row> - - <row> - <entry>0x4f9</entry> - <entry>lecture/écriture</entry> - <entry>Canal 6 registre Stop (bits 15-8)</entry> - </row> - - <row> - <entry>0x4fa</entry> - <entry>lecture/écriture</entry> - <entry>Canal 6 registre Stop (bits 23-16)</entry> - </row> - - <row> - <entry>0x4fc</entry> - <entry>lecture/écriture</entry> - <entry>Canal 7 registre Stop (bits 7-2)</entry> - </row> - - <row> - <entry>0x4fd</entry> - <entry>lecture/écriture</entry> - <entry>Canal 7 registre Stop (bits 15-8)</entry> - </row> - - <row> - <entry>0x4fe</entry> - <entry>lecture/écriture</entry> - <entry>Canal 7 registre Stop (bits 23-16)</entry> - </row> - - <row> - <entry>0x40a</entry> - <entry>écriture</entry> - <entry>Canaux 0-3 registre de mode chaînage</entry> - </row> - - <row> - <entry>0x40a</entry> - <entry>lecture</entry> - <entry>Registre d'état d'interruption du canal</entry> - </row> - - <row> - <entry>0x4d4</entry> - <entry>écriture</entry> - <entry>Canaux 4-7 registre de mode chaînage</entry> - </row> - - <row> - <entry>0x4d4</entry> - <entry>lecture</entry> - <entry>Etat du mode chaînage</entry> - </row> - - <row> - <entry>0x40c</entry> - <entry>lecture</entry> - <entry>Registre de contrôle d'expiration du tampon de - chaînage</entry> - </row> - - <row> - <entry>0x410</entry> - <entry>écriture</entry> - <entry>Canal 0 registre de commande - dispersion/regroupement</entry> - </row> - - <row> - <entry>0x411</entry> - <entry>écriture</entry> - <entry>Canal 1 registre de commande - dispersion/regroupement</entry> - </row> - - <row> - <entry>0x412</entry> - <entry>écriture</entry> - <entry>Canal 2 registre de commande - dispersion/regroupement</entry> - </row> - - <row> - <entry>0x413</entry> - <entry>écriture</entry> - <entry>Canal 3 registre de commande - dispersion/regroupement</entry> - </row> - - <row> - <entry>0x415</entry> - <entry>écriture</entry> - <entry>Canal 5 registre de commande - dispersion/regroupement</entry> - </row> - - <row> - <entry>0x416</entry> - <entry>écriture</entry> - <entry>Canal 6 registre de commande - dispersion/regroupement</entry> - </row> - - <row> - <entry>0x417</entry> - <entry>écriture</entry> - <entry>Canal 7 registre de commande - dispersion/regroupement</entry> - </row> - - <row> - <entry>0x418</entry> - <entry>lecture</entry> - <entry>Canal 0 registre d'état - dispersion/regroupement</entry> - </row> - - <row> - <entry>0x419</entry> - <entry>lecture</entry> - <entry>Canal 1 registre d'état - dispersion/regroupement</entry> - </row> - - <row> - <entry>0x41a</entry> - <entry>lecture</entry> - <entry>Canal 2 registre d'état - dispersion/regroupement</entry> - </row> - - <row> - <entry>0x41b</entry> - <entry>lecture</entry> - <entry>Canal 3 registre d'état - dispersion/regroupement</entry> - </row> - - <row> - <entry>0x41d</entry> - <entry>lecture</entry> - <entry>Canal 5 registre d'état - dispersion/regroupement</entry> - </row> - - <row> - <entry>0x41e</entry> - <entry>lecture</entry> - <entry>Canal 6 registre d'état - dispersion/regroupement</entry> - </row> - - <row> - <entry>0x41f</entry> - <entry>lecture</entry> - <entry>Canal 7 registre d'état - dispersion/regroupement</entry> - </row> - - <row> - <entry>0x420-0x423</entry> - <entry>lecture/écriture</entry> - <entry>Canal 0 registre de pointeur sur le table de descripteurs - dispersion/regroupement</entry> - </row> - - <row> - <entry>0x424-0x427</entry> - <entry>lecture/écriture</entry> - <entry>Canal 1 registre de pointeur sur le table de descripteurs - dispersion/regroupement</entry> - </row> - - <row> - <entry>0x428-0x42b</entry> - <entry>lecture/écriture</entry> - <entry>Canal 2 registre de pointeur sur le table de descripteurs - dispersion/regroupement</entry> - </row> - - <row> - <entry>0x42c-0x42f</entry> - <entry>lecture/écriture</entry> - <entry>Canal 3 registre de pointeur sur le table de descripteurs - dispersion/regroupement</entry> - </row> - - <row> - <entry>0x434-0x437</entry> - <entry>lecture/écriture</entry> - <entry>Canal 5 registre de pointeur sur le table de descripteurs - dispersion/regroupement</entry> - </row> - - <row> - <entry>0x438-0x43b</entry> - <entry>lecture/écriture</entry> - <entry>Canal 6 registre de pointeur sur le table de descripteurs - dispersion/regroupement</entry> - </row> - - <row> - <entry>0x43c-0x43f</entry> - <entry>lecture/écriture</entry> - <entry>Canal 7 registre de pointeur sur le table de descripteurs - dispersion/regroupement</entry> - </row> - </tbody> - </tgroup> - </informaltable> - </sect3> - </sect2> - </sect1> - - <sect1 id="internals-vm"> - <title>La gestion de mémoire virtuelle de FreeBSD</title> - - <para><emphasis>Contribution de &a.dillon;. 6 Février - 1999</emphasis></para> - - <sect2> - <title>Gestion de la mémoire - physique—<literal>vm_page_t</literal></title> - - <para>La mémoire physique est gérée page par page - via la structure <literal>vm_page_t</literal>. Les pages de - mémoire physique sont caractérisées par - l'emplacement de leurs structures <literal>vm_page_t</literal> - respectives dans l'une des queues de pagination.</para> - - <para>Une page peut être verrouillée, active, inactive, dans - le cache ou libre. Sauf lorsqu'elle est verrouillée, la page est - typiquement placée dans une queue représentée par - une liste à double chaînage décrivant l'état - dans lequel elle est. Les pages verrouillées n'appartiennent - à aucune queue.</para> - - <para>FreeBSD implément système de queues de pagination plus - sophistiqué pour les pages libres ou dans le cache, de - façon à mettre en oeuvre un algorithme de coloration des - pages. Chacun de ces états (libre, caché) met en oeuvre - des files d'attente multiples selon la taille des caches L1 et L2 du - processeur. Quand il faut allouer une nouvelle page, FreeBSD essaie d'en - obtenir une qui soit raisonnablement alignée du point de vue des - caches L1 et L2 selon le type d'objet en mémoire virtuelle pour - lequel la page est allouée.</para> - - <para>De plus, une page peut être retenue par un compteur - de référence, ou bloquée avec un compteur - d'utilisation. Le système de mémoire virtuelle - implémente aussi un état “verrouillage - ultime” lorsque la page utilise le bit PG_BUSY des drapeaux de - page.</para> - - <para>En termes généraux, chacune des queues de pagination - opère en mode LRU (moins récemment utilisé). Une - page est habituellement initialement placée dans l'état - actif ou verrouillé. Lorsqu'elle est verrouillée, la page - est normalement associée à une table de pages quelque - part. Le système de mémoire virtuelle - “viellit” les pages en parcourant les pages d'une queue de - pagination plus active de façon à les déplacer vers - une queue moins active. Les pages qui sont déplacées vers - le cache sont toujours associées à un objet en - mémoire virtuelle mais sont candidates à une - réutilisation immédiate. Les pages dans la queue libre - sont vraiment disponibles. FreeBSD essaie de minimiser le nombre de - pages dans la queue libre, mais il faut conserver un certain nombre de - pages réellement disponibles pour pouvoir gérer - l'allocation de pages lors d'interruptions.</para> - - <para>Si un processus essaie d'accéder à une page qui - n'existe pas dans sa table de pages mais existe dans une des queues de - pagination (la queue inactive ou celle du cache par exemple), il se - produit un défaut relativement peu pénalisant de - réactivation de page, qui fait que la page est - réactivée. Si la page n'existe nulle part en - mémoire, le processus doit attendre que la page soit - récupérée sur disque.</para> - - <para>FreeBSD optimise dynamiquement ses queues de pagination et essaie de - maintenir un ratio raisonnable entre les différentes queues de - même qu'entre les pages à jour et celles qui ne le sont - pas. Ce rééquilibrage est mis en oeuvre par le - démon de pagination et comprend le nettoyage des pages - dégradées (leur synchronisation avec la version en - arrière-plan), la surveillance des pages - référencées par des tâches actives (leur - repositionnement dans les queues LRU ou leur déplacement d'une - queue à une autre), la migration de pages entre queues lorsque - les queues sont déséquilibrées, et ainsi de suite. - Le système de mémoire virtuelle de FreeBSD accepte un - nombre raisonnable de défauts de réactivation de page afin - de savoir à quel point une page est active ou inactive. Cela - permet de prendre de meilleures décisions pour savoir quand - mettre à jour ou décharger une page sur disque.</para> - </sect2> - - <sect2> - <title>Le tampon cache - unifié—<literal>vm_object_t</literal></title> - - <para>FreeBSD implémente la notion d'“objet en mémoire - virtuelle” générique. Les objets en mémoire - virtuelle peuvent être associés à différents - types de mise en arrière-plan—non sauvegardé, - sauvegardé sur disque (<foreignphrase>swap</foreignphrase>), - sauvegardé sur un périphérique physique, ou - sauvegardé dans un fichier. Comme le système de fichiers - utilise les mêmes objets en mémoire virtuelle pour - gérer les informations de base relatives aux fichiers, le - résultat est un tampon cache unifié.</para> - - <para>Les objets en mémoire virtuelle peuvent être des objets - <emphasis>ombre - <foreignphrase>shadowed</foreignphrase></emphasis>, - c'est-à-dire qu'ils peuvent être empilés les uns au - dessus des autres. Par exemple, il peut y avoir un objet ombre - sauvegardé dans l'espace de <foreignphrase>swap</foreignphrase> - empilé sur un objet sauvegardé dans un fichier pour - implémenter une correspondance - <citerefentry><refentrytitle>mmap</refentrytitle> - <manvolnum>2</manvolnum></citerefentry> de type - <literal>MAP_PRIVATE</literal>. Ce type d'empilement est aussi - utilisé pour implémenter différents types de - partage, dont la copie sur écriture pour les espaces d'adressage - de processus fils (créés par - <citerefentry><refentrytitle>fork</refentrytitle> <manvolnum>2</manvolnum></citerefentry>.</para> - - <para>Il faut noter qu'un <literal>vm_page_t</literal> ne peut être - associé qu'à un seul objet en mémoire virtuelle - à la fois. Les objets ombre en mémoire - virtuelle implémentent le partage apparent de la même page - pour des instances multiples.</para> - </sect2> - - <sect2> - <title>Entrée/sortie sur le système de - fichiers—<literal>struct buf</literal></title> - - <para>Les objets en mémoire virtuelle sauvegardés via le - système de “vnodes”, tels que les objets - sauvegardés dans des fichiers, doivent généralement - maintenir eux-mêmes leurs informations d'état à - jour/périmé, indépendamment de l'idée que - s'en fait le système de mémoire virtuelle. Par exemple, - quand le système de mémoire virtuelle décide de - synchroniser une page physique avec sa version en arrière-plan, - il doit indiquer que la page est à jour avant qu'elle ne soit - effectivement écrite en arrière-plan. De plus, les - systèmes de fichiers doivent être capables de faire - correspondre des parties d'un fichier ou de méta-informations - sur un fichier avec l'interface entre la mémoire virtuelle et le - noyau, pour pouvoir travailler sur ces informations.</para> - - <para>Les entités qui servent à gérer cela sont - appelées tampons du système de fichiers, - <literal>struct buf</literal>s, ou encore <literal>bp</literal>s. Quand - un système de fichiers doit opérer sur une partie d'un - objet en mémoire virtuelle, il fait typiquement correspondre - une partie de l'objet à un <literal>struct buf</literal> puis - les pages du <literal>struct buf</literal> à l'interface entre - la mémoire virtuelle et le noyau. De même, les - entrées/sorties disque sont typiquement gérées en - faisant correspondre des parties des objets et des structures tampon - et en effectuent les entrées/sorties sur ces structures. Les - <literal>vm_page_t</literal>s sous-jacentes sont habituellement - monopolisées le temps des entrées/sorties. Les tampons du - système de fichiers ont leur propre notion d'occupation, ce qui - est utile pour le code des pilotes du système de fichiers, qui - travaille plutôt sur ces tampons que directement sur les pages de - la mémoire virtuelle.</para> - - <para>FreeBSD réserve une quantité limitée de - l'interface mémoire virtuelle du noyau pour les correspondances - avec les <literal>struct buf</literal>s, mais il faut garder à - l'esprit que cet espace n'est utilisé que pour stocker les - correspondances et que cela ne diminue pas les possibilités de - mettre des données dans un cache. Le cache physique de - données est une fonction des <literal>vm_page_t</literal>s, et - non des tampons du système de fichiers. Cependant, comme les - tampons du système de fichiers sont utilisés pour les - entrées/sorties, ils limitent de fait le nombre - d'entrées/sorties possibles simultanément. Comme il y a - habituellement quelques milliers de tampons de système de - fichiers disponibles, ce n'est généralement pas un - problème.</para> - </sect2> - - <sect2> - <title>Tables de correspondance des - pages—<literal>vm_map_t</literal>, - <literal>vm_entry_t</literal></title> - - <para>FreeBSD dissocie l'organisation des tables de pages physiques du - système de mémoire virtuelle. Toutes les tables en dur de - pages par processus peuvent être reconstruites à la - volée et sont généralement - considérées comme jetables. Des tables de pages - particulières, comme celles qui gèrent l'interface entre - la mémoire virtuelle et le noyau, sont allouées de - façon permanente. Ces pages ne sont pas considérées - comme jetables.</para> - - <para>FreeBSD associe des parties des <literal>vm_object</literal>s - à des plages d'adresses via les structures - <literal>vm_map_t</literal> et <literal>vm_entry_t</literal>. Les tables - de pages sont construites synthétiquement à partir de la - hiérarchie - <literal>vm_map_t</literal>/<literal>vm_entry_t</literal>/<literal>vm_object_t</literal>. - Rappelez-vous que j'ai dit que les pages physiques n'étaient - directement associées qu'à un - <literal>vm_object</literal>. Ce n'est en fait pas tout-à-fait - vrai. Les <literal>vm_page_t</literal>s sont aussi liés aux - tables de pages auxquelles ils sont activement associés. - Un <literal>vm_page_t</literal> peut être lié à - plusieurs <emphasis>pmaps</emphasis>, nom que l'on donne aux tables de - pages. Cependant, l'association hiérarchique fait que toutes les - références du même objet à la même page - se rapportent à la même <literal>vm_page_t</literal> de - sorte que le tampon cache est globalement unifié.</para> - </sect2> - - <sect2> - <title>Organisation mémoire de l'interface mémoire virtuelle - du noyau - <foreignphrase>KVM</foreignphrase></title> - - <para>FreeBSD utilise l'interface mémoire virtuelle du noyau pour - stocker différentes structures de données du noyau. - L'unique plus grosse entité de cette interface est le tampon - de cache du système de fichiers. C'est-à-dire, les - correspondances se rapportant aux <literal>struct buf</literal>s.</para> - - <para>Au contraire de Linux, FreeBSD ne fait <emphasis>pas</emphasis> - correspondre toute la mémoire physique avec l'interface de - mémoire virtuelle. Ce qui signifie que FreeBSD peut gérer - des configurations ayant jusqu'à 4 Go de mémoire sur les - plates-formes 32 bits. En fait, si l'unité de gestion de la - mémoire - <foreignphrase>Memory Management Unit - (MMU)</foreignphrase> en était capable, FreeBSD pourrait - théoriquement gérer jusqu'à 8 To sur une - plate-forme 32 bits. Nénmoins, comme la plupart des plates-formes - 32 bits ne peuvent pas recevoir plus de 4 Go, c'est un sujet de - controverse.</para> - - <para>L'interface de mémoire virtuelle du noyau est - gérée par différents mécanismes. Le - mécanisme principal de gestion de cette interface est - l'allocateur de zone - <emphasis>zone allocator</emphasis>. - L'allocateur de zone prend une portion de l'interface de - mémoire virtuelle et la découpe en blocs de - mémoire de même taille pour y allouer un type - particulier de structure. Vous pouvez utiliser la commande - <command>vmstat -m</command> pour avoir une vue d'ensemble de - l'utilisation actuelle de l'interface entre le noyau et la - mémoire virtuelle zone par zone.</para> - </sect2> - - <sect2> - <title>Optimisation du système de gestion de mémoire - virtuelle de FreeBSD</title> - - <para>Il a été fourni un effort concerté pour que le - noyau de FreeBSD optimise lui-même dynamiquement son - fonctionnement. Vous n'avez normalement pas à vous casser la - tête avec les options <literal>maxusers</literal> et - <literal>NMBCLUSTERS</literal> de configuration du noyau, options de - compilation habituellement définies dans - <filename>/usr/src/sys/i386/conf/<replaceable>FICHIER_DE_CONFIGURATION</replaceable></filename>. - On trouve une description de toutes les options de configuration du - noyau dans <filename>/usr/src/sys/i386/conf/LINT</filename>.</para> - - <para>Lors de la configuration d'un gros système, vous pouvez - vouloir augmenter <literal>maxusers</literal>. Ses valeurs sont - généralement comprises entre 10 et 128. Remarquez que - donner une valeur trop importante à - <literal>maxusers</literal> peut provoquer un débordement de - l'interface de mémoire virtuelle disponible, entraînant des - résultats imprévisibles. Il vaut mieux donner à - <literal>maxusers</literal> une valeur raisonnable et ajouter d'autres - options, telles que <literal>NMBCLUSTERS</literal>, pour augmenter des - ressources précises.</para> - - <para>Si votre système va faire beaucoup appel au réseau, - vous pouvez augmenter <literal>NMBCLUSTERS</literal>. Les valeurs - usuelles sont comprises entre 1024 et 4096.</para> - - <para>Le paramètre <literal>NBUF</literal> est aussi - traditionnellement utilisé pour dimensionner le système. - Ce paramètre définit la taille de l'interface de - mémoire virtuelle du noyau disponible pour les correspondances - avec les tampons d'entrée/sortie du système de fichiers. - Notez bien que ce paramètre n'a rien à voir avec le - tampon cache unifié ! Ce paramètre est - optimisé dynamiquement par le noyau - <literal>3.0-current</literal> et les noyaux ultérieurs et n'a - normalement pas besoin d'être ajusté à la main. - Nous recommandons de ne <emphasis>pas</emphasis> essayer de fixer le - paramètre <literal>NBUF</literal>. Laissez le système - s'en charger. Une valeur trop faible peut rendre le système de - fichiers largement inefficace et une valeur trop grande saturer les - queues de pages en entraînant le verrouillage d'un trop grand - nombre de pages.</para> - - <para>Par défaut, les noyaux FreeBSD ne sont pas optimisés. - Vous pouvez positionner les indicateurs d'optimisation et de - déboguage avec les directives <literal>makeoptions</literal> de - configuration du noyau. Remarquez que vous ne devriez pas utiliser - l'option <option>-g</option> à moins que vous ne puissiez vous - accommoder des noyaux de taille importante (habituellement plus de 7 Mo) - qui en résultent.</para> - - <programlisting> -makeoptions DEBUG="-g" -makeoptions COPTFLAGS="-O2 -pipe" - </programlisting> - - <para><command>sysctl</command> fournit un moyen d'optimiser le noyau en - temps réel. Vous n'avez habituellement pas à vous - préoccuper des variables de <command>sysctl</command>, et en - particulier pas de celles qui concernent la mémoire - virtuelle.</para> - - <para>L'optimisation de la gestion de mémoire virtuelle et du - système d'exécution est relativement simple. Tout - d'abord, utilisez “les mises à jour - logicielles” - <foreignphrase>softupdates</foreignphrase> - sur - vos systèmes de fichiers UFS/FFS chaque fois que c'est possible. - Le fichier - <filename>/usr/src/contrib/sys/softupdates/README</filename> donne - les indications (et les restrictions) sur la façon de les - configurer.</para> - - <para>En second lieu, prévoyez suffisamment d'espace de pagination. - Vous devriez avoir une partition de pagination sur chaque disque - physique, jusqu'à quatre, même sur vos disques “de - travail”. Il doit y avoir au moins deux fois autant d'espace de - pagination que de mémoire, et éventuellement même - plus si vous n'avez pas beaucoup de mémoire. Vous devriez aussi - dimensionner votre partition de pagination en fonction de la - quantité maximale de mémoire que vous comptez installer - sur votre système pour ne pas avoir à repartitionner vos - disques par la suite. Si vous voulez pouvoir garder une trace en cas - de plantage - <foreignphrase>crash - dump</foreignphrase> - votre première partition de - pagination doit être au moins de la taille de la mémoire et - <filename>/var/crash</filename> doit disposer de suffisamment de place - libre pour recevoir la trace.</para> - - <para>Il est tout à fait admissible de paginer via NFS à - partir des systèmes <literal>-4.x</literal> et ultérieurs, - mais il faut être conscient que le serveur NFS supportera le plus - fort de la charge de pagination.</para> - </sect2> - </sect1> -</chapter> - -<!-- - Local Variables: - mode: sgml - sgml-declaration: "../chapter.decl" - sgml-indent-data: t - sgml-omittag: nil - sgml-always-quote-attributes: t - sgml-parent-document: ("../handbook.sgml" "part" "chapter") - End: ---> |