/ / Възможно ли е да се правят DMA прехвърляния на памет в паметта в Linux? Ако е така, каква функция извиква DMA да започне прехвърляне? [затворен] - Linux, dma

Възможно ли е да се правят трансфери DMA от памет в памет в Linux? Ако е така, каква функция извиква DMA да започне трансфера? [затворен] - linux, dma

Моят приятел и аз се опитваме да напишем устройстводрайвер за виртуално устройство (четене: не PCI или USB) за клас на усъвършенствани операционни системи. Използваме Ubuntu 16.04. Нашата задача е да извикаме IOCTL в нашия драйвер и да му дадем източник на буфер, пълен с RGB стойности (масив от цели числа), празен целеви буфер и дължина. Ние трябва да извикаме DMA контролера за прехвърляне на съдържанието на изходния буфер в целевия буфер, след това да приложите линейна трансформация към стойностите на мястото в буфера за местоназначение.

Успешно направихме трансформациите без DMA и успешно разпределихме DMA канал към нашето устройство. Въпросът, който имаме, е, че не можем да намерим функция навсякъде който описва инициирането на прехвърляне чрез DMA. Искаме да го накараме да прекъсне прекъсването след приключване (водачът не трябва да се върти, чакащ трансфера да приключи).

За да сме наясно с това, което искаме, бихме искалиискам да знам къде можем да намерим определения за функции, описващи този процес. Ние не искаме код или точен метод за завършване на тази задача; просто бихме искали да знаем какви функции могат да се използват и / или какъв заглавен файл да ги открием. Погледнахме през linux / dma-mapping.h привидно Ние също погледнахме LDD3 за известно време, но изглежда, че преминава през процеса на създаване на DMA, без да даваме много информация за това какви функции трябва да се използват, за да започне действително DMA прехвърлянето.

Отговори:

1 за отговор № 1

Има интерфейси на "DMA engine" в новите ядра на Linux, които поддържат местните DMA двигатели, способни да копират памет в памет drivers/dma директория, проверете как се прилагат:

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 Двигателите се изпълняват в няколко хардуераплатформи, но не във всеки компютър или сървър или SoC. Проверете опциите в Kconfig като INTEL_IDMA64 "Intel интегриран DMA .. Intel Skylake PCH", INTEL_IOATDMA "Intel (R) I / OAT DMA двигател присъства в последните Intel Xeon чипсети."

Друга възможност е да използвате някаква платформа за виртуализация като qemu и да реализирате собствена емулация на устройството за нея (https://stackoverflow.com/a/44612957 edu устройство и прост шофьор, http://wiki.qemu.org/Features/QOM).

Ако питате как да регистрирате прекъсвача, кажете ни каква е вашата (виртуална) шина, как е свързано вашето (виртуално) устройство (и как сте реализирали виртуалното устройство). И qemu "s" edu pci.c драйвера има някои примери за PCI-съвместими прекъсвания: request_irq(pci_irq, irq_handler, IRQF_SHARED, "pci_irq_handler0", &major).