问题标签 [dma]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
870 浏览

java - AsynchronousFileChannel 是否有与 transferTo 等价的方法?

我一直在玩 Java 7 中的 NIO2,我有点假设它AsynchronousFileChannel会有一个transferTo像它的同步FileChannel兄弟一样的方法。

我正在寻找在本地文件和打开的 TCP 套接字之间执行零拷贝传输。我尝试简单地创建 aFileChanneltransferTo使用 myAsynchronousSocketChannel作为最后一个参数进行调用,但看到异步套接字版本不是 a WritableByteChannel,Java 不会拥有它。

排除这个选项后,是否有人知道一种解决方法或外部库,可以让我将字节传输到AsynchronousSocketChannel利用 DMA(并且暗示在用户空间中不使用缓冲区)?

0 投票
1 回答
1270 浏览

device - 如何使用 DMA 从 linux 设备驱动程序写入硬盘驱动器

我可以将数据块从应用程序传输到设备驱动程序,但无法使用 DMA 将设备驱动程序的接口写入实际硬盘驱动器。是否有任何示例代码或指针?非常感谢您的帮助,

0 投票
2 回答
3139 浏览

embedded - 是否可以检测 Cortex M3 上的 DMA 通道何时空闲?

我刚刚接手了一个为 STM32 Cortex M3 微控制器开发 C 代码的项目。

我立即遇到的一个问题是我有一个自由运行的 DMA 通道,可以在 2 个 USART 之间传输数据,但有时需要将来自另一个源的数据发送到目标 USART。

有什么方法可以检测 DMA 何时忙于传输数据或空闲,或者传输完成时是否触发了任何中断。

非常感谢您的任何回复,

戴夫

0 投票
1 回答
1898 浏览

opencl - How to get physical address of GPU memory for DMA? (OpenCL)

I am writing an OpenCL program and I wish to transfer data from a frame grabber to a GPU using DMA. How can I get the physical address of an OpenCL buffer on the GPU to do that?

0 投票
2 回答
360 浏览

linux - 我计算机上的网络堆栈是否使用 DMA?

我了解到硬盘数据使用 DMA 传输到主内存,但网络堆栈数据不能使用 DMA,数据必须通过处理器。这是真的吗?如果是,有什么方法可以避免这种情况?通过处理器传输数据真的效率低下吗?

0 投票
3 回答
3297 浏览

c - 从内核到用户空间 (DMA)

最近,我阅读了很多关于 10gb/s 网卡、它们的 DMA 以及 linux 内核(10/100 mb/s 网卡)处理数据的方式的网站和书籍,我想到了一些问题。

将 10GB/s 的数据流从 NIC 发送到用户空间的最简单方法是什么(我假设能够以相同的速率处理用户空间中的数据)。

您认为在用户空间内实现 DMA 缓冲区以直接从那里读取原始数据(并且显然以相同的速率处理它们)是一个好主意吗?

还是我没有想到的更好的解决方案:/

谢谢你。

0 投票
1 回答
3836 浏览

linux-kernel - 实现 mmap() 的内核驱动程序是否必须创建字符设备?

我正在尝试编写一个内核驱动程序来管理一些物理上连续和可 DMA 内存的内存块(我正在使用这些内存块,kmalloc()因为这些只是 DMA 流)。要将某些功能拉入用户空间,该内存将mmap()使用其自己的mmap(). 我一直在使用Linux 设备驱动程序和 Google 中出现的不良示例作为我的主要信息来源。

我的mmap()(现在叫它my_mmap())需要在内核中注册。使用 似乎是唯一有效的方法struct file_operations,但这需要为它创建一个字符设备和一个物理位置。我不想那样做。我只想为用户空间应用程序创建一个虚拟地址来访问内存缓冲区,而不是创建任何文件来映射内存缓冲区。这可能吗?

我确实发现帧缓冲区也有一个等效的结构和一个mmap()实现,但这太过分了。这增加了更多的未知数。

