Accès direct à la mémoire - Direct memory access

L'accès direct à la mémoire ( DMA ) est une caractéristique des systèmes informatiques qui permet à certains sous-systèmes matériels d'accéder à la mémoire principale du système ( mémoire vive ) indépendamment de l' unité centrale de traitement (CPU).

Sans DMA, lorsque la CPU utilise une entrée/sortie programmée , elle est généralement entièrement occupée pendant toute la durée de l'opération de lecture ou d'écriture et n'est donc pas disponible pour effectuer d'autres travaux. Avec le DMA, le CPU initie d'abord le transfert, puis il effectue d'autres opérations pendant que le transfert est en cours, et il reçoit enfin une interruption du contrôleur DMA (DMAC) lorsque l'opération est terminée. Cette fonctionnalité est utile à tout moment où le processeur ne peut pas suivre le taux de transfert de données ou lorsque le processeur doit effectuer un travail en attendant un transfert de données d'E/S relativement lent. De nombreux systèmes matériels utilisent DMA, y compris lecteur de disque contrôleurs, cartes graphiques , cartes réseau et les cartes son . Le DMA est également utilisé pour le transfert de données intra-puce dans les processeurs multicœurs . Les ordinateurs dotés de canaux DMA peuvent transférer des données vers et depuis des périphériques avec une surcharge CPU bien inférieure à celle des ordinateurs sans canaux DMA. De même, un élément de traitement à l' intérieur d'un processeur multicœur peut transférer des données vers et depuis sa mémoire locale sans occuper son temps processeur, ce qui permet au calcul et au transfert de données de se dérouler en parallèle.

Le DMA peut également être utilisé pour la copie ou le déplacement « mémoire à mémoire » de données dans la mémoire. Le DMA peut décharger des opérations de mémoire coûteuses, telles que des copies volumineuses ou des opérations de dispersion de données , du processeur vers un moteur DMA dédié. Un exemple de mise en œuvre est la technologie d'accélération d'E/S . Le DMA présente un intérêt pour les architectures informatiques en réseau sur puce et en mémoire .

Des principes

Tierce personne

Carte mère d'un ordinateur NeXTcube (1990). Les deux grands circuits intégrés au- dessous du milieu de l'image sont le contrôleur DMA (l.) et - inhabituel - un contrôleur DMA dédié supplémentaire (r.) pour le disque magnéto-optique utilisé à la place d'un lecteur de disque dur dans la première série de ce modèle informatique.

Le DMA standard, également appelé DMA tiers, utilise un contrôleur DMA. Un contrôleur DMA peut générer des adresses mémoire et initier des cycles de lecture ou d'écriture en mémoire. Il contient plusieurs registres matériels qui peuvent être écrits et lus par la CPU. Ceux-ci comprennent un registre d'adresses mémoire, un registre de comptage d'octets et un ou plusieurs registres de contrôle. Selon les fonctionnalités fournies par le contrôleur DMA, ces registres de contrôle peuvent spécifier une combinaison de la source, de la destination, du sens du transfert (lecture depuis le périphérique d'E/S ou écriture sur le périphérique d'E/S), la taille du unité de transfert, et/ou le nombre d'octets à transférer en une rafale.

Pour effectuer une opération d'entrée, de sortie ou de mémoire à mémoire, le processeur hôte initialise le contrôleur DMA avec un décompte du nombre de mots à transférer et l'adresse mémoire à utiliser. La CPU commande alors au périphérique d'initier un transfert de données. Le contrôleur DMA fournit ensuite des adresses et des lignes de contrôle de lecture/écriture à la mémoire système. Chaque fois qu'un octet de données est prêt à être transféré entre le périphérique et la mémoire, le contrôleur DMA incrémente son registre d'adresse interne jusqu'à ce que le bloc complet de données soit transféré.

Maîtrise des bus

