问题标签 [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 回答
3115 浏览

linux-kernel - DMA 如何工作——在 ARM 中——使用 linux

一些Linux DMA专家可以帮助我...理解这个概念。

a> 我是 DMA 编程的新手。DMA 实际上如何用于 ARM 控制器?

b> 如果我们使用 mmap 向驱动程序发送数据。我们如何将其与 DMA 同步?

c> 要使用 DMA,我们实际上必须在我们的软件中做什么?

d> 这个 dma 输入输出通道是什么?

是否有一些示例代码.. 对 DMA 来说是新手,这将有助于我理解这个概念。

0 投票
1 回答
457 浏览

fwrite - 从连续的物理内存写入硬盘

我有一个基于 ARM 的设备,运行 linux,它连接到相机,我正在尝试有效地将捕获的帧存储到 HD。

  • 我在用户空间开发,但可以随意修改驱动
  • 我正在用 C 编码
  • 使用 DMA 写入内存的帧,我有它们的物理内存指针。
  • 我能够控制所有的帧捕获流程,并且我可以判断帧缓冲区何时稳定(从 video4linux 驱动程序中提取)
  • Linux 版本是 3.0.35
  • 我熟悉内核源代码,不是专家,但只要我得到一些提示,我就能找到方法并弄清楚事情......

我相信我有两种选择:

  1. 为我的文件系统找到最佳配置,用于打开文件并写入文件。我现在使用 ext4 和标准 fopen() fwrite() 函数。我知道我也可以使用 mmap,或者在调用 open() 时添加 O_DIRECT 标志,但还没有尝试过。

  2. 找到一种方法将缓冲区的物理地址(我可以从我的 Video4Linux 驱动程序中获取)直接传递给文件系统/硬盘驱动程序,因此数据将直接从那里传输。

我发现方法 1 很慢,内存事务是我的瓶颈,因为 fwrite 涉及将数据从用户空间复制到内核空间,然后再复制到某种缓存,然后再复制到 DMA。简单存储的内存事务太多...

关于方法 2 - 我不知道这是否可能,但如果我是从头开始设计这个系统的人,我会这样做。

有什么想法吗?

  • 关于方法 1(使用 open() 和 write()、mmap() 和/或 O_DIRECT),您能推荐一个适合我的最佳设置吗?
  • 方法 2(直接从现有 DMA 缓冲区存储到 HD)是否可行?如果是这样 - 你能给我举个例子吗?
0 投票
2 回答
1619 浏览

windows - 为 32 位 PCI 设备编写 Windows 64 位设备驱动程序

我正在评估将几年前编写的设备驱动程序从 32 位移植到 64 位。物理设备是 32 位 PCI 卡。也就是说,该设备是 32 位的,但我需要从 Win7x64 访问它。该设备向 Windows 世界提供一些寄存器,然后执行繁重的总线主数据传输到一块驱动程序分配的内存中。

我在 Microsoft 文档中读到,您可以指示驱动程序是否支持 64 位 DMA。如果不是,则 DMA 是双缓冲的。但是,我不确定是否是这种情况。我的驱动程序将/可能是一个完整的 64 位驱动程序,因此它可以支持处理器地址空间中的 64 位地址,但实际的物理设备不支持它。事实上,设备 BAR 必须映射到 4 GB 以下,并且设备必须获得一个 PC RAM 地址才能执行 4 GB 以下的总线主控。这是否意味着我的驱动程序将始终通过双缓冲?这是一个对性能非常敏感的过程,双缓冲可能会阻止整个系统工作。

当然,设计一个新的 64 位 PCI(或 PCI-E)板是没有问题的。

任何人都可以为这个过程提供一些资源(除了 MS 页面)?

非常感谢!

0 投票
1 回答
1988 浏览

c - dmatest.ko - 如何使用它?

我想启动一个 DMA 传输进行测试。

我在内核源代码(驱动程序/dma)中偶然发现了一个 dmatest.c。我用这个模块编译了一个内核,并在没有任何参数的情况下进行了尝试。

我得到了 dmesg

dmatest.ko 的先决条件是什么?我应该加载一个特殊的 DMA 引擎吗?是否需要 dmatest.ko 的特殊参数(默认应该探测任何东西!?)?

0 投票
1 回答
1614 浏览

io - “从 I/O 端口读取一个字节”与“从内存地址读取一个字节”?

为了简化讨论,我假设只有一个执行线程。以下只是我的胡思乱想:

1、如果CPU从内存地址读取一个字节,那么它可以从同一个地址重复读取同一个值。

2、如果CPU从一个端口重复读取一个字节,那么每次读取的值可能不同。

我认为这两种方式的区别在于端口控制器可以在每次读取操作后自动更新端口上的值。

但是,我找不到任何明确支持我的陈述的教科书。

我对么?

0 投票
1 回答
1906 浏览

device - KVM - DMA with a passthrough device

I have several assumptions in mind please correct me if I'm wrong:

  1. Without a real IOMMU a DMA-Transfer would be a security risk, because a guest could transfer garbage in Host Memory.
  2. A valid DMA-Transfer between guest memory and passthrough device without a real IOMMU is not possible.
  3. The Host-OS is not aware of any DMA-related things related to the passthrough device

An now some questions:

  • related to Point 3: Is there a way to get any information about a DMA-Transfer with a passthrough device?
  • If I don't have DMA-Remapping on, would KVM complain about it?
  • Is there a possibillity to deny any DMA-related stuff for the guest with the passthrough device?
0 投票
1 回答
747 浏览

fpga - FPGA PCIe DMA 写入不会改变 CPU RAM

我正在研究 Xilinx FPGA 和 PC over PCIe 之间的 DMA 连接。但是,从 FPGA 到计算机的 DMA 传输不起作用。我转储了 FPGA 通过 ChipScope 发送的 PCIe 包:

(头)0x6000_0002,0x0600_01FF,(地址)0x0000_0000,0x3740_0000,(数据)0x0000_0001,0x0000_0002

它应该将 0x1,0x2 写入内存地址 0x3740_0000,但写入没有发生。另一方面,从同一地址读取工作完美。32位和64位地址我都试过了,都不行。我正在使用的计算机是 AMD 64 位机器。我错过了什么?

0 投票
1 回答
581 浏览

linux - 我想了解更多关于 dma_map 和 dma_unmap

有人可以指出我为什么需要 dma_unmap 的简单文档。请自由解释 dma_map。我是设备驱动程序的新手。

谢谢

0 投票
1 回答
1764 浏览

c# - 如何在 Windows XP 中分配 500 MB 的 DMA 缓冲区

有一个 PCI 卡连接到 PC,我们有一个相同的 GUI。我们要在 RAM 中分配大约 400 到 600 MB 物理内存的 DMA 缓冲区,以便从 PCI 卡中读取/写入(FPGA 在 PCI 卡中进行读取/写入操作)。我们正在使用 JUNGO windows PCI 驱动程序。JUNGO 提供了一个 WDC_DMAContigBufLock 方法,通过 Contiguous 或 scatter/Gather 方法分配 DMA Buffer。我们可以在 RAM 中创建最多 63MB 的缓冲区,但不能创建超过 63MB 的缓冲区。操作系统是 Windows XP 32 位,RAM 大小为 4GB(相对 3 GB 是免费的)。

应用程序 (GUI) 是用 C# .Net 编写的,并尝试通过此应用程序创建 400 – 600MB 的 DMA 缓冲区。我正在寻找可能导致/阻止我创建 400 - 600MB 缓冲区大小的解决方案/想法。

谢谢

0 投票
1 回答
13568 浏览

linux-kernel - 分配大的 DMA 缓冲区

我想分配一个大的 DMA 缓冲区,大小约为 40 MB。当我使用dma_alloc_coherent()时,它失败了,我看到的是:

我尝试了不同的值,看起来dma_alloc_coherent()不能分配超过 2^25 字节(32 MB)。

这么大的DMA缓冲区怎么分配?