io - 内存映射 IO 与 DMA?

标签 io linux-kernel dma memory-mapping

根据我从评论和答案中了解到的信息(谢谢大家!),我编辑了问题以使其更有针对性:

DMA:

在第一次 DMA 之前,CPU 必须设置诸如保留供 DMA 设备使用的 RAM 地址范围之类的内容。一旦设置工作完成,设备是否可以随意启动传输,基本上拥有那部分 RAM,或者在每次单次 DMA 传输之前仍然必须再次获得 CPU 的某种许可?

MMIO:

CPU 通过 mmio 访问设备内存比 CPU 访问 RAM 更昂贵,但我可以在我的桌面上看到,pci 设备为 mmio 保留数百兆字节,有什么例子可以有效地使用它(与使用 DMA 将数据复制回 RAM,然后访问它们)?

最佳答案

从设备的角度来看。该设备可以:

  • 直接访问内存本身(使用DMA本身)

  • 等待CPU向其传输数据(通过提供内存映射IO供CPU使用)

So the question is, if the CPU can access the PCIe memory by memory-maps, why does it have to do DMAs?

CPU 根本不使用 DMA。 DMA 的全部意义在于允许 CPU 在设备执行 DMA 时执行其他操作(或不执行任何操作)。最终结果是整个系统的性能显着提高 - 例如CPU 正在执行许多其他工作,而许多设备(硬盘驱动器 Controller 、显卡、声卡、网卡...)也使用 DMA 来传输数据。

关于io - 内存映射 IO 与 DMA?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58126962/

相关文章:

java - 基本 I/O token 查询

c - Linux 内核中 lstat/stat 的用法?

c - Mac OS X : If there's a header needed when compile linux kernel, 但 os x 没有,我应该把它放在哪里?

c - 将系统调用添加到 linux 内核

arm - 在 OMAP 4460 上进行多个 DMA 传输时,CPU 是否被阻塞?

opengl - glBufferSubData什么时候返回?

io - FORTRAN 写()

java - Android下载-使用输出流方式

c# - 如何将文件移动到目录而不替换文件?

c - 数组的内存对齐