Dans un système de maîtrise de bus , également connu sous le nom de système DMA propriétaire, le CPU et les périphériques peuvent chacun se voir accorder le contrôle du bus mémoire. Lorsqu'un périphérique peut devenir un maître de bus, il peut écrire directement dans la mémoire système sans l'intervention de l'UC, fournissant l'adresse mémoire et les signaux de contrôle selon les besoins. Certaines mesures doivent être prévues pour mettre le processeur en état d'attente afin qu'une contention de bus ne se produise pas.

Modes de fonctionnement

Mode rafale

En mode rafale , un bloc entier de données est transféré dans une séquence contiguë. Une fois que le contrôleur DMA est autorisé à accéder au bus système par la CPU, il transfère tous les octets de données dans le bloc de données avant de libérer le contrôle des bus système vers la CPU, mais rend la CPU inactive pendant des périodes relativement longues. Le mode est également appelé "Mode de transfert de bloc".

Mode vol de cycle

Le mode de vol de cycle est utilisé dans les systèmes dans lesquels le CPU ne doit pas être désactivé pendant la durée nécessaire aux modes de transfert en rafale. En mode vol de cycle, le contrôleur DMA obtient l'accès au bus système de la même manière qu'en mode rafale, en utilisant les signaux BR ( Bus Request ) et BG ( Bus Grant ) , qui sont les deux signaux contrôlant l'interface entre le CPU et le Contrôleur DMA. Cependant, en mode vol de cycle, après un octet de transfert de données, le contrôle du bus système est annulé par le CPU via BG. Il est ensuite redemandé en continu via BR, en transférant un octet de données par requête, jusqu'à ce que l'intégralité du bloc de données ait été transféré. En obtenant et en libérant continuellement le contrôle du bus système, le contrôleur DMA entrelace essentiellement les transferts d'instructions et de données. Le CPU traite une instruction, puis le contrôleur DMA transfère une valeur de données, et ainsi de suite. Les données ne sont pas transférées aussi rapidement, mais le processeur n'est pas inactif aussi longtemps qu'en mode rafale. Le mode de vol de cycle est utile pour les contrôleurs qui surveillent les données en temps réel.

Mode transparent

Le mode transparent prend le plus de temps pour transférer un bloc de données, mais c'est aussi le mode le plus efficace en termes de performances globales du système. En mode transparent, le contrôleur DMA transfère les données uniquement lorsque le CPU effectue des opérations qui n'utilisent pas les bus système. Le principal avantage du mode transparent est que le CPU n'arrête jamais d'exécuter ses programmes et que le transfert DMA est gratuit en termes de temps, tandis que l'inconvénient est que le matériel doit déterminer quand le CPU n'utilise pas les bus système, ce qui peut être complexe . Ceci est également appelé " Mode de transfert de données DMA caché ".

Cohérence du cache

Incohérence du cache due au DMA

Le DMA peut entraîner des problèmes de cohérence du cache . Imaginez un CPU équipé d'un cache et d'une mémoire externe accessible directement par les appareils utilisant le DMA. Lorsque le CPU accède à l'emplacement X dans la mémoire, la valeur actuelle sera stockée dans le cache. Les opérations suivantes sur X mettront à jour la copie en cache de X, mais pas la version de mémoire externe de X, en supposant un cache de réécriture . Si le cache n'est pas vidé dans la mémoire avant la prochaine fois qu'un périphérique essaie d'accéder à X, le périphérique recevra une valeur périmée de X.

De même, si la copie en cache de X n'est pas invalidée lorsqu'un périphérique écrit une nouvelle valeur dans la mémoire, alors le CPU fonctionnera sur une valeur périmée de X.

