Linux ioread中的延迟

Linux ioread中的延迟,linux,real-time,drivers,pci-e,Linux,Real Time,Drivers,Pci E,假设您有一个PCIE设备,显示一个单条和一个用pci_alloc_consistent(..)声明的DMA区域。该条的标志指示不可预取、不可缓存的内存区域 读取DMA区域延迟的主要原因是什么?同样,读取条延迟的原因是什么 谢谢你回答这个简单的问题:D 这闻起来有点像家庭作业,但我怀疑很多人都不太理解这些概念,所以我要补充一个答案 思考这个问题的最好方法是考虑需要发生什么,以便完成阅读。CPU和设备位于PCIe链路的不同侧面。将PCI Express视为小型网络很有帮助。每个链接都是点对点的(就像

假设您有一个PCIE设备,显示一个单条和一个用pci_alloc_consistent(..)声明的DMA区域。该条的标志指示不可预取、不可缓存的内存区域

读取DMA区域延迟的主要原因是什么?同样,读取条延迟的原因是什么


谢谢你回答这个简单的问题:D

这闻起来有点像家庭作业,但我怀疑很多人都不太理解这些概念,所以我要补充一个答案

思考这个问题的最好方法是考虑需要发生什么,以便完成阅读。CPU和设备位于PCIe链路的不同侧面。将PCI Express视为小型网络很有帮助。每个链接都是点对点的(就像你的电脑连接到另一台电脑一样)。也可能有中间交换机(即PCI中的网桥)。在这种情况下,就像你的电脑连接到一个交换机,而交换机又连接到另一台电脑

因此,如果CPU想要读取自己的内存(您分配的“DMA”区域),它的速度相对较快。它有一辆高速巴士,旨在让这一切快速发生。此外,内置了多层缓存,可将频繁(或最近)使用的数据“靠近”CPU

但是,如果CPU希望从设备中的条形图读取数据,则CPU(实际上是与CPU集成的PCIe根复合体)必须编写PCIe读取请求,发送请求,并等待设备解码请求,访问条形图位置并发回请求的数据。滴答作响。您的CPU在等待此操作完成时不执行任何其他操作

这非常类似于从另一台计算机请求一个网页。您制定一个HTTP请求,发送它并等待web服务器访问内容,制定一个返回包并将其发送给您

如果设备希望访问驻留在CPU中的内存,则相反,这几乎是完全相同的事情。(“直接内存访问”只是意味着不需要中断CPU来处理它,但某些东西[这里的根复合体]仍然负责解码请求,完成读取并发送回结果数据。)

此外,如果CPU和设备之间存在中间PCIe交换机,则这些交换机可能会增加额外的缓冲/排队延迟(与网络中的交换机或路由器完全相同)。任何这样的延迟都会加倍,因为它们在两个方向上都会发生


当然PCIe速度非常快,所以所有这些都只需纳秒,但这仍然比“本地”读取慢几个数量级。

Gil感谢您的回答。我没有意识到条形图不是实际的内存,它只是根复合体生成设备TLP的地址,因此从CPU读取条形图始终是不可发布的。有没有办法将ioread设置为不可中断的,因为在大多数情况下,读取需要2us,但在某些情况下需要15ms。这可能是任务抢占,因为它也在HZ值为100(单任务隔离cpu)的区域内。我很乐意使用10usec,但不是15ms:D。一次读取该条是不可中断的(至少在我工作过的任何架构上)。您只是从CPU的角度执行加载指令。中断将不会在机器指令的中间被识别。那么问题是:时间将去哪里?我首先要弄清楚延迟是在哪一边。可以在读取之前和之后读取时间戳计数器(或arch上可用的任何东西),以了解实际PCIe事务完成所需的时间——在整个序列中禁用中断。