目前我正在为我的Linux PCIe驱动程序添加DMA。在我阅读文档时,它通过使用API提及了一致或连贯的内存:
pci_set_consistent_dma_mask(...)
但从未真正谈论过为什么要使用它或它做什么。似乎提到将该功能称为最佳实践和未来验证。我能收集到的最好的是,一致的DMA内存没有缓存效果,并且一旦正确设置(假设我正确读取),内存就会在设备(FPGA)和CPU之间写入而无需任何软件/驱动程序干预。 所以我的问题是:
答案 0 :(得分:2)
以这种方式思考:“一致”意味着它将在CPU和总线之间自动连贯,而无需执行任何具体的同步。例如 - 假设我有一个用于入站和出站数据包的内存环。它的生命周期将是系统使用的整个时间,我将在所有时间检查它。我希望这是始终一致,因为如果不是,我将不得不(手动)刷新或同步缓存,如果这是昂贵的,我必须这样做非常时间我触摸了戒指 - 这将是噩梦。
另一方面 - 让我们转移一个数据缓冲区。我不是一个“一次性”的交易。我可以让设备传输它 - 可能需要很多PCI周期才能完成DMA。也许这是不一致的。没关系 - 但是当完成时,我可以刷新/同步缓存/强制一致性。如果这需要花费一点额外的时间 - 没问题 - 因为我只是做了一次。
所以你可能会问“为什么不让一切都保持一致”。答案通常是一些级别的开销以使事情保持一致。根据体系结构,此可能非常重要。因此,在这种情况下,有条款允许不一致(流式)映射,这些映射不执行缓存一致性(但需要显式同步)。因此,允许不一致的传输可以获得一些性能。
请记住 - 在某些情况下,您从不需要任何一致性。例如 - 从网络设备读取缓冲区到内存,然后将该内存写入磁盘控制器。这些数据可能永远不会被CPU读取/使用 - 所以为什么要在CPU缓存上放置任何开销来跟踪它。
至于你对“中断”的评论 - 这有点奇怪。在“正常”情况下 - 您可能在一致内存中有一个控制结构(如Tx / Rx响铃),您可以轮询告诉您交易是否已完成。但传输的实际数据将在不同的内存中,这可能是流式或非一致的。
答案 1 :(得分:0)
1)想象一下,您希望通过PCIE以高速率传输大量数据。你必须使用分散/收集列表,你可以使用一致的内存来为FPGA准备这个列表,这样FPGA就可以非常快速地读取这个列表,然后进行传输。
2)当然你需要中断,否则你必须使用非常慢且不可靠的轮询。
3)如果使用更大的一致性内存,可以最大限度地减少中断/轮询开销,因此它们更快,但Windows通常不允许您分配大量一致的内存。