草庐IT

c - Linux 4.4 PCIe DMA 进入用户空间页面不工作 - highmem 不可用于 DMA?

我正在更新一个旧的linux驱动程序,该驱动程序通过DMA将数据传输到用户空间页面,这些页面通过get_user_pages()从应用程序向下传递。我的硬件是一个新的基于x86Xeon的主板,有12GB内存。驱动程序从VME获取数据到PCIeFPGA,并应该将其写入主内存。我为每个页面执行一个dma_map_pages(),我用dma_mapping_error()检查它并将返回的物理DMA地址写入DMAController的缓冲区描述符。然后我启动DMA。(我们还可以在FPGA跟踪器中看到传输开始)。但是,当我收到DMA完成IRQ时,我看不到任何数据。对于控制,我有相同的VME地址空

c - Linux 4.4 PCIe DMA 进入用户空间页面不工作 - highmem 不可用于 DMA?

我正在更新一个旧的linux驱动程序,该驱动程序通过DMA将数据传输到用户空间页面,这些页面通过get_user_pages()从应用程序向下传递。我的硬件是一个新的基于x86Xeon的主板,有12GB内存。驱动程序从VME获取数据到PCIeFPGA,并应该将其写入主内存。我为每个页面执行一个dma_map_pages(),我用dma_mapping_error()检查它并将返回的物理DMA地址写入DMAController的缓冲区描述符。然后我启动DMA。(我们还可以在FPGA跟踪器中看到传输开始)。但是,当我收到DMA完成IRQ时,我看不到任何数据。对于控制,我有相同的VME地址空

衔尾法解决当无法使用空闲中断以及DMA中断时配置DMA接收串口不定长数据

[Ooonly新人贴]记录工作中遇到的问题,话不多说先上干货问题:类似K线与蓝牙接收部门模块,要求由原来的接收串口中断改为DMA接收。据说要用到空闲中断与DMA中断,但是经仿真发现DMA每完成传输一个数据(比如1BYTE)就会进入空闲中断(k线发现这种情况),考虑到这样进入中断的频率和以前串口接收中断的频率差不多,所以放弃此方案,听说有的DMA具有超时中断机制(具体有没有我也没考证),但是我手上的板子经过研读芯片手册发现只有传输一半中断,传输完成中断,传输越界错误中断,所以也没法用此方案。网上有很多理解DMA接收机制的帖子,这里我就不在赘述,我个人认为其中最要紧的就是判断接收数据长度的问题因为

linux - 在用户空间使用 DMA 内存传输

是否有可供用户空间使用的linuxDMA内存到内存复制机制?我有一个Linux应用程序,它通常(每秒50-100次)必须memcpy几兆(10+)的数据。通常这不是问题,但我们已经开始看到它可能消耗过多CPU带宽的证据。目前的测量表明我们正在移动大约1Gbytes/s。我知道内核中的dma功能,我看到一些文档讨论为大内存副本构建自定义驱动程序,正是出于这个原因......但似乎有人会为此构建一个通用API目前为止。我错了吗?DMA是内核独有的功能吗?我应该澄清一下,这是针对IntelX86架构的,而不是嵌入式的。 最佳答案 Linu

linux - 在用户空间使用 DMA 内存传输

是否有可供用户空间使用的linuxDMA内存到内存复制机制?我有一个Linux应用程序,它通常(每秒50-100次)必须memcpy几兆(10+)的数据。通常这不是问题,但我们已经开始看到它可能消耗过多CPU带宽的证据。目前的测量表明我们正在移动大约1Gbytes/s。我知道内核中的dma功能,我看到一些文档讨论为大内存副本构建自定义驱动程序,正是出于这个原因......但似乎有人会为此构建一个通用API目前为止。我错了吗?DMA是内核独有的功能吗?我应该澄清一下,这是针对IntelX86架构的,而不是嵌入式的。 最佳答案 Linu

linux - Linux 中的 DMA memcpy 操作

我想使用dmaengine.c文件(linux/drivers/dma)中的dma_async_memcpy_buf_to_buf函数进行dma。为此,我在dmatest.c文件(linux/drivers/dma)中添加了一个函数,如下所示:voidfoo(){intindex=0;dma_cookie_tcookie;size_tlen=0x20000;ktime_tstart,end,end1,end2,end3;s64actual_time;u16*dest;u16*src;dest=kmalloc(len,GFP_KERNEL);src=kmalloc(len,GFP_KER

linux - Linux 中的 DMA memcpy 操作

我想使用dmaengine.c文件(linux/drivers/dma)中的dma_async_memcpy_buf_to_buf函数进行dma。为此,我在dmatest.c文件(linux/drivers/dma)中添加了一个函数,如下所示:voidfoo(){intindex=0;dma_cookie_tcookie;size_tlen=0x20000;ktime_tstart,end,end1,end2,end3;s64actual_time;u16*dest;u16*src;dest=kmalloc(len,GFP_KERNEL);src=kmalloc(len,GFP_KER

linux - PCIE linux 内核驱动程序中的流式 DMA

我正在为Linux内核开发FPGA驱动程序。代码似乎在x86上运行良好,但在x86_64上我遇到了一些问题。我实现了流式DMA。就这样get_user_pages(...);for(...){sg_set_page();}pci_map_sg();但是pci_map_sg返回了类似0xbd285800的地址,这些地址没有按PAGE_SIZE对齐,所以我无法发送完整的第一页,因为PCIE规范说"RequestsmustnotspecifyanAddress/LengthcombinationwhichcausesaMemorySpaceaccesstocrossa4-KBboundary

linux - PCIE linux 内核驱动程序中的流式 DMA

我正在为Linux内核开发FPGA驱动程序。代码似乎在x86上运行良好,但在x86_64上我遇到了一些问题。我实现了流式DMA。就这样get_user_pages(...);for(...){sg_set_page();}pci_map_sg();但是pci_map_sg返回了类似0xbd285800的地址,这些地址没有按PAGE_SIZE对齐,所以我无法发送完整的第一页,因为PCIE规范说"RequestsmustnotspecifyanAddress/LengthcombinationwhichcausesaMemorySpaceaccesstocrossa4-KBboundary

linux - 从哪里开始学习 linux DMA/设备驱动程序/内存分配

我正在移植/调试设备驱动程序(由另一个内核模块使用)并面临死胡同,因为dma_sync_single_for_device()因内核oops而失败。我不知道该功能应该做什么,谷歌搜索也无济于事,所以我可能需要全面了解这些内容。问题是,从哪里开始?哦是的,如果相关的话,代码应该在PowerPC上运行(Linux是OpenWRT)编辑:最好是在线资源(书籍需要几天才能送达:) 最佳答案 在线:AnatomyoftheLinuxslaballocatorUnderstandingtheLinuxVirtualMemoryManagerLi