/ / Ist es möglich, Speicher-zu-Speicher-DMA-Übertragungen unter Linux durchzuführen? Wenn ja, welche Funktion ruft den DMA auf, um eine Übertragung zu beginnen? [geschlossen] - Linux, dma

Ist es möglich, Speicher-zu-Speicher-DMA-Übertragungen unter Linux durchzuführen? Wenn ja, welche Funktion ruft den DMA auf, um eine Übertragung zu beginnen? [geschlossen] - Linux, dma

Mein Freund und ich versuchen ein Gerät zu schreibenTreiber für ein virtuelles Gerät (lesen: nicht PCI oder USB) für eine erweiterte Betriebssystemklasse. Wir benutzen Ubuntu 16.04. Unsere Aufgabe besteht darin, die IOCTL in unserem Treiber aufzurufen und ihr einen Quellpuffer voller RGB-Werte (ein Array von ganzen Zahlen), einen leeren Zielpuffer und eine Länge zu geben. Wir rufen den DMA-Controller auf, um den Inhalt des Quellpuffers in den Zielpuffer zu übertragen, und wenden dann eine lineare Transformation auf die Werte im Zielpuffer an.

Wir haben die Transformationen ohne DMA erfolgreich durchgeführt und wir haben erfolgreich einen DMA-Kanal unserem Gerät zugewiesen. Das Problem, das wir haben, ist, dass wir scheinbar keine Funktion finden irgendwo Dies beschreibt das Initiieren einer Übertragung unter Verwendung der DMA. Wir möchten, dass es nach der Fertigstellung einen Interrupt auslöst (der Fahrer sollte nicht warten, bis der Transfer beendet ist).

Um klar zu sein mit dem, was wir fragen, würden wir einfachIch möchte wissen, wo wir Definitionen für Funktionen finden können, die diesen Prozess beschreiben. Wir fragen nicht nach Code oder einer genauen Methode, um diese Aufgabe zu erledigen, wir möchten einfach nur wissen, welche Funktionen verwendet werden können und / oder in welcher Header-Datei sie zu finden sind. Wir haben linux / dma-mapping.h scheinbar durchgesehen Bis zum Überdruss. Wir haben LDD3 auch eine Weile angeschaut, aber es scheint den Prozess des Einrichtens der DMA gründlich durchzugehen, ohne viel Information darüber zu geben, welche Funktionen verwendet werden sollten, um die DMA-Übertragung tatsächlich zu beginnen.

Antworten:

1 für die Antwort № 1

Es gibt "DMA engine" APIs in aktuellen Linux-Kerneln, um lokale DMA-Engines zu unterstützen, die in der Lage sind, Speicher zu speichern drivers/dma Verzeichnis, überprüfen Sie, wie sie implementiert sind:

http://elixir.free-electrons.com/linux/latest/source/drivers/dma/Kconfig

menuconfig DMADEVICES
bool "DMA Engine support"
depends on HAS_DMA
help
DMA engines can do asynchronous data transfers without
involving the host CPU.  Currently, this framework can be
used to offload memory copies in the network stack and
RAID operations in the MD driver.  This menu only presents
DMA Device drivers supported by the configured arch, it may
be empty in some cases.

DMA-Engines sind in mehreren Hardware implementiertPlattformen, aber nicht in jedem PC oder Server oder SoC. Überprüfen Sie Optionen in der Kconfig wie INTEL_IDMA64 "Intel integrierte DMA .. Intel Skylake PCH", INTEL_IOATDMA "Intel (R) I / OAT DMA-Engine in aktuellen Intel Xeon-Chipsätzen."

Eine andere Möglichkeit besteht darin, eine Virtualisierungsplattform wie qemu zu verwenden und dafür eine eigene Geräteemulation zu implementieren (https://stackoverflow.com/a/44612957 edu Gerät und einfacher Fahrer, http://wiki.qemu.org/Features/QOM).

Wenn Sie sich fragen, wie Sie den Interrupt-Handler registrieren, teilen Sie uns mit, was Ihr (virtueller) Bus ist, wie Ihr (virtuelles) Gerät angeschlossen ist (und wie Sie das virtuelle Gerät implementiert haben). Und qemu "s" edu "PCI-Treiber hat einige Beispiele für PCI-kompatible Interrupts: request_irq(pci_irq, irq_handler, IRQF_SHARED, "pci_irq_handler0", &major).