Ce problème peut être résolu de l'une des deux manières suivantes dans la conception du système : les systèmes cohérents avec le cache implémentent une méthode matérielle, appelée surveillance de bus , par laquelle les écritures externes sont signalées au contrôleur de cache qui effectue ensuite une invalidation du cache pour les écritures DMA ou un vidage du cache pour DMA lit. Les systèmes non cohérents laissent cela au logiciel, où le système d'exploitation doit alors s'assurer que les lignes de cache sont vidées avant le démarrage d'un transfert DMA sortant et invalidées avant l'accès à une plage de mémoire affectée par un transfert DMA entrant. Le système d'exploitation doit s'assurer que la plage de mémoire n'est accessible par aucun thread en cours d'exécution entre-temps. Cette dernière approche introduit une certaine surcharge dans l'opération DMA, car la plupart du matériel nécessite une boucle pour invalider chaque ligne de cache individuellement.

Des hybrides existent également, où le cache L2 secondaire est cohérent tandis que le cache L1 (généralement sur CPU) est géré par logiciel.

Exemples

EST UN

Dans le PC IBM d' origine (et le PC/XT suivant ), il n'y avait qu'un seul contrôleur DMA Intel 8237 capable de fournir quatre canaux DMA (numérotés de 0 à 3). Ces canaux DMA effectuaient des transferts 8 bits (car le 8237 était un périphérique 8 bits, idéalement adapté à l' architecture CPU/bus i8088 du PC ), ne pouvaient adresser que le premier ( i8086 /8088-standard) mégaoctet de RAM, et étaient limités à l'adressage de segments uniques de 64  Ko dans cet espace (bien que les canaux source et de destination puissent adresser des segments différents). De plus, le contrôleur ne pouvait être utilisé que pour les transferts vers, depuis ou entre les périphériques d'E/S du bus d'extension, car le 8237 ne pouvait effectuer des transferts mémoire à mémoire qu'en utilisant les canaux 0 et 1, dont le canal 0 dans le PC (& XT ) était dédié au rafraîchissement dynamique de la mémoire . Cela l'empêchait d'être utilisé comme un " Blitter " à usage général , et par conséquent les déplacements de mémoire de bloc dans le PC, limités par la vitesse PIO générale du CPU, étaient très lents.

