Direct Memory Access
Il DMA (Direct Memory Access, «accesso diretto alla memoria») è un meccanismo che permette ad alcuni sottosistemi hardware di un computer (periferiche) di accedere direttamente alla memoria di sistema, in lettura e/o scrittura, per scambiarsi dati senza tirare in causa la CPU tramite l'interrupt e la successiva richiesta di operazione desiderata ovvero lo scambio di dati tra i due sottosistemi. Il DMA ha quindi il compito di gestire i dati passanti nel BUS permettendo a periferiche che lavorano a velocità diverse di comunicare senza assoggettare la CPU a un enorme carico di interrupt che ne interromperebbero continuamente il rispettivo ciclo di elaborazione.
Il DMA è usato da molti sistemi hardware come controller di unità a disco, schede grafiche e schede audio.
Essenzialmente, in un trasferimento DMA un blocco di memoria viene copiato da una periferica a un'altra. Il distacco del bus dati dal processore per assegnarlo al controllo del DMA, che questi utilizza per il trasferimento dei dati tra le due periferiche, avviene tramite dei bus switches. La CPU si limita a dare avvio al trasferimento, mentre il trasferimento vero e proprio è svolto dal controller DMA. Un caso tipico è lo spostamento di un blocco di memoria da unità di memoria esterna alla memoria principale. Se questa operazione, come avviene grazie al DMA, non blocca il processore, esso può continuare a svolgere altre operazioni.
Il DMA gestisce i trasferimenti tra CPU e periferiche tramite l'utilizzo di diverse linee (Acknowledge, richiesta, controllo) e di due registri (DC e IOAR). Nel momento in cui la CPU necessita di dati presenti in memoria carica in IOAR l'indirizzo dal quale iniziare l’operazione e in DC il numero di dati consecutivi da trattare, informando il DMA su un ulteriore bit se si tratta di un’operazione di lettura o scrittura. A questo punto il DMA invia la richiesta alla periferica e nel momento in cui riceve il segnale di acknowledge inizia il trasferimento. Ad ogni passo viene incrementato IOAR e decrementato DC finché DC non è uguale a 0.
Il trasferimento tra DMA e I/O può avvenire in diversi modi:
- Burst Transfer: Prevede che una volta iniziato il trasferimento il DMA mantiene il controllo del BUS a discapito della CPU, finché esso non è terminato: l'accesso al bus da parte della CPU resta negato durante tutto il trasferimento. Ciò presuppone che la periferica e la memoria consentano un trasferimento tanto veloce e duraturo quanto necessita il DMA Controller;
- Cycle Stealing: Il DMA esegue il trasferimento di parole un solo ciclo completo alla volta (cioè per ogni ciclo si interfaccia con la periferica ed esegue il trasferimento solo se è pronta, in altre parole effettuando un handshaking). Come risultato il tempo nel quale la CPU è bloccata è più frammentato;
- Transparent/Hidden: Il DMA occupa il BUS solo quando la CPU non ne ha bisogno. Per far sì che ciò avvenga il DMA sorveglia la CPU e inizia un ciclo di bus solo se l'istruzione in esecuzione nella CPU è abbastanza lunga da consentirlo (e ovviamente non riguarda trasferimenti sul BUS).
La tecnica del DMA "scatter-gather" permette il trasferimento di dati verso più regioni di memoria nel corso di una singola transazione DMA. Il risultato è equivalente a quello che si avrebbe con una catena di normali richieste DMA, ma in questo modo si alleggerisce ulteriormente la CPU da interrupt e operazioni di copia di dati.
La sigla "DRQ" sta per DMA Request (richiesta di DMA); la duale "DACK" sta per DMA Acknowledge (accettazione di DMA).
Voci correlate
Collegamenti esterni
- mmap() and DMA, da Linux Device Drivers, 2nd Edition, Alessandro Rubini & Jonathan Corbet
- DMA and Interrupt Handling