GNU/Linux >> Linux Esercitazione >  >> Linux

Qual è la differenza tra DMA e IO mappato in memoria?

IO mappato in memoria significa che i registri del dispositivo sono mappati nello spazio di memoria della macchina:quando quelle regioni di memoria vengono lette o scritte dalla CPU, sta leggendo o scrivendo sul dispositivo, piuttosto che sulla memoria reale. Per trasferire i dati dal dispositivo a un vero e proprio buffer di memoria, la CPU deve leggere i dati dai registri del dispositivo mappati in memoria e scriverli nel buffer (e viceversa per trasferire i dati al dispositivo).

Con un trasferimento DMA, il dispositivo è in grado di trasferire direttamente i dati da o verso un vero buffer di memoria stesso. La CPU comunica al dispositivo la posizione del buffer, quindi può eseguire altre operazioni mentre il dispositivo accede direttamente alla memoria.


Dato che altri hanno già risposto alla domanda, aggiungerò solo un po' di storia.

Ai vecchi tempi, sull'hardware x86 (PC), c'era solo spazio I/O e spazio di memoria. Si trattava di due diversi spazi di indirizzi, a cui si accedeva con diversi protocolli di bus e diverse istruzioni della CPU, ma in grado di comunicare tramite lo stesso slot per schede plug-in.

La maggior parte dei dispositivi utilizzava lo spazio I/O sia per l'interfaccia di controllo che per l'interfaccia di trasferimento dei dati in blocco. Il modo più semplice per accedere ai dati era eseguire molte istruzioni della CPU per trasferire i dati una parola alla volta da un indirizzo I/O a un indirizzo di memoria (a volte noto come "bit-banging").

Per spostare i dati dai dispositivi alla memoria host in modo autonomo, non c'era supporto nel protocollo del bus ISA per i dispositivi per avviare i trasferimenti. È stata inventata una soluzione di compromesso:il controller DMA. Si trattava di un componente hardware che si trovava accanto alla CPU e avviava i trasferimenti per spostare i dati dall'indirizzo I/O di un dispositivo alla memoria o viceversa. Poiché l'indirizzo I/O è lo stesso, il controller DMA sta eseguendo esattamente le stesse operazioni di una CPU, ma in modo un po' più efficiente e consentendo una certa libertà di continuare a funzionare in background (anche se forse non per molto tempo parlare con la memoria).

Avanti veloce ai giorni del PCI e i protocolli del bus sono diventati molto più intelligenti:qualsiasi dispositivo può avviare un trasferimento. Quindi è possibile, ad esempio, che una scheda controller RAID sposti tutti i dati che desidera da o verso l'host in qualsiasi momento lo desideri. Questa è chiamata modalità "bus master", ma per nessun motivo particolare le persone continuano a riferirsi a questa modalità come "DMA" anche se il vecchio controller DMA è scomparso da tempo. A differenza dei vecchi trasferimenti DMA, spesso non esiste alcun indirizzo I/O corrispondente e la modalità bus master è spesso l'unica interfaccia presente sul dispositivo, senza alcuna modalità "bit-banging" della CPU.


L'I/O mappato in memoria consente alla CPU di controllare l'hardware leggendo e scrivendo specifici indirizzi di memoria. Di solito, questo verrebbe utilizzato per operazioni a bassa larghezza di banda come la modifica dei bit di controllo.

DMA consente all'hardware di leggere e scrivere direttamente la memoria senza coinvolgendo la CPU. Di solito, questo verrebbe utilizzato per operazioni a larghezza di banda elevata come l'I/O del disco o l'ingresso video della videocamera.

Ecco un documento che presenta un confronto approfondito tra MMIO e DMA.

Linee guida di progettazione per sistemi RDMA ad alte prestazioni


Direct Memory Access (DMA) è una tecnica per trasferire i dati dall'I/O alla memoria e dalla memoria all'I/O senza l'intervento della CPU. A tale scopo viene utilizzato un apposito chip, denominato controller DMA, per il controllo di tutte le attività e la sincronizzazione dei dati. Di conseguenza, rispetto ad altre tecniche di trasferimento dati, il DMA è molto più veloce.

D'altra parte, la memoria virtuale funge da cache tra la memoria principale e la memoria secondaria. I dati vengono prelevati in anticipo dalla memoria secondaria (disco rigido) nella memoria principale in modo che i dati siano già disponibili nella memoria principale quando necessario. Ci consente di eseguire più applicazioni sul sistema di quante ne abbiamo abbastanza memoria fisica da supportare.


Linux
  1. Qual è la differenza tra InnoDB e MyISAM?

  2. Qual è la differenza tra memoria buffer e cache in Linux?

  3. Qual è la differenza tra DMA-Engine e DMA-Controller?

  4. Qual è la differenza tra fsck ed e2fsck?

  5. Qual è la differenza tra `su -` e `su --login`?

Qual è la differenza tra Linux e Unix?

Qual è la differenza tra Login e Non-Login Shell

Qual è la differenza tra il comando apt e apt-get?

Che cos'è un hypervisor? Qual è la differenza tra il tipo 1 e 2?

Qual è la differenza tra curl e Wget?

Qual è la differenza tra $(CC) e $CC?