Networking 网卡驱动程序中的DMA是同步的吗?

Networking 网卡驱动程序中的DMA是同步的吗?,networking,io,driver,interrupt,dma,Networking,Io,Driver,Interrupt,Dma,我的理解是,当NIC适配器接收到新数据包时,上半部分处理程序使用DMA将数据从RX缓冲区复制到主存。我认为这个处理程序不应该在传输完成之前退出或释放INT-pin,否则新数据包会损坏旧数据包 然而,DMA通常被认为是异步的,它本身需要中断机制来通知CPU数据传输已经完成。因此,我的问题是,这里的DMA实际上是同步的,还是中断实际上可以在另一个中断处理程序中发生?通常,这种同步是通过NIC(设备驱动程序)和主机CPU之间的环描述符发生的。您将获得数据包路径的详细信息。我已经解释了下面的环描述符 编

我的理解是,当NIC适配器接收到新数据包时,上半部分处理程序使用DMA将数据从RX缓冲区复制到主存。我认为这个处理程序不应该在传输完成之前退出或释放INT-pin,否则新数据包会损坏旧数据包


然而,DMA通常被认为是异步的,它本身需要中断机制来通知CPU数据传输已经完成。因此,我的问题是,这里的DMA实际上是同步的,还是中断实际上可以在另一个中断处理程序中发生?

通常,这种同步是通过NIC(设备驱动程序)和主机CPU之间的环描述符发生的。您将获得数据包路径的详细信息。我已经解释了下面的环描述符

编辑:

让我解释一下。如果您查看第3.2.3节,其中给出了RX描述符格式,它有状态字段,用于解决数据包所有权问题。关于谁拥有数据包(NIC驱动程序或CPU),有两个要点可以避免争用和数据包损坏

DMA(从I/O设备到主机内存):RX/TX环由“硬件描述符”和“缓冲区”(从主机内存雕刻而成)组成。当我们说DMA时,控制器将数据从硬件FIFO传输到主机内存

  • 让我们假设我的环形缓冲区(512字节)不够大,无法容纳完整的传入数据包(1500或巨型数据包),在这种情况下,数据包可能跨越多个环形缓冲区,并且带有EOP(数据包结束)状态字段,表示现在接收到完整的数据包(考虑到所有健全性检查/校验和已经完成)
  • 第二个问题是谁现在拥有数据包(驱动程序还是CPU用于进一步消费)?现在,在设置状态标志DD(描述符完成)之前,数据包属于驱动程序。一旦设置,CPU可以抓取数据包进行拾取和戳取
  • 这是特定于RX路径的。TX路径略有不同

    这样考虑,有多个中断(IO、键盘、鼠标等)在系统中一直发生,但两次中断之间的持续时间非常长,CPU可以在这两次中断之间做很多其他有益的事情。为了进一步减轻CPU的负担,DMA有助于传输数据。因此,如果引发中断并调用子例程,所有后续中断都可以被屏蔽,因为您已经在该子例程中e、 但请相信我,这些子程序非常小,在下一个数据包到达之前,它们几乎不会占用任何时间。这意味着数据包到达速度必须高于处理速度


    另一个例子:对于路由器/交换机,99%的时间任务是路由和交换,因此子例程和中断优先级完全不同,而且它们总是被成吨的数据包轰炸,因此在这种情况下,子例程将永远不会出现,直到有另一个数据包在间隔处。至少我在这种网络设备上工作过。

    C你能详细说明一下DMA和中断是如何结合在一起的吗?让我重新表述一下,看看我是否理解正确。中断中不再有中断。CPU在上半部分处理程序完成之前不能做其他事情,所以从这个意义上说,DMA是同步的。它也被称为“DMA”,因为内部机制(即环描述符)在从NIC到RAM的数据传输期间不需要CPU参与。只是一个次要问题,同步DMA不会导致忙等待或阻塞(在处理程序中)CPU,因为在DMA完成之前CPU不能做任何其他事情。但如果是这种情况,DMA的优势似乎要小得多,因为CPU只是通过忙等待来参与传输。第一个引用的链接实际上提到了NAPI和轮询模式驱动程序。它应该解决这个问题吗?这是您可以采用的方法之一跟随。你也可以跟随。非常感谢你的详细和耐心的解释:)