Avec IBM PC/AT , le bus AT amélioré (plus connu sous le nom d' ISA , ou "Industry Standard Architecture") a ajouté un deuxième contrôleur DMA 8237 pour en fournir trois supplémentaires, et comme le soulignent les conflits de ressources avec l'extensibilité supplémentaire du XT sur le PC d'origine, canaux indispensables (5-7 ; le canal 4 est utilisé en cascade vers le premier 8237). Le registre de page a également été recâblé pour adresser l'espace d'adressage mémoire complet de 16 Mo du processeur 80286. Ce deuxième contrôleur a également été intégré de manière à pouvoir effectuer des transferts 16 bits lorsqu'un périphérique d'E/S est utilisé comme source et/ou destination de données (car il ne traite en fait que les données lui-même pour les transferts mémoire à mémoire, sinon il suffit de contrôler le flux de données entre les autres parties du système 16 bits, ce qui rend sa propre largeur de bus de données relativement immatérielle), doublant le débit de données lorsque les trois canaux supérieurs sont utilisés. Pour des raisons de compatibilité, les quatre canaux DMA inférieurs étaient toujours limités aux transferts 8 bits uniquement, et tandis que les transferts mémoire à mémoire étaient désormais techniquement possibles grâce au fait que le canal 0 n'avait plus à gérer le rafraîchissement de la DRAM, d'un point de vue pratique, ils étaient d'une valeur limitée en raison du faible débit du contrôleur par rapport à ce que le processeur pouvait maintenant atteindre (c'est-à-dire un 80286 16 bits, plus optimisé, fonctionnant à un minimum de 6 MHz, contre un contrôleur 8 bits verrouillé à 4,77 MHz). Dans les deux cas, le problème de limite de segment de 64 ko demeurait, avec des transferts individuels incapables de traverser des segments (au lieu de « boucler » au début du même segment) même en mode 16 bits, bien qu'il s'agisse en pratique davantage d'un problème de programmation. la complexité de la performance que le besoin continu de rafraîchissement DRAM (cependant traité) à monopoliser le bus environ toutes les 15  ms utilisation empêché de grandes (et rapide, mais sans coupure) des transferts en bloc.

En raison de leurs performances en retard (1,6  Mo /s de capacité de transfert maximum de 8 bits à 5 MHz, mais pas plus de 0,9 Mo/s dans le PC/XT et 1,6 Mo/s pour les transferts de 16 bits dans l'AT en raison du bus ISA frais généraux et autres interférences telles que les interruptions de rafraîchissement de la mémoire) et l'indisponibilité de tout niveau de vitesse qui permettrait l'installation de remplacements directs fonctionnant à des vitesses supérieures à l'horloge standard de 4,77 MHz du PC d'origine, ces appareils sont effectivement obsolètes depuis la fin des années 1980. En particulier, l'avènement du processeur 80386 en 1985 et sa capacité de transferts 32 bits (bien que de grandes améliorations de l'efficacité du calcul des adresses et des déplacements de mémoire de bloc dans les processeurs Intel après le 80186 signifiaient que les transferts PIO même par le bus 16 bits 286 et 386SX pourraient encore facilement dépasser le 8237), ainsi que le développement de nouvelles évolutions vers ( EISA ) ou de remplacements ( MCA , VLB et PCI ) du bus " ISA " avec leurs propres sous-systèmes DMA beaucoup plus performants (jusqu'à un maximum de 33 Mo/s pour EISA, 40 Mo/s MCA, généralement 133 Mo/s VLB/PCI) a fait que les contrôleurs DMA d'origine semblent plus une pierre de performance qu'un booster. Ils ont été pris en charge dans la mesure où ils sont nécessaires pour prendre en charge le matériel PC hérité intégré sur les machines ultérieures. Les composants matériels hérités qui ont continué à utiliser ISA DMA après que les bus d'extension 32 bits soient devenus courants étaient les cartes Sound Blaster qui devaient maintenir une compatibilité matérielle totale avec la norme Sound Blaster ; et les périphériques Super I/O sur les cartes mères qui intégraient souvent un contrôleur de disquette intégré, un contrôleur infrarouge IrDA lorsque le mode FIR (infrarouge rapide) est sélectionné et un contrôleur de port parallèle IEEE 1284 lorsque le mode ECP est sélectionné. Dans les cas où un 8237s d'origine ou des compatibles directs étaient encore utilisés, le transfert vers ou depuis ces appareils peut toujours être limité aux 16 premiers Mo de RAM principale, quel que soit l'espace d'adressage réel du système ou la quantité de mémoire installée.

Chaque canal DMA possède un registre d'adresses de 16 bits et un registre de comptage de 16 bits qui lui sont associés. Pour lancer un transfert de données, le pilote de périphérique configure l'adresse du canal DMA et les registres de comptage ainsi que la direction du transfert de données, de lecture ou d'écriture. Il demande ensuite au matériel DMA de commencer le transfert. Une fois le transfert terminé, l'appareil interrompt la CPU.

Le Scatter-gather ou le DMA d' E/S vectorielles permet le transfert de données vers et depuis plusieurs zones de mémoire en une seule transaction DMA. Cela équivaut à l'enchaînement de plusieurs requêtes DMA simples. La motivation est de décharger plusieurs tâches d'interruption d' entrée/sortie et de copie de données de la CPU.

DRQ signifie Data request ; DACK pour l' accusé de réception des données . Ces symboles, visibles sur les schémas matériels des systèmes informatiques dotés de la fonctionnalité DMA, représentent des lignes de signalisation électroniques entre le CPU et le contrôleur DMA. Chaque canal DMA a une ligne de demande et une ligne d'accusé de réception. Un périphérique qui utilise DMA doit être configuré pour utiliser les deux lignes du canal DMA attribué.

Mastering de bus autorisé ISA 16 bits.

Affectations standard ISA DMA :

  1. Actualisation DRAM (obsolète),
  2. Matériel utilisateur, généralement carte son DMA 8 bits
  3. Contrôleur de disquette ,
  4. Disque dur (obsolète par les modes PIO , et remplacé par les modes UDMA ), port parallèle (port compatible ECP), certains SoundBlaster Clones comme l'OPTi 928.
  5. Cascade vers contrôleur DMA PC/XT,
  6. Disque dur ( PS/2 uniquement), matériel utilisateur pour tous les autres, généralement carte son DMA 16 bits
  7. Matériel utilisateur.
  8. Matériel utilisateur.

PCI

Une architecture PCI n'a pas de contrôleur DMA central, contrairement à ISA. Au lieu de cela, n'importe quel périphérique PCI peut demander le contrôle du bus (« devenir le maître du bus ») et demander de lire et d'écrire dans la mémoire système. Plus précisément, un composant PCI demande la propriété du bus au contrôleur de bus PCI (généralement un pont hôte PCI et un pont PCI vers PCI), qui arbitrera si plusieurs périphériques demandent la propriété du bus simultanément, puisqu'il ne peut y avoir qu'un seul maître de bus à la fois. Lorsque le composant obtient la propriété, il émet des commandes normales de lecture et d'écriture sur le bus PCI, qui seront réclamées par le contrôleur de bus PCI.

Par exemple, sur un PC basé sur AMD Socket AM2 , le southbridge transmettra les transactions au contrôleur mémoire (qui est intégré sur la puce CPU) en utilisant HyperTransport , qui les convertira à son tour en opérations DDR2 et les enverra sur le Bus mémoire DDR2. En conséquence, il y a un certain nombre d'étapes impliquées dans un transfert PCI DMA ; cependant, cela pose peu de problème, puisque le périphérique PCI ou le bus PCI lui-même sont d'un ordre de grandeur plus lents que le reste des composants (voir liste des bandes passantes des périphériques ).

Un processeur x86 moderne peut utiliser plus de 4 Go de mémoire, en utilisant l' extension d'adresse physique (PAE), un mode d'adressage 36 bits ou le mode natif 64 bits des processeurs x86-64 . Dans un tel cas, un appareil utilisant le DMA avec un bus d'adresse 32 bits ne peut pas adresser la mémoire au-dessus de la ligne de 4 Go. Le nouveau mécanisme DAC ( Double Address Cycle ), s'il est implémenté à la fois sur le bus PCI et sur le périphérique lui-même, permet un adressage DMA 64 bits. Sinon, le système d'exploitation aurait besoin de contourner le problème en utilisant soit des doubles tampons coûteux (nomenclature DOS/Windows) également appelés tampons de rebond ( FreeBSD /Linux), soit il pourrait utiliser un IOMMU pour fournir des services de traduction d'adresses s'il y en a un. .

I/OAT

À titre d'exemple de moteur DMA incorporé dans un processeur à usage général, certains chipsets Intel Xeon incluent un moteur DMA appelé I/O Acceleration Technology (I/OAT), qui peut décharger la copie de mémoire du processeur principal, le libérant pour faire d'autres travaux . En 2006, Andrew Grover, développeur du noyau Linux d'Intel, a effectué des tests de performance en utilisant I/OAT pour décharger les copies du trafic réseau et n'a trouvé aucune amélioration de plus de 10 % de l'utilisation du processeur avec les charges de travail de réception.

DDIO

D'autres améliorations axées sur les performances du mécanisme DMA ont été introduites dans les processeurs Intel Xeon E5 avec leur fonction Data Direct I/O ( DDIO ), permettant aux "fenêtres" DMA de résider dans les caches CPU au lieu de la RAM système. En conséquence, les caches CPU sont utilisés comme source et destination principales pour les E/S, permettant aux contrôleurs d'interface réseau (NIC) de DMA directement vers le cache de dernier niveau (cache L3) des CPU locaux et d'éviter la récupération coûteuse des E/S. données de la RAM système. En conséquence, DDIO réduit la latence globale de traitement des E/S, permet d'effectuer le traitement des E/S entièrement dans le cache, empêche la bande passante/latence RAM disponible de devenir un goulot d'étranglement des performances et peut réduire la consommation d'énergie en permettant RAM pour rester plus longtemps dans un état de faible puissance.

AHB

Dans les systèmes sur puce et les systèmes embarqués , l'infrastructure de bus système typique est un bus sur puce complexe tel que le bus hautes performances AMBA . AMBA définit deux types de composants AHB : maître et esclave. Une interface esclave est similaire aux E/S programmées à travers lesquelles le logiciel (s'exécutant sur un processeur embarqué, par exemple ARM ) peut écrire/lire des registres d'E/S ou (moins fréquemment) des blocs de mémoire locale à l'intérieur de l'appareil. Une interface maître peut être utilisée par l'appareil pour effectuer des transactions DMA vers/depuis la mémoire système sans trop charger le CPU.

Par conséquent, les périphériques à bande passante élevée tels que les contrôleurs de réseau qui doivent transférer d'énormes quantités de données vers/depuis la mémoire système auront deux adaptateurs d'interface vers l'AHB : une interface maître et une interface esclave. En effet, les bus sur puce comme AHB ne prennent pas en charge le tri-état du bus ou l'alternance de la direction d'une ligne sur le bus. Comme PCI, aucun contrôleur DMA central n'est requis puisque le DMA contrôle le bus, mais un arbitre est requis en cas de plusieurs maîtres présents sur le système.

En interne, un moteur DMA multicanal est généralement présent dans l'appareil pour effectuer plusieurs opérations de dispersion-collecte simultanées telles que programmées par le logiciel.

Cellule

À titre d'exemple d'utilisation du DMA dans un système sur puce multiprocesseur, le processeur Cell d' IBM/Sony/Toshiba intègre un moteur DMA pour chacun de ses 9 éléments de traitement, dont un élément de processeur de puissance (PPE) et huit éléments de processeur synergiques (SPE) . Étant donné que les instructions de chargement/stockage du SPE ne peuvent lire/écrire que sa propre mémoire locale, un SPE dépend entièrement des DMA pour transférer des données vers et depuis la mémoire principale et les mémoires locales des autres SPE. Ainsi, le DMA agit comme un moyen principal de transfert de données entre les cœurs à l'intérieur de ce processeur (contrairement aux architectures CMP cohérentes avec le cache telles que le GPU à usage général annulé d'Intel , Larrabee ).

Le DMA dans Cell est entièrement cohérent avec le cache (notez cependant que les magasins locaux de SPE exploités par DMA n'agissent pas comme un cache globalement cohérent au sens standard du terme ). En lecture ("get") et en écriture ("put"), une commande DMA peut transférer soit une zone de bloc unique d'une taille allant jusqu'à 16 Ko, soit une liste de 2 à 2048 blocs de ce type. La commande DMA est émise en spécifiant une paire d'adresse locale et d'adresse distante : par exemple, lorsqu'un programme SPE émet une commande put DMA, il spécifie une adresse de sa propre mémoire locale comme source et une adresse de mémoire virtuelle (pointant vers soit la mémoire principale, soit la mémoire locale d'un autre SPE) comme cible, ainsi qu'une taille de bloc. Selon une expérimentation, un pic de performance efficace du DMA in Cell (3 GHz, sous trafic uniforme) atteint 200 Go par seconde.

Pipeline

Les processeurs avec mémoire scratch et DMA (tels que les processeurs de signaux numériques et le processeur Cell ) peuvent bénéficier de la superposition logicielle des opérations de mémoire DMA avec le traitement, via une double mise en mémoire tampon ou une mise en mémoire tampon multiple. Par exemple, la mémoire sur puce est divisée en deux tampons ; le processeur peut fonctionner sur des données dans l'un, tandis que le moteur DMA charge et stocke des données dans l'autre. Cela permet au système d'éviter la latence de la mémoire et d'exploiter les transferts en rafale , au détriment d'un modèle d'accès mémoire prévisible .

Voir également

Remarques

Les références

Liens externes