Was ist DMA-Mapping und DMA-Engine im Kontext von Linux-Kernel? Wann können die DMA-Mapping-API und die DMA-Engine-API im Linux-Gerätetreiber verwendet werden? Jeder echte Linux Device Driver Beispiel als Referenz wäre toll.Was ist DMA-Mapping und DMA-Engine im Kontext von Linux-Kernel?
Antwort
dmaengine ist ein generisches Kernel-Framework zur Entwicklung eines DMA-Controller-Treibers. Sie können lesen: dmaengine provider . Sie finden zahlreiche Beispiele für dmaengine Treiber unter drivers/dma.
Es braucht auch eine Antwort auf den ersten Teil der Frage. Siehe meinen obigen Kommentar. – 0andriy
Was ist DMA-Mapping und DMA-Engine im Kontext von Linux-Kernel?
Der Kernel verwendet normalerweise virtuelle Adresse. Funktionen wie kmalloc()
, vmalloc()
geben normalerweise die virtuelle Adresse zurück. Es kann in void*
gespeichert werden. Das virtuelle Speichersystem wandelt diese Adressen in physikalische Adressen um. Diese physischen Adressen sind für Treiber nicht wirklich nützlich. Treiber müssen ioremap()
verwenden, um den Speicherplatz abzubilden und eine virtuelle Adresse zu erstellen.
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
| | | |
| | | |
+-------+ +------+
Wenn Gerät DMA unterstützt, setzt der Fahrer up-Puffer kmalloc
oder ähnliche Schnittstelle, die virtuelle Adresse zurückgibt (X). Das virtuelle Speichersystem ordnet X einer physikalischen Adresse (Y) im System-RAM zu. Der Treiber kann die virtuelle Adresse X verwenden, um auf den Puffer zuzugreifen, aber das Gerät selbst kann nicht, weil DMA das virtuelle CPU-Speichersystem nicht durchläuft. In einigen Systemen kann nur Device DMA direkt an die physikalische Adresse senden. In einigem System IOMMU Hardware wird verwendet, DMA-Adresse in physikalischer address.Look auf der Figur zu übersetzen darüber Z
Wenn DMA-Mapping API in Linux Device Treiber verwendet werden Y übersetzen?
Reason DMA Mapping-API zu verwenden ist Fahrer virtuelle Adresse X zurückkehren dergleichen dma_map_single()
bis Interface, welches einrichtet jede IOMMU erforderlich Mapping und liefert die DMA-Adresse Z.The Fahrer teilt dann das Gerät tun DMA Z, und die IOMMU ordnet es dem Puffer an der Adresse Y im System RAM zu.
Referenz ist this link.
Jeder echte Linux Device Driver Beispiel als Referenz wäre toll.
Innerhalb Linux-Kernel können Sie auf drivers/dma für verschiedene reale Treiber suchen.
Könnten Sie bitte den Treiber im Kernel-Source-Tree auf http://lxr.free-electronics.com für ein echtes Beispiel des Konzepts nennen? – JagsVG
warten Sie eine Weile Ich werde die Antwort aktualisieren –
@JagsVG zufrieden oder erwarten Sie etwas anderes? –
DMA-Mapping ist eine Konvertierung von virtuell adressiertem Speicher in einen Speicher, der auf physikalischen Adressen (eigentlich Busadressen) DMA-fähig ist. Sie müssen eine Kernel-Dokumentation für das https://www.kernel.org/doc/Documentation/DMA-API-HOWTO.txt lesen – 0andriy
Sorry @AndyShevchenko Ich hatte keine Ahnung, dass Sie Kommentar gepostet haben. Ich schrieb die Antwort vor deinem Kommentar. Ich hoffe es macht dir nichts aus Ich habe die Frage beantwortet. –