dma - DMA 和 PCIe 如何协同工作?
问题描述
在 PCIe 配置中,设备具有专用地址,并且它们以对等模式相互发送数据 - 每个设备都可以随时写入,并且交换机会注意正确地转发数据。不需要有一个“总线主控器”来决定何时以及如何传输数据。
DMA 如何在这种配置中发挥作用?对我来说,DMA 似乎是一个过时的功能,在 PCIe 配置中不需要。每个设备都可以向主存储器发送数据,或从中读取数据——显然,在此类操作中,主存储器始终是“从属”。
还是我缺少的 DMA 的其他一些功能?
先感谢您!
解决方案
当 CPU 以外的设备访问连接到 CPU 的内存时,这称为直接内存访问 (DMA)。所以任何从 PCIe 设备发出的 PCIe 读或写请求都构成了 DMA 操作。这可以通过“设备到设备”或“点对点”DMA 进行扩展,其中设备在不涉及 CPU 或系统内存的情况下相互执行读取和写入。
DMA 有两个主要优点:首先,DMA 操作可以以最小的 CPU 负载将数据移入和移出内存,从而提高软件效率。其次,CPU 只能发出任何 CPU 字长的读取和写入,由于 TLP 标头和其他协议开销,这导致 PCIe 总线上的吞吐量非常差。直接发出读写请求的设备可以发出更大负载的读写操作,从而提高吞吐量并更有效地利用总线带宽。
因此,DMA 绝对不会过时或过时——基本上所有通过 PCIe 连接的高性能设备都将使用 DMA 来有效地使用总线。
推荐阅读
- javascript - JavaScript Date.getUTCMilliSeconds() 不起作用
- vue.js - 如何在 vuex 商店中存储 $i18n.locale?
- python - 为什么方法“isspace”在条件语句中接受非空格字符?
- python - 如何在每组 5 个数字之前打印块而不添加新变量?
- angular - 从反应形式驱动材料日期选择器控制
- prolog - 如何使用占位符在 Prolog 中创建谓词?
- javascript - 使用 React-Bootstrap 的网格布局在 Columns 中重新定位 div
- scrapy - 我升级了 pyOpenSSL 但它仍然是 0.13.1 版本。无法升级到 18.0.0
- javascript - Webpack 4 - 动态导入无法设置正确的位置
- python - 在 Python 中查找变量的总和