Wat is DMA (direct memory access)?

Mechanisme dat gegevens rechtstreeks tussen randapparatuur en geheugen overdraagt zonder tussenkomst van de CPU. De CPU kan tijdens grote gegevensoverdrachten andere taken uitvoeren.

Japanse benaming: DMA(ダイレクトメモリアクセス)

“DMA (direct memory access)” komt voor in 10 oefenvragen uit 6 onderwerpen, bijv. Besturingssysteem en hardware, CPU en architectuur, Embedded systemen en firmware.

Vakgebied: CPU en architectuur

Hoe een DMA-overdracht werkt

Bij programmed I/O verplaatst de CPU elk woord zelf met load- en store-instructies. Bij direct memory access (DMA) programmeert de CPU in plaats daarvan een DMA-controller, of de eigen DMA-engine van het device, met een bron, een bestemming, een lengte en een trigger, en gaat dan verder met ander werk. De controller neemt de bus over, verplaatst de data en geeft een interrupt als hij klaar is. In een microcontroller kan bijvoorbeeld een timer met vaste intervallen een ADC-conversie starten en kan DMA elk resultaat in een array opslaan, zodat de CPU pas wordt gewekt als de buffer vol is.

Descriptor rings in snelle devices

Netwerkkaarten en NVMe-SSD's gebruiken descriptor rings: circulaire tabellen in het hoofdgeheugen waarvan de entries een bufferadres en een lengte opgeven. De CPU vult vrije descriptors en schrijft één keer naar een deviceregister, vaak doorbell genoemd, om aan te geven hoe ver hij heeft geschreven. Het device leest de descriptors via DMA, voert de overdrachten zelf uit en markeert afgehandelde entries als voltooid. CPU en device werken zo veel overdrachten af zonder op elkaar te wachten, en lijsten van verspreide buffers kunnen in één bewerking worden afgehandeld, wat scatter-gather heet.

Caches en vastgezet geheugen

DMA omzeilt de CPU-caches, zodat de twee beelden van het geheugen van elkaar kunnen afwijken. Waar de hardware ze niet coherent houdt, schrijft de driver dirty cachelines terug naar het geheugen voordat een device een buffer leest, en invalideert hij het gecachete bereik voordat de CPU data leest die een device heeft geschreven, zodat er geen verouderde waarden worden gebruikt. Het besturingssysteem kan gewone pages ook op elk moment verplaatsen of uitswappen, dus buffers voor DMA worden op hun plaats vastgezet (pinned); met pinned hostgeheugen kan een GPU data overdragen zonder tussenkopie en overdrachten laten overlappen met berekeningen.

Geheugen beschermen met een IOMMU

Omdat DMA direct naar het geheugen schrijft, zou een defect of kwaadwillend device kerneldata kunnen overschrijven of encryptiesleutels kunnen uitlezen, een bijzonder aandachtspunt bij devices die via snelle externe poorten zijn aangesloten. Een IOMMU (input-output memory management unit) doet voor devices wat de MMU voor de CPU doet: hij vertaalt de adressen die devices gebruiken naar fysieke adressen en blokkeert toegang buiten de gebieden die het besturingssysteem heeft toegekend. Hij laat ook verspreide fysieke pages voor een device aaneengesloten lijken en maakt het veilig om een device rechtstreeks aan een virtuele machine toe te wijzen.

Nu oefenen: vragen over DMA (direct memory access)

Welke bewerking moet de software uitvoeren voordat de CPU gegevens leest die een apparaat via DMA naar het hoofdgeheugen heeft geschreven, in een systeem waarin hardware de cache niet coherent houdt (niet-coherent)?

  1. ADe kloksnelheid van de CPU tijdelijk verlagen
  2. BDe inhoud van de cache voor het betreffende bereik ongeldig maken, zodat opnieuw uit het hoofdgeheugen wordt gelezen
  3. CDe hele inhoud van de cache terugschrijven naar het hoofdgeheugen en daarna het via DMA aangekomen resultaat weggooien
Antwoord en toelichting tonen

Antwoord: B. De inhoud van de cache voor het betreffende bereik ongeldig maken, zodat opnieuw uit het hoofdgeheugen wordt gelezen