据我了解,只要我对失去的灵活性感到满意,my_mmap()就可以进行繁重的工作和使用。remap_pfn_range()否则我将不得不实现一个本地nopages()并使用struct vm_operations_struct. 这个对吗?

0 投票
2 回答
9463 浏览

linux - Linux 设备驱动程序允许 FPGA 直接 DMA 到 CPU RAM

我正在编写一个 linux 设备驱动程序,以允许 FPGA(当前通过 PCI express 连接到 PC)将 DMA 数据直接发送到 CPU RAM。这需要在没有任何交互的情况下发生,并且用户空间需要访问数据。一些细节: - 运行 64 位 Fedora 14 - 系统有 8GB 的​​ RAM - FPGA (Cyclone IV) 在 PCIe 卡上

为了实现这一点,我执行了以下操作: - 使用 memmap 6GB$2GB 在 grub 中保留上层 2GB RAM(如果我添加 mem=2GB,则不会启动)。我可以看到 /proc/meminfo 中保留了上层 2GB 的 RAM - 映射 BAR0 以允许读取和写入 FPGA 寄存器(这非常有效) - 在我的驱动程序中使用 remap_pfn_range() 实现了一个 mmap 函数 - 使用 ioremap 来获取缓冲区的虚拟地址 - 添加 ioctl 调用(用于测试)以将数据写入缓冲区 - 通过调用 ioctl 将数据写入缓冲区来测试 mmap,并验证数据是否在来自用户空间的缓冲区中

我面临的问题是当 FPGA 开始将数据 DMA 到我提供的缓冲区地址时。我经常收到 PTE 错误(来自 DMAR :) 或使用下面的代码我收到以下错误: DMAR:[DMA 写入] 请求设备 [01:00.0] 故障地址 186dc5000
DMAR:[故障原因 01] 根条目中的当前位是清除 DRHD:处理故障状态 reg 3

根据来自 FPGA 的 DMA,第一行中的地址每次递增 0x1000

这是我的 init() 代码:

}

这是我的 mmap 代码:

感谢您提供任何帮助。

0 投票
1 回答
1183 浏览

x86 - 为 x86 中的设备内存副本提供服务的页面错误的中断处理

我正在尝试在 x86 CPU 上计算中断的控制流程,特别是页面错误。到目前为止,这是我能弄清楚的:

  1. IDT 填充有服务例程地址。
  2. 发生中断。
  3. CPU 将 EFLAGS、CS 和 EIP 保存到堆栈。
  4. EIP 设置为从 IDT 获取的 ISR 地址,即mov eip, [idtr+interruptNum*4]
  5. 中断例程执行。
  6. 中断例程以一条iret指令完成。

现在,假设中断实际上是与 NIC 缓冲区相关的页面错误。ISR 会out用来告诉 DMA 控制器从系统内存向设备发出副本(反之亦然),还是我在这里偏离了基础?

0 投票
1 回答
17500 浏览

linux-kernel - 关于 dma_alloc_coherent 的一些问题

  1. 此调用返回的 DMA 地址是否与物理地址相同?LDD3 表示驱​​动程序应将 DMA 地址视为不透明的。我想映射这个 DMA 缓冲区,以便用户空间可以直接读取/写入它。问题是我应该为 remap_pfn_range 指定什么 PFN(令我惊喜的是,现在(内核 3.4+)适用于与 I/O 内存相同的常规内存)。我可以将 DMA 地址转换为 unsigned long 并将其转换为 PFN 吗?这不是违反 LDD3 关于不透明性的说法吗?

  2. dma_alloc_coherent总是在__get_free_pages内部使用吗?这是否意味着该区域可能总是过度分配(因为第一个函数占用字节,但第二个函数以页面为单位分配)?

  3. 有没有办法为从调用获得的多个连续页面设置单个流映射__get_free_pagesdma_map_page仅适用于单页。