问题标签 [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 投票
2 回答
39267 浏览

caching - 缓存 - 刷新和无效操作

我对缓存同步操作有一些疑问。

Invalidate:在 cpu 尝试读取设备更新的部分内存之前,需要使相应的内存失效。

Flush:在设备读取 CPU 更新的部分内存之前,CPU 必须将缓存中的内容刷新(写回也正确?)到内存,以便设备从内存中读取更新后的内容。

如果不执行刷新,它可能会读取内存中存在的垃圾数据,因为内存仍未使用写入缓存的内容进行更新。

请确认我的上述理解是否正确?

您什么时候想结合刷新和无效?我听说在玩设备控制描述符时,我们需要通过组合刷新和无效来进行同步。为什么这样?

我们是否需要遵循冲洗后无效的顺序?

是否存在无效后刷新有用的情况?

0 投票
1 回答
3092 浏览

linux - 从用户空间创建物理内存以用于 DMA 传输

我想创建一些内存用于 DMA 传输。(使用 Linux 2.6.18-128.el5 #1 SMP)

我的 H/W 有一个 API 堆栈+内核驱动程序可以为我做这件事,但它非常非常慢!

如果我使用 API 创建 DMA 传输,它会在系统 RAM 中分配一些非常高的内存(例如,一次运行时为 0x7373a6f8)。(我有设备的ICD,所以有一个内存映射mmap'd,这就是我如何找到这个地址,最后我想如何设置我自己的地址,因此/ dev / mem在下面的地图中)

我似乎无法围绕这个高地址映射内存,大概是因为它超出了我的虚拟内存空间并且我被内核阻止了?

我想要做的是要么使用(映射)给定的这个地址,所以我可以读/写它,或者创建我自己的可以读/写的物理内存。

0 投票
3 回答
6658 浏览

linux - 从哪里开始学习 linux DMA / 设备驱动程序 / 内存分配

我正在移植/调试设备驱动程序(由另一个内核模块使用)并面临死胡同,因为 dma_sync_single_for_device() 因内核 oops 而失败。

我不知道该功能应该做什么,谷歌搜索并没有真正的帮助,所以我可能需要全面了解这些东西。

问题是,从哪里开始?

哦,是的,如果相关的话,代码应该在 PowerPC 上运行(而 linux 是 OpenWRT)

编辑:最好是在线资源(书籍需要几天才能交付:)

0 投票
2 回答
4781 浏览

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

我一直在阅读有关 NIC 捕获数据包后发生的情况,并且我阅读的越多,我就越困惑。

首先,我读过传统上,在 NIC 捕获数据包后,它会被复制到内核空间中的一块内存,然后复制到用户空间,以供随后处理数据包数据的任何应用程序使用。然后我阅读了 DMA,其中 NIC 绕过 CPU 直接将数据包复制到内存中。那么网卡->内核内存->用户空间内存流还有效吗?此外,大多数 NIC(例如 Myricom)是否使用 DMA 来提高数据包捕获率?

其次,RSS(接收端缩放)在 Windows 和 Linux 系统中的工作方式是否相似?我只能在 MSDN 文章中找到关于 RSS 工作原理的详细解释,他们讨论了 RSS(和 MSI-X)在 Windows Server 2008 上的工作原理。但是 RSS 和 MSI-X 的相同概念仍然应该适用于 linux 系统,对吧?

谢谢你。

问候,雷恩

0 投票
1 回答
695 浏览

linux-kernel - Linux 设备驱动程序能否在 device_remove() 函数中等待 DMA 终止?

我为 PCI 设备编写了 Linux 设备驱动程序。该设备执行 DMA 操作。当 DMA 操作运行时程序崩溃时会出现问题。

实际上,当崩溃时,该device_remove()函数被系统调用(就像close()被调用一样)。该函数对 PCI 设备使用的内存区域进行清理,正确释放分配的内存。我的意思是它在正常情况下可以正常工作。

但是,如果 DMA 正在运行,当它实际终止时,它将无法执行 DMA 清理,因为它不再有权访问已释放的设备数据。一个简单的解决方案是在 close() 函数中等待。(这是我的理解,但也许DMA函数的最后一部分永远不会执行?)

device_remove()为 DMA 实际终止设备驱动程序的(aka close()) 功能而哀号是个好主意吗?有没有其他方法来处理这个问题?

0 投票
3 回答
645 浏览

c++ - opengl vbo dma数组

我正在创建一个要绘制的位置数组,当我使用 dma 作为数组时我被卡住了

如果我声明数组的大小并填充,我可以让它工作,但如果我这样做

无聊,我想不出我需要做什么

0 投票
3 回答
7236 浏览

c - DMA 传输 RAM 到 RAM

我的一个朋友告诉我,在 x86 架构上,DMA 控制器不能在两个不同的 RAM 位置之间传输。它只能在 RAM 和外围设备(如 PCI 总线)之间传输。

这是真的?

因为 AFAIK DMA 控制器应该能够在位于 BUS 上并具有地址的任意设备之间。特别是,如果源地址和目标地址都属于同一个物理设备,我认为没有问题。

0 投票
7 回答
62913 浏览

memory-management - 如何以编程方式获取 linux 内核页面大小

我正在为 IA64 开发一个 Linux 模块。我当前的问题是驱动程序使用 PAGE_SIZE 和 PAGE_SHIFT 宏进行 dma 页面分配。我遇到的问题是编译驱动程序的机器不是运行驱动程序所需的机器。因此,如果编译机器上的 PAGE_SIZE 为 2^14K,而目标机器为 2^16K,则驱动程序失败。

我不想把这个问题变成关于在不是运行模块的机器上编译模块的“最佳实践”问题。我理解这方面的问题。我发现人们大多使用 getpagesize() 或 sysconf(_SC_PAGE_SIZE)。这两个选项不在 ia64 内核头文件中,所以我不能使用它们。有没有另一种方法可以让我获得运行时 PAGE_SIZE?

我正在查看的选项:

  • 在 /proc 中读取一些文件?
  • 系统调用?
  • 让我通过推理计算 PAGE_SIZE 的其他函数(例如 ORDER、getpageshift 等)?
  • 其他?
0 投票
1 回答
3060 浏览

linux - 在 linux sk_buff 中,skb->data 是物理地址还是虚拟地址?

我正在调查嵌入式系统的以太网驱动程序中的一些内存损坏问题。

我怀疑总线主控 DMA 控制器和慢速 SDRAM 之间存在问题。所以我想在快速 SRAM 中使用反弹缓冲区。为此,我需要做两件事:我必须将 SRAM 的物理地址(从总线主机的角度来看)放入 DMA 控制器缓冲区描述符中,并且一旦 DMA 控制器报告一个传入的数据包。

从阅读中我无法确定的内容

是 skb->data 是物理地址还是虚拟地址。即我应该打电话

或者

将数据包放入 sk_buff 以便 linux 网络堆栈的其余部分可以处理它?

编辑:这是有问题的驱动程序。我会说它正在将虚拟地址传递到 DMA 控制器寄存器中,因此无法工作,但我有一个可以使用此代码的 devkit。然而,我的 SDRAM 的时序不如 devkit DDR SDRAM 好,因此我正在考虑实现反弹缓冲区。

0 投票
4 回答
17153 浏览

hardware - 直接内存访问 DMA - 它是如何工作的?

我读到如果 DMA 可用,那么处理器可以将磁盘块的长读或写请求路由到 DMA 并专注于其他工作。但是,在此传输过程中,DMA 到内存数据/控制通道很忙。处理器在此期间还能做什么?