DMA draagt gegevens tussen apparaat en hoofdgeheugen over zonder de CPU, dus in systemen waarin hardware de coherentie niet bewaakt, kunnen in de cache van de CPU nog verouderde gegevens van dat bereik staan. Als die gelezen worden, leest men de oude waarde in plaats van de nieuwe gegevens die via DMA zijn aangekomen. Daarom maakt de driver vóór het lezen de cache voor dat bereik ongeldig, zodat de nieuwe waarde uit het hoofdgeheugen wordt gelezen. Omgekeerd worden gegevens die naar een apparaat gaan vóór de start van DMA uit de cache teruggeschreven.

Wat is het voordeel van het gebruik van DMA wanneer een microcontroller een grote hoeveelheid AD-omzettingsresultaten met vaste tussenpozen inleest?

  1. ADe resolutie van de AD-omzetter neemt automatisch toe
  2. BDe ingangsspanning wordt automatisch groter
  3. CDe CPU hoeft het resultaat niet na elke omzetting via een interrupt te lezen en DMA plaatst ze achter elkaar in het geheugen, zodat de belasting van de CPU afneemt
Antwoord en toelichting tonen

Antwoord: C. De CPU hoeft het resultaat niet na elke omzetting via een interrupt te lezen en DMA plaatst ze achter elkaar in het geheugen, zodat de belasting van de CPU afneemt

Als de CPU het resultaat na elke omzetting via een interrupt leest, gaat bij tienduizenden metingen per seconde al een groot deel van de CPU-tijd naar het afhandelen van de interrupts. Met DMA schrijft DMA het resultaat bij elke afgeronde omzetting achtereenvolgens in een array in het geheugen en meldt het de CPU alleen als de array vol is. In combinatie met een instelling waarbij een timer de omzetting start, kan zonder CPU nauwkeurig met vaste tussenpozen worden ingelezen.

Veelgestelde vragen

Waar staat DMA voor?

DMA staat voor direct memory access, een mechanisme waarmee randapparatuur data van en naar het hoofdgeheugen kan overdragen zonder dat de CPU elk woord kopieert, zodat de CPU tijdens de overdracht ander werk kan doen.

Wat is het verschil tussen DMA en programmed I/O?

Bij programmed I/O leest of schrijft de CPU zelf elk datawoord naar het device. Bij DMA zet de CPU alleen de overdracht klaar en krijgt hij een melding als die klaar is, wat bij grote of frequente overdrachten CPU-tijd bespaart.

Waarom moet de cache na een DMA-overdracht naar het geheugen worden geïnvalideerd?

Op systemen zonder hardwarematige cachecoherentie kan de cache van de CPU nog oude kopieën van dat geheugenbereik bevatten. Invalideren dwingt de CPU de nieuwe data te lezen die het device heeft geschreven.

“DMA (direct memory access)” in de toelichting

Vragen met “DMA (direct memory access)” (10)

  1. Welke bewerking moet de software uitvoeren voordat de CPU gegevens leest die een apparaat via DMA naar het hoofdgeheugen heeft geschreven, in een systeem waarin hardware de cache niet coherent houdt (niet-coherent)?
  2. Wat is het voordeel van het gebruik van DMA wanneer een microcontroller een grote hoeveelheid AD-omzettingsresultaten met vaste tussenpozen inleest?
  3. Welke uitspraak over het DMA-mechanisme met een ring van descriptors in het geheugen, dat veel wordt gebruikt bij netwerkkaarten en NVMe-SSD's, is juist?
  4. Welke maatregel tegen een aanval waarbij een met de pc verbonden extern apparaat met DMA de inhoud van het hoofdgeheugen eigenmachtig leest en schrijft is juist?
  5. Welk mechanisme brengt gegevens rechtstreeks over tussen randapparatuur en geheugen zonder tussenkomst van de CPU?
  6. Welke uitspraak over de schrijfmethode write-back van een cache is juist?
  7. Wat is de juiste hoofdrol van de IOMMU?
  8. Wat is de juiste rol van een apparaatdriver?
  9. Wat is de belangrijkste reden dat gangbare besturingssystemen verhinderen dat toepassingen rechtstreeks registers van apparaten lezen en schrijven?
  10. Welke reden waarom overdracht naar de GPU sneller gaat nadat het CPU-geheugen is vastgepind (page-locked), is juist?

Vergelijkingen met deze term

Verwante termen

Via Interrupt IOMMU Microcontroller (MCU) Numerieke apertuur (NA) CPU-tijd NVMe Paginatabel GPU Cachecoherentie

Naar de woordenlijst