是否有可供用户空间使用的linuxDMA内存到内存复制机制?我有一个Linux应用程序,它通常(每秒50-100次)必须memcpy几兆(10+)的数据。通常这不是问题,但我们已经开始看到它可能消耗过多CPU带宽的证据。目前的测量表明我们正在移动大约1Gbytes/s。我知道内核中的dma功能,我看到一些文档讨论为大内存副本构建自定义驱动程序,正是出于这个原因......但似乎有人会为此构建一个通用API目前为止。我错了吗?DMA是内核独有的功能吗?我应该澄清一下,这是针对IntelX86架构的,而不是嵌入式的。 最佳答案 Linu
我想使用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
我想使用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内核开发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内核开发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
我正在移植/调试设备驱动程序(由另一个内核模块使用)并面临死胡同,因为dma_sync_single_for_device()因内核oops而失败。我不知道该功能应该做什么,谷歌搜索也无济于事,所以我可能需要全面了解这些内容。问题是,从哪里开始?哦是的,如果相关的话,代码应该在PowerPC上运行(Linux是OpenWRT)编辑:最好是在线资源(书籍需要几天才能送达:) 最佳答案 在线:AnatomyoftheLinuxslaballocatorUnderstandingtheLinuxVirtualMemoryManagerLi
我正在移植/调试设备驱动程序(由另一个内核模块使用)并面临死胡同,因为dma_sync_single_for_device()因内核oops而失败。我不知道该功能应该做什么,谷歌搜索也无济于事,所以我可能需要全面了解这些内容。问题是,从哪里开始?哦是的,如果相关的话,代码应该在PowerPC上运行(Linux是OpenWRT)编辑:最好是在线资源(书籍需要几天才能送达:) 最佳答案 在线:AnatomyoftheLinuxslaballocatorUnderstandingtheLinuxVirtualMemoryManagerLi
linux有异步memcpy函数吗?我希望它与DMA一起工作并在完成时通知我。 最佳答案 据我所知,CPU不会/不能对自己执行DMA。因此,您需要总线上的外部硬件来为您完成这项工作。然而,大多数硬件无法寻址所有物理内存,因此除非您在用例中对内存地址范围有非常严格的定义,否则不可能进行精确的memcpy克隆。否则内核将不得不将该blockmemcpy到您自己的内存块本身,这首先会破坏克隆memcpy的目的:)但是如果你想在不使用memcpy的情况下创建内存块的“克隆”(顺便说一下,这仍然是一个坏主意,因为DMA内存访问通常比CPU慢)
linux有异步memcpy函数吗?我希望它与DMA一起工作并在完成时通知我。 最佳答案 据我所知,CPU不会/不能对自己执行DMA。因此,您需要总线上的外部硬件来为您完成这项工作。然而,大多数硬件无法寻址所有物理内存,因此除非您在用例中对内存地址范围有非常严格的定义,否则不可能进行精确的memcpy克隆。否则内核将不得不将该blockmemcpy到您自己的内存块本身,这首先会破坏克隆memcpy的目的:)但是如果你想在不使用memcpy的情况下创建内存块的“克隆”(顺便说一下,这仍然是一个坏主意,因为DMA内存访问通常比CPU慢)
LDD3(p:453)使用作为参数传入的缓冲区演示dma_map_single。bus_addr=dma_map_single(&dev->pci_dev->dev,buffer,count,dev->dma_dir);Q1:这个缓冲区来自什么/哪里?kmalloc?Q2:为什么DMA-API-HOWTO.txt声明我可以使用原始kmalloc进行DMA访问?表格http://www.mjmwired.net/kernel/Documentation/DMA-API-HOWTO.txtL:51Ifyouacquiredyourmemoryviathepageallocatorkmall