Linux网络设备驱动——驱动模型

本文深入探讨Linux3.14.0内核中的网络驱动模型,解释了网络驱动不依赖于/dev下的设备文件,而是通过socket接口进行交互。文章介绍了网络驱动的4层结构,重点解析了sk_buff和net_device核心类,以及dev_queue_xmit(), ndo_start_xmit()等关键方法。此外,还讨论了中断处理函数和netif_rx()在数据收发中的作用。" 126565979,11339757,N-Gram与文本规范:增强深度学习模型,"['深度学习', '自然语言处理', '特征工程', '神经网络', 'pytorch']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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_ops是操作方法集, 向上提供接口的同时也向下操作硬件
  • netdev_ops一个设备'>网络设备的操作方法集
  • 私有数据 和其他模型框架一样, net_device对象也提供了承载私有数据的域, 不过不是使用void *, 参见下文alloc_ethdev

核心方法

  • dev_queue_xmit()是网络协议接口层向下发送数据的接口, 内核已经实现, 不需要设备'>网络设备驱动实现
  • ndo_start_xmit()是设备'>网络设备接口层向下发送数据的接口, 位于net_device->net_device_ops, 会被dev_queue_xmit()回调, 需要网络驱动实现
  • netif_rx()是设备'>网络设备接口层向上发送数据的接口, 不需要网络驱动实现
  • 中断处理函数是设备'>网络设备媒介层收到数据后向上发送数据的入口, 需要网络驱动实现,最后要调用netif_rx()

核心类与方法详述

sk_buff

套接字缓冲区是数据在多层模型中传输的载体,其被处理的最终结果就是网络数据包, Linux巧妙的使用了移动head/tail指针的方式实现了网络模型中每一层对数据包的加工过程。sk_buff部分定义如下

 427 struct sk_buff {
 428         /* These two members must be first. */
 429         struct sk_buff          *next;
 430         struct sk_buff          *prev;
 432         ktime_t                 tstamp;
 434         struct sock             *sk;
 435         struct net_device       *dev;
 443         char                    cb[48] __aligned(8);
 445         unsigned long           _skb_refdst;
 449         unsigned int            len,
 450                                 data_len;
 451         __u16                   mac_len,
 452                                 hdr_len;
 473         __be16                  protocol;   
 534         __u16                   inner_transport_header;
 535         __u16                   inner_network_header;
 536         __u16                   inner_mac_header;
 537         __u16                   transport_header;
 538         __u16                   network_header;
 539         __u16                   mac_header;
 540         /* These elements must be at the end, see alloc_skb() for details.  */
 541         sk_buff_data_t          tail;
 542         sk_buff_data_t          end;
 543         unsigned char           *head,
 544                                 *data;
 545         unsigned int            truesize;
 546         atom
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值