/proc/dma

Sommaire

    Le DMA permet à un périphérique de transmettre des données directement à la mémoire sans utiliser le processeur.

    Prenons le cas de la réception d'un paquet par un adaptateur réseau.
    Sans DMA, le processeur doit aller lire le contenu du tampon de la carte réseau un octet à la fois, et écrire l'octet dans la mémoire. C'est un processus assez inefficace car le processeur est sollicité et parce que le bus est sollicité 2 fois pour chaque octet.
    Avec DMA, le processeur configure le transfert dans un contrôleur programmable, le contrôleur DMA. Ensuite c'est le contrôleur DMA qui va gérer le transfert afin de ne pas bloquer le processeur. Le transfert de donnée par DMA se fait directement entre la carte réseau et la mémoire (d'où "accès direct à la mémoire"), la carte réseau vient écrire le tampon directement dans l'emplacement qui lui est fournit.

    La plupart des périphériques actuels gère le DMA et ce mode est utilisé par Linux pour une question de performance.

    Dans le cas des ports ISA, le DMA utilise des canaux de 0 à 8 que chaque périphérique reserve. On peut voir les canaux réservés dans le pseudo système de fichier /proc à l'adresse /proc/dma:

    $ cat /proc/dma
     2: floppy
     3: parport0
     4: cascade
    

    Les canaux DMA sont numérotés de 0 à 8. On peut voir dans le cas de l'exemple que le canal 2 est réservé par le lecteur disquette et le canal 3 par le premier port parallèle. Le canal 4 est particulier et est toujours réservé par "cascade". En effet, les 8 canaux sont obtenus en chaînant 2 contrôleurs DMA, le canal 4 du premier servant d'entrée au second contrôleur.