Linux素来以其强大的网络功能著名,同时, 网络设备也作为三大设备之一, 成为Linux驱动学习中必不可少的设备类型, 此外, 由于历史原因, Linux并没有强制对网络设备贯彻其"一切皆文件"的思想, 网络设备不以/dev下的设备文件为接口,用户程序通过socket作为访问硬件的接口。本文以Linux3.14.0内核为例, 讨论Linux中的网络驱动模型
Linux的网络设备并不使用文件作为用户程序访问网络设备的接口,所以/sys/dev下和/dev下并没有相应的网络设备文件,在Linux中,用户程序最终使用套接字来访问网络设备。
框架
上图就是经典的OSI 7层模型,Linux的网卡驱动程序处于OSI模型中的数据链路层,他的职责就是将上上层的协议栈传过来的信息通过网卡发送出去,\
Linux的网络驱动模型采用4层结构:
协议接口层 向网络协议提供统一的数据包发送接口,上层任何形式的协议都通过dev_queue_xmit()发送,通过netif_rx()接收,都使用sk_buff作为数据的载体
设备接口层向协议接口层提供统一的用于描述具体网络设备属性和操作的结构体net_device,这个结构从整体规划了具体操作硬件的设备驱动功能层的结构,是设备驱动功能层的各个函数的容器,开发网络驱动的主要工作就是编写驱动功能层的相关函数以填充net_device数据结构的内容并将net_device注册到内核
驱动功能层的各个函数是网络设备接口层net_device数据结构的具体成员,是驱动 网络设备硬件完成相应动作的程序,它通过ndo_start_xmit()函数启动发送动作,并通过网络设备上的中断触发接收操作,通过中断或POLL机制接收
设备与媒介层 是完成数据收发的物理实体,网卡被设备驱动层中的函数在物理上驱动,对于Linux系统而言,网络设备和媒介都可以是虚拟的
第2 and 第3层是驱动开发主要关心的层次
核心类与方法简述
在分析核心对象与核心方法的时候, 找到在哪向上提供接口, 在哪向下操作硬件.????
核心类
sk_buff是网络驱动框架中信息的载体, 是网络分层模型中对数据进行层层打包以及层层解包的载体
net_device对象描述了一个网络设备, **其中的struct net_device_ops *netdev