假设您有一个PCIE设备呈现单个BAR和一个用pci_alloc_consistent(..)声明的DMA区域。 BAR的标志表示不可预取,不可缓存的内存区域。
读取DMA区域的延迟的主要原因是什么?同样,读取BAR的延迟的原因是什么?
感谢您回答这个简单的问题:D!
答案 0 :(得分:1)
这有点像家庭作业,但我怀疑这些概念并没有被很多人理解,所以我会添加一个答案。
考虑这个问题的最佳方法是考虑需要发生什么才能完成阅读。 CPU和设备位于PCIe链路的不同侧。将PCI-Express视为迷你网络很有帮助。每个链接都是点对点的(就像您的PC连接到另一台PC)。也可能存在中间开关(也称为PCI中的桥)。在这种情况下,就像你的电脑连接到一个开关,而开关又连接到另一台电脑。
所以,如果CPU想要读取自己的内存(你分配的“DMA”区域),它的速度相对较快。它有一个高速总线,旨在使这种情况快速发生。此外,内置了多层缓存,以保持频繁(或最近)使用的数据“靠近”CPU。
但是如果CPU想要从设备中的BAR读取,则CPU(实际上是与CPU集成的PCIe根复合体)必须组成PCIe读取请求,发送请求,并等待设备解码请求,访问BAR位置并发回所请求的数据。嘀嗒嘀嗒在等待此操作完成时,您的CPU没有做任何其他事情。
这非常类似于从另一台计算机上请求网页。您可以制定HTTP请求,发送并等待Web服务器访问内容,制定返回数据包并将其发送给您。
如果设备希望访问驻留在CPU中的内存,则反过来几乎完全相同。 (“直接内存访问”只是意味着它不需要中断CPU来处理它,但是[这里的根复合体]仍然负责解码请求,完成读取并发回结果数据。)< / p>
此外,如果CPU和设备之间存在中间PCIe交换机,则可能会增加额外的缓冲/排队延迟(与网络中的交换机或路由器完全相同)。任何此类延迟都会加倍,因为它们是双向发生的。
当然PCIe速度非常快,因此所有这些都只需几纳秒,但仍然比“本地”读取慢几个数量级。