我的理解是,当NIC适配器接收到新的数据包时,上半部分处理程序使用DMA将数据从RX缓冲区复制到主内存。我认为这个处理程序不应该在传输完成之前退出或释放INT引脚,否则新的数据包会破坏旧的数据包。
然而,DMA通常被认为是异步的,它本身要求中断机制通知CPU数据传输已经完成。因此,我的问题是,DMA在这里实际上是同步的,还是中断实际上可以在另一个中断处理程序中发生?
发布于 2017-07-31 04:15:35
通常,这种同步是通过环描述符在NIC(设备驱动程序)和主机CPU之间进行的。您将获得数据包路径详细信息这里。我已经解释了下面的环描述符。
编辑:
让我跟英特尔以太网控制器解释一下。如果您查看第3.2.3节,其中给出了RX描述符格式,它有status字段,解决了包所有权问题。对于谁拥有包(NIC驱动程序或CPU),有两点可以避免争用和数据包损坏。
DMA (从I/O设备到主机内存): RX/TX环由“硬件描述符”和“缓冲区”(从主机内存中分割)组成。当我们说DMA,控制器传输数据,这发生在硬件FIFO到这个主机内存。
这是特定于RX路径的。TX路径略有不同。
考虑到这一点,系统中总是会出现多个中断(IO、键盘、鼠标等),但是两个中断之间的时间太长了,因此CPU可以在两者之间做很多其他好的事情。为了进一步卸载CPU,DMA有助于传输数据。因此,如果引发一个中断并调用子例程,那么所有后续中断都可以被屏蔽,因为您已经在该子例程中了,但是相信我,这些子例程非常小,它们在下一个数据包到达之前几乎不会在任何时候消耗。这意味着您的数据包到达速度必须高于您的处理速度。
另一个原因:对于路由器/交换机,99%的时间任务是路由和交换,因此子例程和中断优先级完全不同,而且它们总是被大量的数据包轰炸,因此在这种情况下,子例程将永远不会出现,直到另一个包处于阻塞状态。至少我曾经研究过这样的网络设备。
https://stackoverflow.com/questions/45406602
复制相似问题