Qu'est-ce que DMA (accès direct à la mémoire) ?

Mécanisme de transfert direct des données entre un périphérique et la mémoire sans passer par le CPU. Le CPU peut poursuivre d'autres traitements pendant les transferts volumineux.

Nom japonais: DMA(ダイレクトメモリアクセス)

« DMA (accès direct à la mémoire) » apparaît dans 10 questions d'entraînement réparties sur 6 thèmes, dont Système d'exploitation et matériel, CPU et architecture, Systèmes embarqués et firmware.

Domaine: CPU et architecture

Déroulement d'un transfert DMA

En E/S programmées, le CPU déplace lui-même chaque mot avec des instructions de chargement et de rangement. Avec l'accès direct à la mémoire (DMA), le CPU programme plutôt un contrôleur DMA, ou le moteur DMA propre au périphérique, avec une source, une destination, une longueur et un déclencheur, puis retourne à d'autres tâches. Le contrôleur prend le contrôle du bus, transfère les données et lève une interruption de fin de transfert. Dans un microcontrôleur, par exemple, un timer peut déclencher une conversion ADC à intervalles fixes et le DMA ranger chaque résultat dans un tableau, ne réveillant le CPU que lorsque le tampon est plein.

Anneaux de descripteurs dans les périphériques rapides

Les cartes réseau et les SSD NVMe utilisent des anneaux de descripteurs : des tables circulaires en mémoire principale dont chaque entrée donne une adresse de tampon et une longueur. Le CPU remplit des descripteurs libres et écrit une seule fois dans un registre du périphérique, souvent appelé doorbell, pour indiquer jusqu'où il a écrit. Le périphérique lit les descripteurs par DMA, effectue lui-même les transferts et marque les entrées terminées. CPU et périphérique font ainsi avancer de nombreux transferts sans s'attendre mutuellement, et des listes de tampons dispersés peuvent être traitées en une seule opération, appelée scatter-gather.

Caches et mémoire épinglée

Le DMA contourne les caches du CPU, si bien que les deux vues de la mémoire peuvent diverger. Lorsque le matériel n'assure pas leur cohérence, le pilote réécrit en mémoire les lignes de cache modifiées avant qu'un périphérique ne lise un tampon, et invalide la plage en cache avant que le CPU ne lise des données écrites par un périphérique, afin de ne pas utiliser de valeurs périmées. Le système d'exploitation peut aussi déplacer ou évincer (swap) à tout moment les pages ordinaires : les tampons destinés au DMA sont donc épinglés (pinned) en place. La mémoire hôte épinglée permet à un GPU de transférer des données sans copie intermédiaire et de recouvrir transferts et calculs.

Protéger la mémoire avec une IOMMU

