Articles of dma

什么是Linux内核的DMA映射和DMA引擎?

什么是Linux内核的DMA映射和DMA引擎? 当DMA映射API和DMA引擎API可以在Linux设备驱动程序中使用? 任何真正的Linux设备驱动程序示例作为参考将是很好的。

Linux:如何将物理连续区域的序列映射到用户空间?

在我的驱动程序中,我有一定数量的物理上连续的DMA缓冲区(例如,每个4MB长)从设备接收数据。 它们由硬件使用SG列表处理。 由于收到的数据将经过深入处理,我不想closurescaching,我将在每个缓冲区填充DMA后使用dma_sync_single_for_cpu 。 为了简化数据处理,我希望这些缓冲区在用户空间中显示为一个巨大的,连续的循环缓冲区。 在单个缓冲区的情况下,我只需使用remap_pfn_range或dma_mmap_coherent 。 但是,我不能多次使用这些函数来映射连续的缓冲区。 当然,我可以在vm_operations中执行错误操作,find右边缓冲区中相应页面的pfn,并用vm_insert_pfn把它插入到vma中 。 收购将会非常快,所以当真正的数据到达时,我无法处理映射。 但这可以很容易地解决。 为了在数据采集开始之前准备好所有映射,我可以在开始采集之前简单地读取应用程序中的整个mmapped缓冲区,以便在第一个数据到达时已经插入所有页面。 基于故障的技巧应该可以工作,但也许有更优雅的东西? 只需要一个函数,可以多次调用来逐步构build整个映射? 额外的困难是解决scheme应该适用于(从最小的调整)到从2.6.32到最新的内核。 PS。 我已经看到那个讨厌的职位 。 如果应用程序试图向mmapped缓冲区写入数据(仅执行数据处理),有没有危险,我的精心构build的映射将被COW销毁?

Linux内核设备驱动程序DMA进入内核空间

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.txt L:51如果通过页面分配器kmalloc()获取了内存,那么可以使用从这些例程返回的地址来从内存中获取内存。 L:74你不能把kmap()调用和DMA返回给它。 所以我可以将从kmalloc返回的地址传递给我的硬件设备? 还是应该先运行virt_to_bus ? 或者我应该通过这个dma_map_single ? 问题3 :当DMA传输完成后,我可以通过kmalloc地址读取内核驱动程序中的数据吗? addr = kmalloc(…); … printk("test result : 0x%08x\n", addr[0]); Q4 :什么是最好的方式来获得这个用户空间? copy_to_user ? mmap的kmalloc内存? 其他?

从哪里开始学习有关Linux DMA /设备驱动程序/内存分配

我正在移植/debugging一个设备驱动程序(由另一个内核模块使用),并面临死胡同,因为dma_sync_single_for_device()失败与内核oops。 我不知道这个function应该做什么,Google使用google并没有什么帮助,所以我可能需要更多地了解这个function。 问题是,从哪里开始? 哦,是的,如果是相关的,代码应该运行在PowerPC上(而Linux是OpenWRT) 编辑:在线资源优先(书籍需要几天交付:)

数据包被捕获后会发生什么?

我一直在阅读网卡捕获数据包后发生的事情,而我越读越多,我就感到困惑。 首先,我已经阅读了传统的网卡捕获数据包之后,它被复制到内核空间的一块内存,然后到用户空间的任何应用程序,然后在数据包的数据。 然后我读了关于DMA的信息,NIC直接将数据包复制到内存中,绕过CPU。 那么是网卡 – >内核内存 – >用户空间内存stream量仍然有效? 另外,大多数NIC(如Myricom)是否使用DMA来提高数据包捕获率? 其次,RSS(接收端缩放)在Windows和Linux系统中的工作是否类似? 我只能在MSDN文章中find有关RSS如何工作的详细解释,其中讨论了RSS(和MSI-X)如何在Windows Server 2008上工作。但RSS和MSI-X的相同概念仍然适用于Linux系统, ? 谢谢。 问候,Rayne

如何在Linux内核模块中分配由1GB HugePages支持的DMA缓冲区?

