linux-kernel – 关于Linux内核中的NAPI实现
我试图了解启用NAPI的网络驱动程序,并对此有一些疑问.
如果我在接口处有网络数据包时以外行人的话来谈论它,它会被通知给CPU并执行相应的以太网驱动程序(中断处理程序)代码.然后,以太网驱动程序代码将数据包从以太网的设备存储器复制到DMA缓冲区,最后是数据包被推到上层. NAPI禁用以太网驱动程序是否真的如此? 现在,对于NAPI启用的以太网驱动程序,无论何时数据包到达接口,都会通知CPU并执行相应的以太网驱动程序代码(中断处理程序).在中断处理程序代码中,我们检查是否接收到中断类型数据包. if(statusword & SNULL_RX_INTER) snull_rx_ints(dev,0);//Disbale further interrupts netif_rx_schedule(dev); 禁用进一步中断意味着什么? 这是不是意味着数据包仍然被设备捕获并保存在设备内存中,但没有通知CPU有关这些数据包的可用性? 另外,CPU的意思是汇集设备,就像CPU每隔几秒就会运行snull_poll()方法并将设备内存中的任意数量的数据包复制到DMA缓冲区并推送到上层? 如果有人为我提供了清晰的图片,那将会很有帮助. 解决方法
通常,驱动程序会清除导致中断的情况.但是,NAPI驱动程序也可能在ISR完成时禁用接收中断.
是.
它通常不是“设备内存”.
由于已禁用接收中断,因此不会通知NAPI驱动程序此事件.
大概你实际上是在询问“民意调查”?
在轮询之前,NAPI驱动程序不会延迟或暂停自己“几秒钟”. NAPI驱动程序中可能存在的错误称为“腐烂数据包”. BTW 附录
SMSC LAN911x以太网芯片比我以前所描述的更为复杂.除了MAC之外,这些芯片还具有集成PHY,并且具有TX和RX FIFO,而不是在主存储器中使用缓冲环或列表.
INT_STS在头文件中定义为 #define INT_STS 0x58 数据表中第5.3节“系统控制和状态寄存器”中的表列出了(相对)地址0x58处的寄存器 58h INT_STS Interrupt Status 因此,smsc911x设备驱动程序使用与HW数据表完全相同的寄存器名称. u32 intsts = smsc911x_reg_read(pdata,INT_STS); 因此,中断状态的32位(在变量intsts中)与中断屏蔽的32位(在变量中)进行布尔运算. 5.3.3 INT_STS—Interrupt Status Register RX Status FIFO Level Interrupt (RSFL). Generated when the RX Status FIFO reaches the programmed level possible()运算符用于编译器优化,以利用CPU中的分支预测功能.驱动程序的作者指示编译器优化代码以获得所附逻辑表达式的真实结果(例如,三个整数的AND运算,这将指示需要服务的中断条件).
我对阅读LAN9118数据表的看法是,确实没有专门用于接收帧的中断. 5.3.6 FIFO_INT—FIFO Level Interrupts RX Status Level. The value in this field sets the level,in number of DWORDs,at which the RX Status FIFO Level interrupt (RSFL) will be generated. When the RX Status FIFO used space is greater than this value an RX Status FIFO Level interrupt (RSFL) will be generated. smsc911x驱动程序显然使用此阈值的默认值为零.RX状态FIFO中的每个条目都占用一个DWORD.该阈值的默认值是0x00(即“第一”帧上的中断).如果该阈值大于零,则存在“丢包”的可能性. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |