Direct Memory Access (DMA) ist ein Hardware-Mechanismus, mit dem Peripheriegeräte Daten direkt in den Arbeitsspeicher schreiben oder aus ihm lesen, ohne dass die CPU jedes einzelne Byte kopieren muss. Eine Festplatte, Netzwerkkarte oder Soundkarte lädt ihre Daten damit selbst in den RAM – die CPU wird nur zum Start und am Ende des Transfers gebraucht.
Ohne DMA: Programmed I/O
Ohne DMA müsste die CPU jeden Datentransfer Wort für Wort selbst erledigen (Programmed I/O, kurz PIO). Sie liest ein Datenwort vom Gerät und schreibt es in den Speicher, wiederholt das tausende Male – und kann währenddessen nichts anderes tun. Bei schnellen Geräten wie NVMe-SSDs oder 10-Gbit-Netzwerkkarten wäre die CPU dadurch komplett blockiert.
So arbeitet ein DMA-Controller
Ein DMA-Controller ist eine eigene Hardware-Einheit, die den Transfer übernimmt:
- Der Treiber programmiert den Controller mit Quell- und Zieladresse, Länge und Richtung.
- Der Controller übernimmt den Bus und überträgt die Daten blockweise in den Speicher.
- Nach Abschluss meldet er die Fertigstellung über einen Interrupt – ein einziger Interrupt pro Transfer statt eines pro Datenwort.
Je nach Modus bedient sich der Controller freie Speicherzyklen (Cycle Stealing) oder hält den Bus für eine längere Burst-Übertragung. Moderne Systeme haben oft mehrere DMA-Kanäle für verschiedene Geräteklassen.
IOMMU: DMA sicher machen
Bei heutigen CPUs übersetzt die MMU auch DMA-Adressen: Eine IOMMU (Input/Output Memory Management Unit) prüft und übersetzt die Speicherzugriffe von Geräten. Dadurch kann ein fehlerhaftes oder böswilliges Gerät nicht beliebigen Speicher lesen – ein bekannter Angriffsweg über Thunderbolt- oder PCIe-Anschlüsse wird damit geschlossen.
Wo DMA steckt
DMA wird überall dort eingesetzt, wo große Datenmengen fließen: bei NVMe- und SATA-Controllern, Netzwerkkarten mit DMA-Ringpuffern, Grafikkarten, Soundkarten und Kameras. Der Kernel verwaltet die DMA-fähigen Speicherbereiche, damit die Geräte nicht in fremde Prozesse schreiben. Der Cache wird dabei meist umgangen oder gezielt invalidiert, damit CPU und Gerät denselben Datenstand sehen.
Verwandte Grundlagen: Von-Neumann-Architektur (Ein-/Ausgabe über den Speicher), Mikroarchitektur (Einheiten im Chip).