最近正在从事 PCI 驱动程序项目并尝试了解 Scatter Gather DMA。
在我的项目中,PCI 设备(在 PC 的 PCI 插槽中)是 DMA 主设备,我想对 PC 的内存进行 DMA 写入。对于分散/聚集 dma,因此 PC 驱动程序应该为那些“不连续”或也称为“分段”物理内存创建一个链表,并将链表的首地址写入设备。因此设备的 DMA 控制器可以通过链表进行写操作,而无需向 PC 询问下一个空闲内存块。我写了吗?
在上面的场景中,有一个表达“环绕”,我不确定它是什么意思。
这是否意味着:写指针到达了内存块的末尾?
或者
当前要发送的数据包已发送完成,应该开始下一个数据包吗?
或者
还有其他事情吗?
答案1
它可以表示其中任何一个选择分散-聚集 DMA,具体取决于您正在阅读的文档:
环绕在单个内存缓冲区中,例如,
- 连接的消费电子设备内部和之间的动态且稳健的流传输,彼得·范德斯托克,第 151 页:
内存中数据的物理表示取决于硬件协处理器。它可以从内存中的一个固定位置、内存中带有起始/结束地址的 fifo 和环绕,到允许数据分散在物理内存中的分散-聚集 DMS。
- 用于处理多个数据流的电路、系统和方法,美国 6055619 A
对于非分散/聚集流,传输至主机系统存储器或从主机系统存储器传输的数据被存储在主机存储器中的循环缓冲器中,该缓冲器不断地被填充和耗尽。因此,这种情况下的PCI事务是突发传输,其范围跨越一组连续的双字存储器地址,DMA控制器208每次在循环缓冲器中的位置时请求新的PCI事务环绕到起始地址。这些循环缓冲区的最大大小设置为 2014 个双字或一个主机页。
环绕在内存缓冲区的“环”中
- PCI 11W 用户指南,美国东部夏令时间公众,第 18 页
如果环形缓冲区处于自由运行模式并且应用程序无法像获取数据一样快地处理数据,则 DMA 将环绕并覆盖引用的缓冲区。应用程序必须确保缓冲区中的数据被及时处理或复制出来,以防止溢出。