This is an archive of past FreeBSD releases; it's part of the FreeBSD Documentation Archive.
Copyright © 1995,1997 Frank Durda IV <uhclem@FreeBSD.org>, Tous Droits Réservés. 10 Décembre 1996. Dernière mise à jour le 8 Octobre 1997.
L'accès direct à la mémoire - Direct Memory Access (DMA) - 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 (CPU).
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 (PC), sur l'IBM PC/AT, ses successeurs et ses différents clones.
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.
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.
Il y a deux signaux électriques par canal sur le 8237, appelés DRQ (Data Request) et -DACK (Data Acknowledge). Il y a des signaux supplémentaires dont les noms sont HRQ (Hold Request), HLDA (Hold Ackwnoledge), -EOP (End Of Process) et des signaux de contrôle du bus -MEMR (Memory Read), -MEMW (Memory Write), -IOR (I/O Read) et IOW (I/O Write).
Le contrôleur DMA 8237 est un contrôleur ``fly-by'' - 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.
Note : Le 8237 autorise l'interconnexion de deux de ses canaux pour permettre les opérations DMA de mémoire à mémoire, en mode non-``fly-by'', 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.
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.
Voici un exemple des étapes successives qui provoquent et effectuent un transfert DMA. Dans cet exemple, le contrôleur du lecteur de disquette - floppy disk controller (FDC) - vient de lire un octet sur la disquette et demande au DMA de le ranger à l'adresse mémoire 0x00123456. 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.
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.
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.
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 - ``pipeline''.
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 0x3456, adresse qui sera utilisée pour diriger l'octet qui va être transféré vers une adresse mémoire donnée.
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.
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é.
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.
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.
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.
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é.
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'' - Terminal Count (TC). 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.
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.
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é.
Vous avez peut-être déjà remarqué qu'au lieu de prendre pour adresse la valeur 0x00123456, le DMA utilise la valeur 0x3456. Cela mérite quelques explications.
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''.
Dans notre exemple précédent donc, le DMA mettrait la partie 0x3456 de l'adresse sur le bus et le registre de page du canal DMA 2 mettrait la partie 0x0012xxxx sur le bus. Ensemble, ces deux valeurs constituent l'adresse mémoire complète de l'accès.
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 0xffff, après transfert, le DMA incrémente le registre d'adresse et accède à l'octet d'adresse suivante 0x0000 et non 0x10000. Ce n'est probablement pas le résultat attendu.
Note : 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 OU logique avec l'adresse basse.
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.
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.
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'' - Bounce Buffers. Dans le monde MS-DOS, ils sont parfois appelés ``tampons intelligents'' - Smart Buffers.
Note : 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.
Le DMA 8237 peut opérer selon différents modes. Les principaux sont :
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.
Le contrôleur de disquette standard des compatibles PC (NEC 765) n'a qu'un tampon d'un octet. Il utilise donc ce mode.
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.
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.
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.
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'' - Bus Mastering.
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.
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.
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.
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.
Note : 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.
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.
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 1 ou déchargés pour représenter un 0. Comme tous les condensateurs fuient, il faut les recharger à intervalles réguliers pour conserver les valeurs 1. 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.
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.
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.
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.
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é.
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.
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.
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.
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.
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.
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.
Registres d'adresse et compteur DMA
| 0x00 | écriture | Adresse initiale Canal 0 |
| 0x00 | lecture | Adresse courante Canal 0 |
| 0x01 | écriture | Compteur initial Canal 0 |
| 0x01 | lecture | Compteur courant Canal 0 |
| 0x02 | écriture | Adresse initiale Canal 1 |
| 0x02 | lecture | Adresse courante Canal 1 |
| 0x03 | écriture | Compteur initial Canal 1 |
| 0x03 | lecture | Compteur courant Canal 1 |
| 0x04 | écriture | Adresse initiale Canal 2 |
| 0x04 | lecture | Adresse courante Canal 2 |
| 0x05 | écriture | Compteur initial Canal 2 |
| 0x05 | lecture | Compteur courant Canal 2 |
| 0x06 | écriture | Adresse initiale Canal 3 |
| 0x06 | lecture | Adresse courante Canal 3 |
| 0x07 | écriture | Compteur initial Canal 3 |
| 0x07 | lecture | Compteur courant Canal 3 |
Registres de commande du DMA
| 0x08 | écriture | Registre de commande |
| 0x08 | lecture | Registre d'état |
| 0x09 | écriture | Registre de requête |
| 0x09 | lecture | - |
| 0x0a | écriture | Registre de masque de bit |
| 0x0a | lecture | - |
| 0x0b | écriture | Registre de mode |
| 0x0b | lecture | - |
| 0x0c | écriture | Remise à zéro du LSB/MSB de la bascule |
| 0x0c | lecture | - |
| 0x0d | écriture | Remise à zéro/réinitialisation maître |
| 0x0d | lecture | Registre temporaire (non disponible sur les versions récentes) |
| 0x0e | écriture | Registre de remise à zéro du masque |
| 0x0e | lecture | - |
| 0x0f | écriture | Registre d'écriture de tous les bits du masque |
| 0x0f | lecture | Registre de lecture de tous les bits du masque (Intel 82374 uniquement) |
Registres d'adresse et compteur DMA
| 0xc0 | ériture | Adresse initiale Canal 4 |
| 0xc0 | lecture | Adresse courante Canal 4 |
| 0xc2 | écriture | Compteur initial Canal 4 |
| 0xc2 | lecture | Compteur courant Canal 4 |
| 0xc4 | écriture | Adresse initiale Canal 5 |
| 0xc4 | lecture | Adresse courante Canal 5 |
| 0xc6 | écriture | Compteur initial Canal 5 |
| 0xc6 | lecture | Compteur courant Canal 5 |
| 0xc8 | écriture | Adresse initiale Canal 6 |
| 0xc8 | lecture | Adresse courante Canal 6 |
| 0xca | écriture | Compteur initial Canal 6 |
| 0xca | lecture | Compteur courant Canal 6 |
| 0xcc | écriture | Adresse initiale Canal 7 |
| 0xcc | lecture | Adresse courante Canal 7 |
| 0xce | écriture | Compteur initial Canal 7 |
| 0xce | lecture | Compteur courant Canal 7 |
Registres de commande du DMA
| 0xd0 | écriture | Registre de commande |
| 0xd0 | lecture | Registre d'état |
| 0xd2 | écriture | Registre de requête |
| 0xd2 | lecture | - |
| 0xd4 | écriture | Registre de masque de bit |
| 0xd4 | lecture | - |
| 0xd6 | écriture | Registre de mode |
| 0xd6 | lecture | - |
| 0xd8 | écriture | Remise à zéro du LSB/MSB de la bascule |
| 0xd8 | lecture | - |
| 0xda | écriture | Remise à zéro/réinitialisation maître |
| 0xda | lecture | Registre temporaire (non disponible sur l'Intel 82374) |
| 0xdc | écriture | Registre de remise à zéro du masque |
| 0xdc | lecture | - |
| 0xde | écriture | Registre d'écriture de tous les bits du masque |
| 0xdf | lecture | Registre de lecture de tous les bits du masque (Intel 82374 uniquement) |
| 0x87 | lecture/écriture | Canal 0 octet bas (23-16) du registre de page |
| 0x83 | lecture/écriture | Canal 1 octet bas (23-16) du registre de page |
| 0x81 | lecture/écriture | Canal 2 octet bas (23-16) du registre de page |
| 0x82 | lecture/écriture | Canal 3 octet bas (23-16) du registre de page |
| 0x8b | lecture/écriture | Canal 5 octet bas (23-16) du registre de page |
| 0x89 | lecture/écriture | Canal 6 octet bas (23-16) du registre de page |
| 0x8a | lecture/écriture | Canal 7 octet bas (23-16) du registre de page |
| 0x8f | lecture/écriture | Octet bas rafraîchissement de page |
Le composant système EISA - EISA System Component (ESC) - 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.
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 après 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.
| 0x401 | lecture/écriture | Canal 0 octet haut (23-16) du compteur de mots |
| 0x403 | lecture/écriture | Canal 1 octet haut (23-16) du compteur de mots |
| 0x405 | lecture/écriture | Canal 2 octet haut (23-16) du compteur de mots |
| 0x407 | lecture/écriture | Canal 3 octet haut (23-16) du compteur de mots |
| 0x4c6 | lecture/écriture | Canal 5 octet haut (23-16) du compteur de mots |
| 0x4ca | lecture/écriture | Canal 6 octet haut (23-16) du compteur de mots |
| 0x4ce | lecture/écriture | Canal 7 octet haut (23-16) du compteur de mots |
| 0x487 | lecture/écriture | Canal 0 octet haut (23-16) du registre de page |
| 0x483 | lecture/écriture | Canal 1 octet haut (23-16) du registre de page |
| 0x481 | lecture/écriture | Canal 2 octet haut (23-16) du registre de page |
| 0x482 | lecture/écriture | Canal 3 octet haut (23-16) du registre de page |
| 0x48b | lecture/écriture | Canal 5 octet haut (23-16) du registre de page |
| 0x489 | lecture/écriture | Canal 6 octet haut (23-16) du registre de page |
| 0x48a | lecture/écriture | Canal 7 octet haut (23-16) du registre de page |
| 0x48f | lecture/écriture | Octet haut rafraîchissement de page |
| 0x4e0 | lecture/écriture | Canal 0 registre Stop (bits 7-2) |
| 0x4e1 | lecture/écriture | Canal 0 registre Stop (bits 15-8) |
| 0x4e2 | lecture/écriture | Canal 0 registre Stop (bits 23-16) |
| 0x4e4 | lecture/écriture | Canal 1 registre Stop (bits 7-2) |
| 0x4e5 | lecture/écriture | Canal 1 registre Stop (bits 15-8) |
| 0x4e6 | lecture/écriture | Canal 1 registre Stop (bits 23-16) |
| 0x4e8 | lecture/écriture | Canal 2 registre Stop (bits 7-2) |
| 0x4e9 | lecture/écriture | Canal 2 registre Stop (bits 15-8) |
| 0x4ea | lecture/écriture | Canal 2 registre Stop (bits 23-16) |
| 0x4ec | lecture/écriture | Canal 3 registre Stop (bits 7-2) |
| 0x4ed | lecture/écriture | Canal 3 registre Stop (bits 15-8) |
| 0x4ee | lecture/écriture | Canal 3 registre Stop (bits 23-16) |
| 0x4f4 | lecture/écriture | Canal 5 registre Stop (bits 7-2) |
| 0x4f5 | lecture/écriture | Canal 5 registre Stop (bits 15-8) |
| 0x4f6 | lecture/écriture | Canal 5 registre Stop (bits 23-16) |
| 0x4f8 | lecture/écriture | Canal 6 registre Stop (bits 7-2) |
| 0x4f9 | lecture/écriture | Canal 6 registre Stop (bits 15-8) |
| 0x4fa | lecture/écriture | Canal 6 registre Stop (bits 23-16) |
| 0x4fc | lecture/écriture | Canal 7 registre Stop (bits 7-2) |
| 0x4fd | lecture/écriture | Canal 7 registre Stop (bits 15-8) |
| 0x4fe | lecture/écriture | Canal 7 registre Stop (bits 23-16) |
| 0x40a | écriture | Canaux 0-3 registre de mode chaînage |
| 0x40a | lecture | Registre d'état d'interruption du canal |
| 0x4d4 | écriture | Canaux 4-7 registre de mode chaînage |
| 0x4d4 | lecture | Etat du mode chaînage |
| 0x40c | lecture | Registre de contrôle d'expiration du tampon de chaînage |
| 0x410 | écriture | Canal 0 registre de commande dispersion/regroupement |
| 0x411 | écriture | Canal 1 registre de commande dispersion/regroupement |
| 0x412 | écriture | Canal 2 registre de commande dispersion/regroupement |
| 0x413 | écriture | Canal 3 registre de commande dispersion/regroupement |
| 0x415 | écriture | Canal 5 registre de commande dispersion/regroupement |
| 0x416 | écriture | Canal 6 registre de commande dispersion/regroupement |
| 0x417 | écriture | Canal 7 registre de commande dispersion/regroupement |
| 0x418 | lecture | Canal 0 registre d'état dispersion/regroupement |
| 0x419 | lecture | Canal 1 registre d'état dispersion/regroupement |
| 0x41a | lecture | Canal 2 registre d'état dispersion/regroupement |
| 0x41b | lecture | Canal 3 registre d'état dispersion/regroupement |
| 0x41d | lecture | Canal 5 registre d'état dispersion/regroupement |
| 0x41e | lecture | Canal 6 registre d'état dispersion/regroupement |
| 0x41f | lecture | Canal 7 registre d'état dispersion/regroupement |
| 0x420-0x423 | lecture/écriture | Canal 0 registre de pointeur sur le table de descripteurs dispersion/regroupement |
| 0x424-0x427 | lecture/écriture | Canal 1 registre de pointeur sur le table de descripteurs dispersion/regroupement |
| 0x428-0x42b | lecture/écriture | Canal 2 registre de pointeur sur le table de descripteurs dispersion/regroupement |
| 0x42c-0x42f | lecture/écriture | Canal 3 registre de pointeur sur le table de descripteurs dispersion/regroupement |
| 0x434-0x437 | lecture/écriture | Canal 5 registre de pointeur sur le table de descripteurs dispersion/regroupement |
| 0x438-0x43b | lecture/écriture | Canal 6 registre de pointeur sur le table de descripteurs dispersion/regroupement |
| 0x43c-0x43f | lecture/écriture | Canal 7 registre de pointeur sur le table de descripteurs dispersion/regroupement |
| Précédent | Sommaire | Suivant |
| Utilisation de la mémoire du PC | Niveau supérieur | La gestion de mémoire virtuelle de FreeBSD |
Ce document, ainsi que d'autres peut etre téléchargé a ftp.FreeBSD.org/pub/FreeBSD/doc/.
Pour toutes questions a propos de
FreeBSD, lisez la documentation avant de
contacter <questions@FreeBSD.org>.
Pour les questions sur cette documentation, contactez <doc@FreeBSD.org>.