Comme le DMA écrit directement en mémoire, un périphérique défectueux ou malveillant pourrait écraser des données du noyau ou lire des clés de chiffrement, un risque particulier pour les périphériques reliés par des ports externes rapides. Une IOMMU (unité de gestion de mémoire d'entrée-sortie) fait pour les périphériques ce que la MMU fait pour le CPU : elle traduit les adresses utilisées par les périphériques en adresses physiques et bloque tout accès en dehors des régions accordées par le système d'exploitation. Elle permet aussi de présenter à un périphérique des pages physiques dispersées comme contiguës, et d'attribuer en toute sécurité un périphérique directement à une machine virtuelle.

S'entraîner : questions sur DMA (accès direct à la mémoire)

Dans un système où le matériel ne maintient pas la cohérence des caches (non cohérent), quel traitement le logiciel doit-il effectuer avant que le CPU lise des données écrites en mémoire principale par un périphérique via DMA ?

  1. AAbaisser temporairement la fréquence d’horloge du CPU
  2. BInvalider le contenu du cache pour la zone concernée afin de forcer une relecture depuis la mémoire principale
  3. CRéécrire tout le contenu du cache en mémoire principale, puis abandonner les résultats reçus par DMA
Afficher la réponse et l'explication

Réponse : B. Invalider le contenu du cache pour la zone concernée afin de forcer une relecture depuis la mémoire principale

Le DMA transférant les données entre périphérique et mémoire principale sans passer par le CPU, dans un système où le matériel ne maintient pas la cohérence, le cache du CPU peut contenir d’anciennes données de cette zone. Une lecture directe renverrait l’ancienne valeur plutôt que les nouvelles données reçues par DMA. Le pilote invalide donc le cache de cette zone avant la lecture pour faire lire les nouvelles valeurs en mémoire principale. À l’inverse, les données à envoyer au périphérique sont réécrites depuis le cache avant le lancement du DMA.

Lorsqu'un microcontrôleur acquiert à intervalle régulier un grand nombre de résultats de conversion analogique-numérique, quel est l'avantage d'utiliser le DMA ?

  1. ALa résolution du CAN augmente automatiquement
  2. BLa tension d'entrée augmente automatiquement
  3. CLe processeur n'a plus à lire chaque résultat par interruption ; le DMA les range en mémoire, ce qui allège la charge du processeur
Afficher la réponse et l'explication

Réponse : C. Le processeur n'a plus à lire chaque résultat par interruption ; le DMA les range en mémoire, ce qui allège la charge du processeur

Si le processeur lit chaque résultat par interruption, à plusieurs dizaines de milliers d'acquisitions par seconde, le seul coût des interruptions consomme une grande partie de son temps. Avec le DMA, chaque fin de conversion fait écrire le résultat dans un tableau en mémoire, et le processeur n'est averti que lorsque le tableau est plein. Combiné au déclenchement des conversions par temporisateur, il permet une acquisition à intervalles précis sans intervention du processeur.

Questions fréquentes

Que signifie DMA ?

DMA signifie direct memory access (accès direct à la mémoire), un mécanisme qui permet aux périphériques de transférer des données vers et depuis la mémoire principale sans que le CPU copie chaque mot, de sorte que le CPU peut effectuer d'autres tâches pendant le transfert.

Quelle est la différence entre le DMA et les E/S programmées ?

En E/S programmées, le CPU lit ou écrit lui-même chaque mot de données vers le périphérique. Avec le DMA, le CPU se contente de configurer le transfert et il est averti lorsque celui-ci se termine, ce qui économise du temps CPU pour les transferts volumineux ou fréquents.

Pourquoi faut-il invalider le cache après un transfert DMA vers la mémoire ?

Sur les systèmes sans cohérence de cache matérielle, le cache du CPU peut encore contenir d'anciennes copies de cette plage mémoire. L'invalider oblige le CPU à lire les nouvelles données écrites par le périphérique.

« DMA (accès direct à la mémoire) » dans les explications

Questions mentionnant « DMA (accès direct à la mémoire) » (10)

  1. Dans un système où le matériel ne maintient pas la cohérence des caches (non cohérent), quel traitement le logiciel doit-il effectuer avant que le CPU lise des données écrites en mémoire principale par un périphérique via DMA ?
  2. Lorsqu'un microcontrôleur acquiert à intervalle régulier un grand nombre de résultats de conversion analogique-numérique, quel est l'avantage d'utiliser le DMA ?
  3. Quelle description du mécanisme de DMA utilisant un anneau de descripteurs en mémoire, largement employé par les cartes réseau et les SSD NVMe, est correcte ?
  4. Quelle contre-mesure s'applique aux attaques par lesquelles un appareil externe connecté à un ordinateur lit ou écrit à volonté le contenu de la mémoire principale par DMA ?
  5. Quel mécanisme transfère directement des données entre un périphérique et la mémoire sans passer par le processeur ?
  6. Parmi les politiques d'écriture du cache, quelle description de l'écriture différée (write-back) est correcte ?
  7. Quel est le rôle principal d’une IOMMU ?
  8. Quel est le rôle d’un pilote de périphérique ?
  9. Pour quelle raison principale un OS courant empêche-t-il les applications de lire et écrire directement les registres des périphériques ?
  10. Pourquoi le transfert vers le GPU est-il plus rapide lorsque la mémoire CPU est épinglée (verrouillée en pages) ?

Comparatifs incluant ce terme

Termes associés

Via Interruption IOMMU Microcontrôleur NVMe Pilote de périphérique Table des pages GPU Mémoire épinglée (pinned memory) Architecture de von Neumann

Retour au glossaire