我的理解是当NIC适配器接收到新数据包时,上半部分处理程序使用DMA将数据从RX缓冲区复制到主存储器。我认为这个处理程序不应该在传输完成之前退出或释放INT引脚,否则新的数据包会破坏旧的数据包。
但是,DMA通常被认为是异步的,并且本身需要中断机制来通知CPU数据传输已完成。因此我的问题是,DMA实际上是同步的,或者中断实际上可能发生在另一个中断处理程序中?
答案 0 :(得分:2)
通常,此同步通过NIC(设备驱动程序)和主机CPU之间的环描述符进行。您将获得数据包路径详细信息here。我已经解释了下面的环描述符。
编辑:
让我用Intel's ethernet Controller解释一下。如果你看一下3.2.3节,其中给出了 RX描述符格式 ,它有 状态 字段,解决了数据包所有权问题。关于谁拥有数据包(NIC驱动程序或CPU),有两个要点可以避免争用和数据包损坏。
DMA(从I / O设备到主机内存): RX / TX环由'硬件描述符'和'缓冲区'组成(从主机内存中划分)。当我们说DMA,控制器传输数据时,这会从硬件FIFO发送到这个主机存储器。
这是RX路径特有的。 TX路径略有不同。
以这种方式考虑,系统中一直有多个中断(IO,键盘,鼠标等)发生,但两次中断之间的持续时间是如此巨大以至于CPU可以在其间做很多其他好事。 。为了进一步卸载CPU工作,DMA有助于传输数据。因此,如果引发中断并调用子程序,则所有后续中断都可以被屏蔽,因为您已经在该子程序中,但请相信我这些子程序非常小,它们几乎不会消耗任何时间,直到您的下一个数据包到达。这意味着您的数据包到达速度必须高于处理速度。
另一个例子:对于路由器/交换机99%的时间任务是路由和切换因此子程序和中断优先级是完全不同的,而且他们一直轰炸大量数据包因此在这种情况下子程序永远不会到达那里是海湾的另一个数据包。至少我已经研究过这种网络设备。