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