DMA (Direct Memory Access) to mechanizm sprzętowy, który pozwala urządzeniom — kartom sieciowym, dyskom, kontrolerom audio czy GPU — przesyłać dane bezpośrednio do i z pamięci RAM, z pominięciem procesora. Zamiast kazać CPU ręcznie kopiować każdy bajt, oddajesz tę robotę wyspecjalizowanemu kontrolerowi DMA, a procesor w tym czasie zajmuje się czymś sensowniejszym.
Jak to działa i po co
Bez DMA każdy transfer danych odbywa się przez tzw. programmed I/O — procesor odczytuje porcję danych z urządzenia do swojego rejestru, a potem zapisuje ją do pamięci. Przy kopiowaniu kilkuset megabajtów z dysku to tak, jakbyś przelewał basen łyżeczką: działa, ale CPU nie robi nic poza taszczeniem bajtów i nie może obsłużyć niczego innego.
Przy DMA procesor tylko ustawia transfer: podaje kontrolerowi adres źródłowy, docelowy i liczbę bajtów, po czym mówi „budź mnie, jak skończysz”. Kontroler DMA przejmuje magistralę i sam przepycha dane do RAM. Gdy transfer się zakończy, zgłasza przerwanie (interrupt), a CPU wraca do tematu. Dzięki temu rośnie przepustowość i spada obciążenie procesora — fundament wydajnego I/O w każdym współczesnym systemie.
Przykład z praktyki
Najbardziej namacalny przykład to DMA-API w jądrze Linuksa. Sterownik urządzenia, zamiast zwykłego kmalloc, rezerwuje bufor spójny z pamięcią urządzenia funkcją dma_alloc_coherent() i przekazuje sprzętowi adres DMA. Efekty zobaczysz gołym okiem: skopiuj duży plik na dysk NVMe i sprawdź top — użycie CPU pozostaje niskie, bo to kontroler, a nie procesor, przerzuca dane. Podobnie działa DMA-BUF przy współdzieleniu buforów między GPU a dekoderem wideo.
Częste błędy i mity
- „DMA jest zawsze szybsze” — przy malutkich transferach narzut na konfigurację i obsługę przerwania potrafi przeważyć zysk; dla kilku bajtów programmed I/O bywa szybsze.
- Cache coherency — na architekturach bez sprzętowej spójności musisz ręcznie unieważniać/synchronizować cache (
dma_sync_single_for_cpu()), inaczej przeczytasz nieaktualne dane. - Bezpieczeństwo — urządzenie z dostępem do DMA może czytać dowolny obszar RAM. Stąd ataki przez Thunderbolt/FireWire i dlatego istnieje IOMMU, które ogranicza, do której pamięci urządzenie ma prawo sięgać.
Pojęcia powiązane: kontroler DMA, IOMMU, przerwania (interrupts), programmed I/O, bus mastering, cache coherency, DMA-BUF, NVMe.