【推荐阅读】
熟悉Linux网卡驱动基本框架以及驱动程序编写步骤
实现一个虚拟网卡驱动程序
1、概述
网卡工作在OSI的最后两层,物理层和数据链路层,主要是负责收发网络的数据包,它将网络通信上层协议传递下来的数据包以特定的媒介访问控制方式进行发送,并将接收到的数据包传递给上层协议。在知道了网卡的工作内容后,我们也就清楚了网卡驱动程序要实现的功能,即通过控制硬件实现数据的传输,一方面让硬件将上层传递的数据包发送出去,另一方面接收外部数据并传递给上层。
为了能更加清楚理解内核中网卡驱动的程序,我们按照功能对它进行层次划分,划分后的Linux内核的网卡驱动程序的框架如下图所示:
![](https://img-blog.csdnimg.cn/img_convert/19ba7f4d3b470e6b051e1be810e93be2.webp?x-oss-process=image/format,png)
从上图可以看出内核中的网卡驱动程序被划分为4层:
网络协议接口层:实现统一的数据包收发协议,该层主要负责调用dev_queue_xmit() 函数发送数据包到下层或者调用** netif_rx()** 函数接收数据包,都使用sk_buff作为数据的载体;
网络设备接口层:通过net_device 结构体来描述网络设备信息,是设备驱动功能层各个函数的容器,向上实现不同硬件类型接口的统一;
设备驱动功能层:用来负责驱动网络设备硬件来完成各个功能,各个函数是网络设备接口层net_device数据结构的具体成员,比如最核心的功能实现数据包的发送和数据包的接收;
网络设备和媒介层:物理介质,驱动程序作用的对象。对于Linux系统而言,网络设备和媒介也可以是虚拟的,如后面编写的虚拟网卡驱动程序它就没有网络物理设备媒介;
其中net_device 结构体是协议层和硬件交互的桥梁,它屏蔽了硬件之间的差异,使得协议层不需要关心硬件的操作,在发送数据时只需要调用net_device 结构体中操作函数完成数据的收发。net_device 结构体中的操作函数是由设备驱动功能层实现的函数注册的,对应不同的硬件设备,驱