网络设备驱动基本原理和框架
一、 协 议栈层次对比
二、 网络子系统
Kernel Space 的分层架构:
1. Linux 网络子系统的顶部是系统调用接口层。 它为用户空间提供的应用程
序提供了一种 访问内核网络子系统的方法( socket )。
2. 位于其下面是一个协议无关层,它提供一种通用的方法来使用传输层协
议。
3. 然后是具体协议的实现,在 Linux 中包括内核的协议 TCP,UDP ,当然还
有 IP 。
4. 然后是设备无关层,它提供了协议与设备驱动通信的通用接口;
5. 最下面是设备的驱动程序。
设备无关接口将协议与各种网络驱动连接在一起,这一层提供一组通用函数
供底层网络设备驱动使用,让它们可以对高层协议栈进行操作。
需要从协议层向设备发生数据, 需要调用 dev_queue_xmit 函数,这个函
数对数据进行列队,然后交由底层驱动程序的 hard_start_xmit 方法最终
完成传输。
接收通常是使用 netif_rx 执行的。 当底层设备程序接收到一个报文 (发生
中断)时,就会调用 netif_rx 将数据上传至设备无关层。
三、 设 备无关层到驱动层的体系结构
下图为设备无关层( Device agnostic interface )到驱动层( Device Driver )的
体系结构:
解释:
1)、网络协议接口层向网络层协议提供提供统一的数据包收发接口,不论上层
协议为 ARP 还是 IP,都通过 dev_queue_xmit() 函数发送数据, 并通过 netif_rx()
函数接受数据。这一层的存在使得上层协议独立于具体的设备。
2 )、网络设备接口层向协议接口层提供统一的用于描述具体网络设备属性和操
作的结构体 net_device ,该结构体是设备驱动功能层中各函数的容器。实际上,
网络设备接口层从宏观上规划了具体操作硬件的设备驱动功能层的结构。
3 )、设备驱动功能层各函数是网络设备接口层 net_device 数据结构的具体成员,
是驱使网络设备硬件完成相应动作的程序,他通过 hard_start_xmit() 函数启动发
送操作,并通过网络设备上的中断触发接收操作。
4 )、网络设备与媒介层是完成数据包发送和接受的物理实体,包括网络适配器
和具体的传输媒介,网络适配器被驱动功能层中的函数物理上驱动。对于 Linux
系统而言,网络设备和媒介都可以是虚拟的。
1 、 网络协议接口层
这里主要进行数据包的收发,使用函数原型为:
dev_queue_xmit( struct sk_buff *skb); int netif_rx( struct sk_buff *skb);
这里使用了一个 skb_buff 结构体,定义于 include/linux/skbuff.h 中,它的含义为
套接字缓冲区“ ”,用于在 Linux 网络子系统各层间传输数据。 他是一个双向链表,
在老的内核中会有一个 list 域指向 sk_buff_head 也就是链表头,但是在我研究
的 linux2.6.30.4 内核中已经不存在了,如下图:
sk_buff 中重要的数据成员
struct device *dev; 正在处理该包的设备
__u32 sadd;r//IP 元地址
__u32 daddr;//IP 目的地址
__u32 raddr;//IP 路由器地址
unsigned char *head;// 分配空间的开始
unsigned char *data;// 有效数据的开始
unsigned char *tail;// 有效数据的结束
unsigned char *end;// 分配空间的结束