# Direct memory access

Direct memory access (DMA) maakt het mogelijk om data over te brengen van een niveau in de geheugenhiërarchie met een minimale tussenkomst van de centrale verwerkingseenheid (processor, CPU). Aangezien dit parallel gebeurt met de bewerkingen die op dat moment op de CPU lopen, vormt DMA een belangrijk onderdeel in de aanspreking van de hardware en de basis van efficiënte en goed presterende drivers en applicaties.
In veel toepassingen staat DMA tegenover cache-operaties. Simpel gezegd laat DMA toe efficiënter te werken dan de cache controller kan toelaten, maar vereist een duidelijk inzicht van de programmeur in het algoritme of code.
Sommige processoren zoals digitale signaalprocessors bezitten bovendien ook geen cache controller (of cache) of wordt de cache-operatie afgezet voor expliciete prestatiedoeleinden; cache-operaties zijn namelijk altijd onderhevig aan een inschatting van de cache controller over welke data nodig zal zijn in een volgende stap.

## Voorbeeld

Op een eenvoudige microcontroller wordt niet met DMA gewerkt. Dat betekent dat de CPU steeds de besturing van de bus heeft. Wil de CPU gegevens van een schijf lezen, dan gaat dat als volgt:
* De CPU geeft een leesopdracht aan de schijfprocessor. Daarbij wordt opgegeven welke gegevens gelezen moeten worden.
* De CPU gaat verder met andere werkzaamheden.
* De schijfprocessor geeft een interrupt als de gegevens gereed zijn.
* De CPU kopieert de gegevens van de buffer van de schijfprocessor naar het werkgeheugen.
Bij DMA is dit de werkwijze:
* De CPU geeft een leesopdracht aan de schijfprocessor. Daarbij wordt opgegeven welke gegevens gelezen moeten worden en op welk geheugenadres ze moeten worden opgeslagen.
* De CPU gaat verder met andere werkzaamheden.
* De schijfprocessor leest de gegevens en zet ze in het geheugen.
* De schijfprocessor geeft een interrupt als de procedure voltooid is.

## Busconflict

Een probleem met DMA is dat twee processors tegelijk aanspraak maken op het geheugen. Om een busconflict te vermijden worden er besturingsignalen tussen de processors, of met een bus arbitrator uitgewisseld. De ene processor krijgt toegang tot de bus als de andere processor even met een interne verwerking bezig is. Ook is het mogelijk dat de bus tijdens het verloop van de verwerking in twee delen wordt gedeeld, zodat de twee processors onafhankelijk van elkaar kunnen werken.

## Video

Een klassiek voorbeeld van DMA komt voor bij video. Een deel van het computergeheugen is aangewezen als videogeheugen. De inhoud van dit geheugen wordt op het scherm afgebeeld. Daarvoor is het nodig dat de videoprocessor het geheugen continu uitleest. Maar natuurlijk wil de CPU soms ook toegang hebben tot het videogeheugen.
Ook hier is het mogelijk dat een processor toegang krijgt tot het videogeheugen tijdens de korte momenten dat de andere processor het geheugen niet nodig heeft. De videoprocessor heeft tijdens de terugslagtijd het geheugen niet nodig. Een andere, minder fraaie, oplossing is dat de CPU op elk moment het videogeheugen mag benaderen, waarbij de videoprocessor even niets kan lezen. Deze oplossing leidt tot vlekken op het scherm op het moment dat de CPU het videogeheugen benadert. De fraaiste oplossing bestaat uit videogeheugen dat tegelijk van twee kanten benaderd kan worden.

## UDMA

Met de toename van snellere ATA-harde schijven werd het gebruik van geprogrammeerde I/O (PIO) steeds meer een belemmering. De PIO-modus werd daarom vervangen door DMA (word DMA) en later ultra DMA (ultra direct memory access, UDMA).
De ontwikkeling werd door Quantum in samenwerking met Intel tot stand gebracht. De introductie vond plaats in 1998 met de ATA-4- of ATA/ATAPI-4-standaard.
UDMA was de snelste methode die werd gebruikt om gegevens tussen de computer (via de ATA-controller) en een ATA-apparaat over te dragen totdat serial ATA (SATA) verscheen.
Er zijn een aantal specifieke eisen voor het uitvoeren van ultra DMA met harde schijven:
* Hardeschijfondersteuning: de harde schijf zelf moet ultra DMA ondersteunen. Bovendien moet de juiste ultra DMA-modus worden ingeschakeld.
* 80 aderige kabel: voor ultra DMA-modi hoger dan 2 moet een 80-aderige kabel worden gebruikt. Als een 80-aderige kabel niet wordt gedetecteerd door het systeem, zal automatisch 66 MB/s-, 100 MB/s- of 133 MB/s-gebruik worden uitgeschakeld.
* BIOS- en OS-ondersteuning: de BIOS en/of het besturingssysteem moet ondersteuning bieden voor de ultra DMA-transfers. Verder moet de harde schijf worden ingesteld om te werken in ultra DMA-modus in het besturingssysteem. Vanaf Windows 98 gebeurt dit automatisch.
* Controllerondersteuning: een controller die ultra DMA-overdrachten ondersteunt. Dit kan zowel de onboard-controller zijn op het moederbord als een IDE/ATA-interface (add-on-)kaart.
Er zijn acht verschillende UDMA-modi van 0 tot 6 voor ATA, 0 tot 7 voor CompactFlash, elk met een eigen timing.
| UDMA-modus | aanwijzing | overdrachtssnelheid in MB/s |
| Mode 0 | UDMA16 | 16,7 |
| Mode 1 | UDMA25 | 25,0 |
| Mode 2 | UDMA33 | 33,3 |
| Mode 3 | UDMA44 | 44,4 |
| Mode 4 | UDMA66 | 66,7 |
| Mode 5 | UDMA100 | 100,0 |
| Mode 6 | UDMA133 | 133,3 |
| Mode 7 | UDMA166 | 166,0 (*CompactFlash) |