首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >网卡驱动程序中DMA同步吗?

网卡驱动程序中DMA同步吗?
EN

Stack Overflow用户
提问于 2017-07-31 02:14:51
回答 1查看 1.9K关注 0票数 2

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-31 04:15:35

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

编辑:

让我跟英特尔以太网控制器解释一下。如果您查看第3.2.3节,其中给出了RX描述符格式,它有status字段,解决了包所有权问题。对于谁拥有包(NIC驱动程序或CPU),有两点可以避免争用和数据包损坏。

DMA (从I/O设备到主机内存): RX/TX环由“硬件描述符”和“缓冲区”(从主机内存中分割)组成。当我们说DMA,控制器传输数据,这发生在硬件FIFO到这个主机内存。

  1. 让我们假设我的环缓冲区(512个字节)不足以容纳完整的传入数据包(1500或Jumbo数据包),在这种情况下,该数据包可能跨越多个环形缓冲区,并且在EOP(结束数据包)状态字段中,指示现在已经接收到完整的数据包(考虑到所有的健全检查/校验和已经完成)。
  2. 第二个问题是现在谁拥有包(驱动程序还是CPU以供进一步使用)?现在,在设置状态标志DD (描述符完成)之前,它属于驱动程序。一旦设置好CPU,CPU就可以抓取它,进行拾取和戳戳。

这是特定于RX路径的。TX路径略有不同。

考虑到这一点,系统中总是会出现多个中断(IO、键盘、鼠标等),但是两个中断之间的时间太长了,因此CPU可以在两者之间做很多其他好的事情。为了进一步卸载CPU,DMA有助于传输数据。因此,如果引发一个中断并调用子例程,那么所有后续中断都可以被屏蔽,因为您已经在该子例程中了,但是相信我,这些子例程非常小,它们在下一个数据包到达之前几乎不会在任何时候消耗。这意味着您的数据包到达速度必须高于您的处理速度。

另一个原因:对于路由器/交换机,99%的时间任务是路由和交换,因此子例程和中断优先级完全不同,而且它们总是被大量的数据包轰炸,因此在这种情况下,子例程将永远不会出现,直到另一个包处于阻塞状态。至少我曾经研究过这样的网络设备。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45406602

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档