6. 网卡驱动程序的设计
编写网卡驱动程序,需要对以下三类结构体进行相应的操作:
1.与网络协议栈相关的结构体,如sk_buff结构体。
2.网卡和协议栈接口相关的结构体,如net_device结构体。
3.与I/O总线相关的结构体,如利用PCI总线进行数据包传送的DMA缓冲区以及表示网卡的pci_dev结构体。
设计网卡驱动时,需要针对以上的数据结构实现相应的功能,如对sk_buff结构的操作实现对数据包的有效控制;对net_device结构的操作可以对网卡进行操作(如开启、关闭等),可以发送数据包以及轮询数据包,可以制定网卡的相应的定时操作以及统计数据包,可以为用户提供配置功能(ethtool)等。在设计网卡驱动时,需要考虑如何与上层协议的协调以及对底层总线地址的控制。
有关网卡驱动程序更详细的设计流程可以参考《Essential Linux Device Driver》及《Linux Device Driver 3rd》。
7. 总结
本文的分析重点为网卡驱动中涉及到的重要数据结构,以及发送和接收数据包的实现,对这些实现机制了解后,对于设计和实现驱动程序应该会有帮助,因为该机制本身难度很大,加上作者水平有限,其中的分析结论不能保证完全正确。
尚有不能明确的问题,希望大牛们能帮我解答:
1.PCI总线地址与网卡物理地址这两个之间的关系,我一直不是很清楚,所以以上的分析都未明确说明,在画图时都忽略了这部分细节;
2.DMA buffer在接收包和发包时这其中的ring是如何详细调度的;
文章来源CU社区:【原】Linux-千兆网卡驱动实现机制浅析