我正在尝试为HPC工作负载分配一个DMA缓冲区。 它需要64GB的缓冲空间。 在计算之间,一些数据被卸载到PCIe卡上。 我不想将数据复制到由pci_alloc_consistent给出的一堆4MB缓冲区,我只想创build64个1GB的缓冲区,由1GB的HugePages支持。 一些背景信息:内核版本:CentOS 6.4 / 2.6.32-358.el6.x86_64内核启动选项:hugepagesz = 1g hugepages = 64 default_hugepagesz = 1g 相关部分的/ proc / meminfo:AnonHugePages:0 kB HugePages_Total:64 HugePages_Free:64 HugePages_Rsvd:0 HugePages_Surp:0 Hugepagesize:1048576 kB DirectMap4:848 kB DirectMap2M:2062336 kB DirectMap1G:132120576 kB 我可以挂载-t hugetlbfs nodev / mnt / hugepages。 CONFIG_HUGETLB_PAGE是真的。 MAP_HUGETLB被定义。 我已经阅读了关于使用libhugetlbfs在用户空间中调用get_huge_pages()的一些信息,但理想情况下,这个缓冲区将在内核空间中分配。 我尝试使用MAP_HUGETLB调用do_mmap(),但似乎并没有改变免费的巨大页面的数量,所以我不认为它实际上是支持大页面的mmap。 所以我猜我在想什么,有什么办法可以将缓冲区映射到内核空间中的1GB HugePage,还是必须在用户空间中完成? 或者如果有人知道任何其他方式,我可以得到一个巨大的(1-64GB)连续的物理内存作为内核缓冲区?

DMAcaching一致性pipe理

我的问题是:如何在我的设备驱动程序中正确使用[pci_]dma_sync_single_for_{cpu,device}时,如何确定何时禁用caching监听? 我正在研究设备驱动程序,通过PCI Express(DMA)直接写入RAM,并关心pipe理caching一致性。 有一个控制位,我可以设置启动DMA时启用或禁用caching监听DMA,显然是为了性能我想离开caching监听如果可能的话。 在中断例程中,当切换DMA缓冲区时,在适当的时候调用pci_dma_sync_single_for_cpu()和…_for_device() ,但是在32位Linux 2.6.18(RHEL 5)上,这些命令是扩展为无的macros。 ..这解释了为什么我的设备在此内核上禁用caching监听时会返回垃圾信息! 我已经浏览了内核源代码的历史,看来直到2.6.25只有64位的x86有DMA同步的钩子。 从2.6.26开始,似乎有一个通过sync_single_for_{cpu,device}字段的DMA同步的通用统一间接机制(目前在include/asm-generic/dma-mapping-common.h ),但到目前为止,未能find这些操作的任何定义。

Linux内核设备驱动程序将DMA从设备转移到用户空间内存中

我希望尽快将支持DMA的PCIe硬件设备的数据传输到用户空间。 问:如何将“直接I / O与用户空间与/和/经由DMA传输” 通过LDD3读取,似乎我需要执行一些不同types的IO操作!? dma_alloc_coherent给了我可以传递给硬件设备的物理地址。 但是,当传输完成时,需要设置get_user_pages并执行copy_to_usertypes的调用。 这似乎是一个浪费,要求设备DMA进入内核内存(作为缓冲区),然后再次传输到用户空间。 LDD3 p453: /* Only now is it safe to access the buffer, copy to user, etc. */ 我最想要的是一些记忆: 我可以在用户空间中使用(也许请求驱动程序通过ioctl调用来创buildDMA'able内存/缓冲区?) 我可以得到一个物理地址传递给设备,这样所有用户空间所要做的就是在驱动程序上执行一个读操作 读取方法将激活DMA传输,阻塞等待DMA完成中断,并释放用户空间后读取(用户空间现在是安全的使用/读取内存)。 我是否需要使用get_user_pages dma_map_page映射的单页stream式映射,设置映射和用户空间缓冲区? 我的代码到目前为止设置get_user_pages在给定的地址从用户空间(我称之为直接I / O部分)。 然后,带有来自get_user_pages页面的dma_map_page 。 我给设备返回来自dma_map_page的返回值作为DMA物理传输地址。 我使用一些内核模块作为参考: drivers_scsi_st.c和drivers-net-sh_eth.c 。 我会看infiniband代码,但不能find哪一个是最基本的! 提前谢谢了。

为什么mmap()比顺序IO更快?

可能重复: mmap()与读取块 我听说(在互联网上阅读它), mmap()比顺序IO更快。 它是否正确? 如果是的话为什么它更快? mmap()不是按顺序读取的。 mmap()必须从read()中获取磁盘本身 映射区域不是顺序的 – 所以没有DMA(?)。 所以mmap()实际上应该比文件中的read()慢? 我上面哪个假设是错误的?

DMA传输RAM到RAM

我的一个朋友告诉我,在x86架构上,DMA控制器不能在两个不同的RAM位置之间传输。 它只能在RAM和外设之间传输(如PCI总线)。 这是真的? 因为AFAIK DMA控制器应该能够在位于总线上并具有地址的任意设备之间。 特别是,如果源地址和描述地址属于同一物理设备,则看不到问题。