/ / Czy jest możliwe wykonanie transferu DMA pamięci do pamięci w systemie Linux? Jeśli tak, jaka funkcja wywołuje DMA, aby rozpocząć transfer? [zamknięte] - linux, dma

Czy możliwe jest przenoszenie DMA z pamięci do pamięci w systemie Linux? Jeśli tak, to jaka funkcja wywołuje DMA, aby rozpocząć transfer? [zamknięty] - linux, dma

Mój przyjaciel i ja próbujemy napisać urządzeniesterownik urządzenia wirtualnego (czytaj: nie PCI lub USB) dla zaawansowanej klasy systemów operacyjnych. Używamy Ubuntu 16.04. Naszym zadaniem jest wywołanie IOCTL w naszym sterowniku i nadanie mu bufora źródłowego pełnego wartości RGB (tablicy liczb całkowitych), pustego bufora docelowego i długości. Mamy wywołać kontroler DMA, aby przenieść zawartość bufora źródłowego do bufora docelowego, a następnie zastosować transformację liniową do wartości znajdujących się w buforze docelowym.

Z powodzeniem przeprowadziliśmy transformacje bez DMA i pomyślnie przydzieliliśmy kanał DMA do naszego urządzenia. Problem, który mamy, polega na tym, że nie możemy znaleźć funkcji gdziekolwiek opisuje inicjowanie transferu za pomocą DMA. Chcemy, aby po zakończeniu przerwał on przerwanie (kierowca nie powinien kręcić się w oczekiwaniu na zakończenie transferu).

Żeby było jasne, o co pytamy, po prostulubię wiedzieć, gdzie możemy znaleźć definicje funkcji opisujących ten proces. Nie pytamy o kod ani dokładną metodę wykonania tego zadania. Chcielibyśmy po prostu wiedzieć, jakie funkcje mogą być użyte i / lub jaki plik nagłówkowy znaleźć w nich. Przeglądaliśmy linux / dma-mapping.h. Przez pewien czas patrzyliśmy także na LDD3, ale wydaje się, że dokładnie przechodzi proces konfiguracji DMA bez podawania wielu informacji o tym, jakie funkcje powinny zostać użyte do faktycznego rozpoczęcia transferu DMA.

Odpowiedzi:

1 dla odpowiedzi № 1

W ostatnich jądrach Linuksa istnieją interfejsy API „DMA engine” do obsługi lokalnych silników DMA zdolnych do kopiowania pamięci na pamięć drivers/dma katalog, sprawdź, jak są realizowane:

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.

Silniki DMA są zaimplementowane w kilku urządzeniachplatformy, ale nie na każdym PC lub serwerze lub SoC. Sprawdź opcje w Kconfig, takie jak INTEL_IDMA64 "Intel zintegrowany DMA .. Intel Skylake PCH", INTEL_IOATDMA "Intel (R) I / OAT DMA silnik obecny w najnowszych chipsetach Intel Xeon."

Inną opcją jest wykorzystanie platformy wirtualizacji, takiej jak qemu, i zaimplementowanie własnej emulacji urządzenia (https://stackoverflow.com/a/44612957 urządzenie edu i prosty kierowca, http://wiki.qemu.org/Features/QOM).

Jeśli pytasz, jak zarejestrować program obsługi przerwań, powiedz nam, jaka jest twoja (wirtualna) magistrala, w jaki sposób twoje (wirtualne) urządzenie jest podłączone (i jak zaimplementowano urządzenie wirtualne). I Sterownik qemu "s" edu "pci.c ma kilka przykładów przerwań zgodnych z PCI: request_irq(pci_irq, irq_handler, IRQF_SHARED, "pci_irq_handler0", &major).