Che cos'è la mappatura DMA e il motore DMA nel contesto del kernel Linux? Quando l'API di mappatura DMA e l'API del motore DMA possono essere utilizzate in Linux Device Driver? Qualsiasi esempio di driver di dispositivo Linux reale come riferimento sarebbe ottimo.Che cos'è la mappatura DMA e il motore DMA nel contesto del kernel linux?
risposta
dmaengine è un framework kernel generico per lo sviluppo di driver di controller DMA.
È possibile leggere: dmaengine provider . Puoi trovare numerosi esempi di driver dmaengine sotto drivers/dma.
Ha bisogno anche di una risposta alla prima parte della domanda. Vedi il mio commento sopra. – 0andriy
Che cos'è la mappatura DMA e il motore DMA nel contesto del kernel Linux?
Il kernel utilizza normalmente l'indirizzo virtuale. Funzioni come kmalloc()
, vmalloc()
normalmente restituiscono l'indirizzo virtuale. Può essere memorizzato in void*
. Il sistema di memoria virtuale converte questi indirizzi in indirizzi fisici. Questi indirizzi fisici non sono effettivamente utili per i conducenti. I conducenti devono utilizzare ioremap()
per mappare lo spazio e produrre un indirizzo virtuale.
CPU CPU Bus
Virtual Physical Address
Address Address Space
Space Space
+-------+ +------+ +------+
| | |MMIO | Offset | |
| | Virtual |Space | applied | |
C +-------+ --------> B +------+ ----------> +------+ A
| | mapping | | by host | |
+-----+ | | | | bridge | | +--------+
| | | | +------+ | | | |
| CPU | | | | RAM | | | | Device |
| | | | | | | | | |
+-----+ +-------+ +------+ +------+ +--------+
| | Virtual |Buffer| Mapping | |
X +-------+ --------> Y +------+ <---------- +------+ Z
| | mapping | RAM | by IOMMU
| | | |
| | | |
+-------+ +------+
Se dispositivo supporta DMA, il driver imposta fino tampone con kmalloc
o simile interfaccia che restituisce indirizzo virtuale (X). Il sistema di memoria virtuale associa X ad un indirizzo fisico (Y) nella RAM di sistema. Il driver può utilizzare l'indirizzo virtuale X per accedere al buffer, ma il dispositivo stesso non può perché DMA non passa attraverso il sistema di memoria virtuale della CPU. Solo in alcuni sistemi Device può eseguire direttamente DMA su indirizzo fisico. In qualche sistema IOMMU hardware viene utilizzato per tradurre l'indirizzo DMA a address.Look fisica alla figura sopra si traducono Z Y.
Quando DMA mappatura API può essere utilizzata in Linux dispositivo driver?
motivo per utilizzare il DMA mappatura API è guidatore può tornare virtuale indirizzo X per interfacciarsi come dma_map_single()
, che setta ogni necessaria IOMMU mappatura e restituisce il driver Z.The indirizzo DMA poi dice al dispositivo per fare DMA Z, e IOMMU lo associa al buffer all'indirizzo Y nel sistema RAM.
Il riferimento è preso da this link.
Qualsiasi esempio di driver di dispositivo Linux reale come riferimento sarebbe ottimo.
All'interno del kernel di Linux si può guardare a drivers/dma per vari driver reali.
Puoi per favore indicare il driver nell'albero dei sorgenti del kernel su http://lxr.free-electrons.com come esempio reale del concetto? – JagsVG
attendi qualche istante aggiornerò la risposta –
@JagsVG soddisfatto o ti aspetti qualcos'altro? –
La mappatura DMA è una conversione dalla memoria virtuale indirizzata a una memoria che è in grado DMA su indirizzi fisici (in realtà indirizzi bus). Devi leggere una documentazione del kernel per quel https://www.kernel.org/doc/Documentation/DMA-API-HOWTO.txt – 0andriy
Scusa @AndyShevchenko Non ho avuto alcuna idea che tu abbia postato un commento. Stavo scrivendo la risposta prima del tuo commento. Spero non ti dispiaccia aver risposto alla domanda. –