Direct Memory Access: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Thijs!bot (discussione | contributi)
Collegamenti esterni: Aggiunto il template "FOLDOC"
 
(111 versioni intermedie di 74 utenti non mostrate)
Riga 1:
[[File:SistemaDMAC.jpg|thumb|upright=1.4|Funzionamento di un sistema con [http://www.ateneonline.it/bucci/ DMAC] ]]
Il '''DMA''' ('''Direct Memory Access''', «accesso diretto alla memoria») permette ad alcuni sottosistemi hardware di un [[computer]] di accedere alla memoria di sistema in lettura e/o scrittura indipendentemente dalla [[CPU]]. Il DMA è usato da molti sistemi hardware come controller di [[unità a disco]], [[scheda grafica|schede grafiche]] e [[scheda audio|schede audio]].
 
In [[informatica]] il '''Direct Memory Access''' ('''DMA''', {{Lett|accesso diretto alla memoria}}) di un [[computer]] è quel meccanismo che permette ad altri sottosistemi, quali ad esempio le [[periferica|periferiche]], di accedere direttamente alla [[memoria (informatica)|memoria]] interna per scambiare [[dati]], in lettura e/o scrittura, senza coinvolgere l'[[Unità di controllo (informatica)|unità di controllo]] (CPU) per ogni [[byte]] trasferito tramite l'usuale meccanismo dell'[[interrupt]] e la successiva richiesta dell'operazione desiderata, ma generando un singolo interrupt per blocco trasferito.<ref>{{Cita|Tanenbaum|pp. 374-375|adc}}.</ref><ref>Bucci 137-143</ref>
Il DMA è un componente essenziale di tutti i computer moderni, in quanto permette a periferiche che lavorano a velocità diverse di comunicare senza assoggettare la CPU a un enorme carico di [[interrupt]].
 
== Descrizione ==
Essenzialmente, in un trasferimento DMA un blocco di memoria viene copiato da una periferica a un'altra. 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, tramite il controllore di accesso diretto (DMAC), ha quindi il compito di gestire i dati passanti nel [[Bus (informatica)|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 del processore|ciclo di elaborazione]].
 
Il DMA è usato da molti sistemi hardware come [[controller (informatica)|controller]] di [[Disco rigido|unità a disco]], [[scheda grafica|schede grafiche]], [[schede di rete]] e [[scheda audio|schede audio]].
 
Essenzialmente, in un trasferimento DMA un blocco di memoria viene copiato da una periferica a un'altra. Il distacco del [[bus (informatica)|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'' su richiesta del DMAC. La CPU si limita a dare avvio al trasferimento rilasciando il bus dati, mentre il trasferimento vero e proprio è svolto dal '''controller DMA''' (DMAC). Un caso tipico è lo spostamento di un blocco di memoria da unità di memoria esterna alla [[memoria primaria|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 dei due [[registro (informatica)|registri]] DC (Data Counter) e IOAR (Input/Output Address Register). 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 mantenga 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 durante il quale alla CPU è interdetto l'accesso al bus dati è 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 se tale istruzione 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 siglaacronimo '''DRQ'''DMREQ sta per ''DMA RequestREQuest'' (richiesta di DMA);. laL'acronimo duale '''DACK'''DMACK sta per ''DMA AcknowledgeACKnowledgement'' (accettazione di DMA).
 
== Funzionamento ==
Il chip DMA ha al suo interno almeno quattro registri accessibili dal software in esecuzione nella CPU:
# Il primo contiene l'indirizzo di memoria di partenza per la lettura o la scrittura
# Il secondo conta il numero di byte (o parole) da trasferire
# Il terzo specifica il numero di dispositivo o lo spazio d'indirizzamento di I/O da usare, il che determina il dispositivo di I/O desiderato
# Il quarto determina se i dati vanno letti dal dispositivo di I/O oppure se devono essere scritti su di esso
 
Quindi per trasferire un blocco di 32 byte dall'indirizzo di memoria 100 al terminale (sia questo il dispositivo 4) la CPU scrive i numeri 100, 32 e 4 nei primi tre registri DMA, più il codice per la scrittura (in questo caso supponiamo essere 1) nel quarto registro. A questo punto il DMA effettua una richiesta di bus per leggere il byte 100 dalla memoria, analogamente a come farebbe la CPU. Una volta ottenuto il byte, il controllore DMA effettuerebbe una richiesta di I/O al dispositivo 4 finalizzata alla scrittura del byte. Dopo il completamento di queste operazioni, il controllore DMA incrementa di 1 il suo registro d'indirizzo e decrementa di 1 il suo registro contatore. Se il registro contatore è ancora positivo, si prosegue con la lettura di memoria di un altro byte e con la relativa scrittura nel dispositivo.
 
Infine quando il contatore si azzera, il controllore DMA smette di trasferire dati e manda un impulso sulla linea di interrupt collegata al chip della CPU. In presenza di DMA, la CPU deve solo inizializzare pochi registri, dopo di che è libera di svolgere altri compiti fino al completamento del trasferimento, segnalato da un interrupt proveniente dal controllore DMA. Alcuni controllori DMA dispongono di due, tre o più insiemi di registri per controllare trasferimenti simultanei.
 
Anche se con il DMA la CPU viene sollevata dal carico pesante dell'I/O, il procedimento non è del tutto gratuito. Se un dispositivo ad alta velocità, come per esempio un disco, è in fase di trasferimento controllato dal DMA, ci vorranno molti cicli di bus per gli accessi alla memoria e al dispositivo. Durante questi cicli la CPU deve restare in attesa (il DMA ha una priorità di bus sempre maggiore di quella della CPU, perché i dispositivi di I/O difficilmente tollerano ritardi). Il fenomeno che si verifica quando il controllore DMA sottrae cicli di bus alla CPU si dice '''appropriazione di cicli''' (''cycle stealing'', "furto di cicli"). Nientemeno il guadagno che si ottiene nel non dover gestire un interrupt per byte (o per parola) ripaga largamente del danno causato dall'appropriazione di cicli.
 
== Note ==
<references />
 
== Bibliografia ==
* {{cita libro|autore=[[Andrew Stuart Tanenbaum]]|titolo=Architettura dei calcolatori. Un approccio strutturale|editore=Pearson Education|città=Milano|anno=2006|url=http://books.google.it/books?id=hK8lJ4BPOYcC|isbn=978-88-7192-271-3|cid=adc}}
* {{cita libro|autore=[[Giacomo Bucci]]|titolo=Architetture dei calcolatori elettronici|editore=McGraw-Hill|città=Milano|anno=2001|isbn=88 386 0889-X}}
 
== Voci correlate ==
* [[Input/Output|I/O]]
 
* [[Remote Direct Memory Access]]
== Altri progetti ==
{{interprogetto|preposizione=sul}}
 
== Collegamenti esterni ==
* {{FOLDOC}}
* [httphttps://www.xml.com/ldd/chapter/book/ch13.html mmap() and DMA], da ''Linux Device Drivers, 2nd Edition'', Alessandro Rubini & Jonathan Corbet
* [http://www.eventhelix.com/RealtimeMantra/FaultHandling/dma_interrupt_handling.htm DMA and Interrupt Handling]
* {{cita web | 1 = http://www.eventhelix.com/RealtimeMantra/FaultHandling/dma_interrupt_handling.htm | 2 = DMA and Interrupt Handling | accesso = 28 aprile 2005 | urlarchivio = https://web.archive.org/web/20140525063518/http://www.eventhelix.com/RealtimeMantra/FaultHandling/dma_interrupt_handling.htm | dataarchivio = 25 maggio 2014 | urlmorto = sì }}
*[https://web.archive.org/web/20141222123532/http://www.uniroma2.it/didattica/MSM-S/deposito/Lucidi_11_-_DMA.pdf Direct Memory Access]
 
{{Bus computer}}
[[Categoria:Memorie informatiche]]
{{Controllo di autorità}}
{{Portale|informatica}}
 
[[Categoria:Gestione input/output]]
[[bs:DMA]]
[[Categoria:Tecnologie di memorizzazione]]
[[cs:DMA]]
[[Categoria:MemorieScheda informatichemadre]]
[[de:Speicherdirektzugriff]]
[[en:Direct memory access]]
[[es:Acceso directo a memoria]]
[[fi:Oikosiirto]]
[[fr:Accès direct à la mémoire]]
[[gl:Acceso directo á memoria]]
[[hr:DMA]]
[[ja:Direct Memory Access]]
[[ko:기억 직접 접근]]
[[ms:Capaian ingatan terus]]
[[nl:Direct Memory Access]]
[[no:Direkte minnetilgang]]
[[pl:DMA]]
[[pt:DMA]]
[[ru:DMA]]
[[sk:Priamy prístup do pamäte]]
[[sv:DMA]]
[[tr:Doğrudan bellek erişimi]]
[[zh:直接記憶體存取]]