问题标签 [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.
java - AsynchronousFileChannel 是否有与 transferTo 等价的方法?
我一直在玩 Java 7 中的 NIO2,我有点假设它AsynchronousFileChannel
会有一个transferTo
像它的同步FileChannel
兄弟一样的方法。
我正在寻找在本地文件和打开的 TCP 套接字之间执行零拷贝传输。我尝试简单地创建 aFileChannel
并transferTo
使用 myAsynchronousSocketChannel
作为最后一个参数进行调用,但看到异步套接字版本不是 a WritableByteChannel
,Java 不会拥有它。
排除这个选项后,是否有人知道一种解决方法或外部库,可以让我将字节传输到AsynchronousSocketChannel
利用 DMA(并且暗示在用户空间中不使用缓冲区)?
device - 如何使用 DMA 从 linux 设备驱动程序写入硬盘驱动器
我可以将数据块从应用程序传输到设备驱动程序,但无法使用 DMA 将设备驱动程序的接口写入实际硬盘驱动器。是否有任何示例代码或指针?非常感谢您的帮助,
embedded - 是否可以检测 Cortex M3 上的 DMA 通道何时空闲?
我刚刚接手了一个为 STM32 Cortex M3 微控制器开发 C 代码的项目。
我立即遇到的一个问题是我有一个自由运行的 DMA 通道,可以在 2 个 USART 之间传输数据,但有时需要将来自另一个源的数据发送到目标 USART。
有什么方法可以检测 DMA 何时忙于传输数据或空闲,或者传输完成时是否触发了任何中断。
非常感谢您的任何回复,
戴夫
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?
linux - 我计算机上的网络堆栈是否使用 DMA?
我了解到硬盘数据使用 DMA 传输到主内存,但网络堆栈数据不能使用 DMA,数据必须通过处理器。这是真的吗?如果是,有什么方法可以避免这种情况?通过处理器传输数据真的效率低下吗?
c - 从内核到用户空间 (DMA)
最近,我阅读了很多关于 10gb/s 网卡、它们的 DMA 以及 linux 内核(10/100 mb/s 网卡)处理数据的方式的网站和书籍,我想到了一些问题。
将 10GB/s 的数据流从 NIC 发送到用户空间的最简单方法是什么(我假设能够以相同的速率处理用户空间中的数据)。
和
您认为在用户空间内实现 DMA 缓冲区以直接从那里读取原始数据(并且显然以相同的速率处理它们)是一个好主意吗?
还是我没有想到的更好的解决方案:/
谢谢你。
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
. 这个对吗?
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 代码:
感谢您提供任何帮助。
x86 - 为 x86 中的设备内存副本提供服务的页面错误的中断处理
我正在尝试在 x86 CPU 上计算中断的控制流程,特别是页面错误。到目前为止,这是我能弄清楚的:
- IDT 填充有服务例程地址。
- 发生中断。
- CPU 将 EFLAGS、CS 和 EIP 保存到堆栈。
- EIP 设置为从 IDT 获取的 ISR 地址,即
mov eip, [idtr+interruptNum*4]
- 中断例程执行。
- 中断例程以一条
iret
指令完成。
现在,假设中断实际上是与 NIC 缓冲区相关的页面错误。ISR 会out
用来告诉 DMA 控制器从系统内存向设备发出副本(反之亦然),还是我在这里偏离了基础?
linux-kernel - 关于 dma_alloc_coherent 的一些问题
此调用返回的 DMA 地址是否与物理地址相同?LDD3 表示驱动程序应将 DMA 地址视为不透明的。我想映射这个 DMA 缓冲区,以便用户空间可以直接读取/写入它。问题是我应该为 remap_pfn_range 指定什么 PFN(令我惊喜的是,现在(内核 3.4+)适用于与 I/O 内存相同的常规内存)。我可以将 DMA 地址转换为 unsigned long 并将其转换为 PFN 吗?这不是违反 LDD3 关于不透明性的说法吗?
dma_alloc_coherent
总是在__get_free_pages
内部使用吗?这是否意味着该区域可能总是过度分配(因为第一个函数占用字节,但第二个函数以页面为单位分配)?有没有办法为从调用获得的多个连续页面设置单个流映射
__get_free_pages
?dma_map_page
仅适用于单页。