Я хочу как можно быстрее получить данные с аппаратного устройства PCIe с поддержкой DMA в пользовательском пространстве.
В: Как объединить "прямой ввод-вывод в пользовательское пространство с/и/через передачу DMA"
-
Чтение через LDD3, кажется, мне нужно выполнить несколько разных типов операций ввода-вывода!?
dma_alloc_coherent
дает мне физический адрес, который я могу передать на аппаратное устройство. Но нужно будет установитьget_user_pages
и выполнить вызов типаcopy_to_user
при завершении передачи. Это кажется пустой тратой, попросив устройство DMA в память ядра (действуя как буфер), а затем передав его снова в пространство пользователя. LDD3 p453:/* Only now is it safe to access the buffer, copy to user, etc. */
-
Что я в идеале хочу, это некоторая память, которая:
- Я могу использовать в пользовательском пространстве (возможно, запрашивать драйвер через вызов ioctl для создания DMA'able memory/buffer?)
- Я могу получить физический адрес, чтобы перейти на устройство, чтобы все пользовательское пространство должно было выполнять чтение на драйвере
- метод чтения активирует передачу DMA, блок ожидает полного прерывания DMA и освобождает считывание пользовательского пространства (пространство пользователя теперь безопасно использовать/читать память).
Нужны ли мне однопоточные потоковые сопоставления, сопоставление настроек и буферы пользовательского пространства, отображаемые с помощью get_user_pages
dma_map_page
?
Мой код до сих пор устанавливает get_user_pages
по указанному адресу из пользовательского пространства (я называю это частью прямого ввода-вывода). Затем dma_map_page
со страницей get_user_pages
. Я передаю устройству возвращаемое значение от dma_map_page
в качестве адреса физической передачи DMA.
Я использую некоторые модули ядра в качестве ссылки: drivers_scsi_st.c
и drivers-net-sh_eth.c
. Я бы посмотрел на бесконечный код, но не мог найти, какой из них самый простой!
Большое спасибо заранее.