Linux 网卡驱动学习(二)(网络驱动接口小结)
【摘要】前文我们分析了一个虚拟硬件的网络驱动例子,从中我们看到了网络设备的一些接口,其实网络设备驱动和块设备驱动的功能比较类似,都是发送和接收数据包(数据请求)。当然它们实际是有很多不同的。
1、引言
首先块设备在/dev目录下有设备节点,而网络设备没有这样的设备入口。read,write等常规的文件接口在网络设备下也没有意义。
最大的区别在于:块设备只响应内核的数据请求;而网络设备驱动要异步地接收来自外部的数据包。简单地说,块设备驱动是被要求传输数据而网络设备是主动请求传输数据。网络设备驱动还需要支持设置地址,修改传输参数等等这样的操作,所以网络设备驱动的api需要提供这些接口。
本文是对上文虚拟硬件的网络驱动例子进行一个简单的梳理。
(1)网络设备注册
头文件:<linux/netdevice.h>
struct net_device 网络设备结构体
struct net_device *alloc_netdev (int size_priv, const char *name, void (*setup)(struct net_device *));
int register_netdev(struct net_device *device); 注册网络设备
void unregitster_netdev(struct net_device *device); 注销网络设备
(2)打开和关闭
驱动在加载入内核后,内核会调用probe函数来探测它。在网络接口可以传送数据包时,内核必须首先打开它并给它设置地址。内核打开和关闭网络接口是由ifconfig命令触发的。
int (*open)(struct net_device*); 打开网络设备
int (*stop)(struct net_device*); 关闭网络设备
void netif_start_queue(struct net_device*); 启动网络传输队列
void netif_stop_queue(struct net_device*); 关闭网络传输队列
(3)网络数据的发送
网络接口最重要的作用是发送和接收网络数据。
头文件:<linux/skbuff.h> 定义了网络驱动中传输的基本单元,struct sk_buff
struct netdeviceops 网络设备驱动需要实现的接口函数
netdev_tx_t (*ndo_start_xmit) (struct sk_buff *skb, struct net_device *dev); 传输网络数据包的函数
void (*ndo_tx_timeout) (struct net_device *dev); 传输超时函数
(4)网络数据的接收
接收网络数据相对于发送数据要复杂一些,因为你需要在原子上下文中把分配一个 sk_buff 并把它移交给上层处理。
数据包接收有两种实现方式:中断驱动和轮询。大多数驱动都是中断驱动的,有一些高吞吐量的驱动会使用轮询的方式。
struct sk_buff *dev_alloc_skb(unsigned int length); 原子上下文中分配skb
printk_ratelimit() 限制printk的输出频率,在中断相应函数中减少输出
- 1
- 2
- 1
- 2
实现高吞吐量的网络驱动,要减少网络阻塞最好的方法是使用napi,后面会介绍
(5)中断处理
硬件可以中断cpu发送两种事件:新的数据包到来和发送的数据包已经发送完成。
判断并处理数据包事件
如果在其他地方暂时停止了发送队列,应该在中断函数中重新启动它
(6)NAPI
高吞吐量的网络接口如果每个数据包都用中断来处理的话会给系统带来很大的负担,这个时候应该使用基于轮询的 NAPI。这样可以减轻系统的负担,减少阻塞的时间。
只有极少数的设备实现了NAPI,因为实现起来比中断要复杂,而且有其他的一些条件。
在中断处理函数中,首先禁止进一步的中断处理,然后调度轮询函数,进入轮询函数后连续处理多个数据发送请求。
int (*poll)(struct net_device *dev, int *budget); 网络驱动轮询函数
int netif_rx_schedule(struct net_device *dev); 准备调用轮询函数
int (*poll)(struct net_device *dev, int *budget); 轮询函数
http://blog.csdn.net/xy010902100449/article/details/47132917
Linux 网卡驱动学习(二)(网络驱动接口小结)的更多相关文章
- Linux Platform驱动模型(二) _驱动方法
在Linux设备树语法详解和Linux Platform驱动模型(一) _设备信息中我们讨论了设备信息的写法,本文主要讨论平台总线中另外一部分-驱动方法,将试图回答下面几个问题: 如何填充platfo ...
- Linux Platform驱动模型(二) _驱动方法【转】
转自:http://www.cnblogs.com/xiaojiang1025/archive/2017/02/06/6367910.html 在Linux设备树语法详解和Linux Platform ...
- [Binder深入学习二]Binder驱动——基础数据结构二
Userspace和KernelSpace进行交互时,大部分命令是通过 ioctl 实现的,在这个过程中,最重要的一个便是 BINDER_WRITE_READ 命令了. #define BINDER_ ...
- Linux——shell简单学习(二)
流控制语句: for…done语句 格式:for 变量 in 名字表 do 命令列表 done 例子: #!/bin/sh for DAY in Sunday Monday Tuesday ...
- Linux运维学习笔记-网络技术知识体系总结
传统网络知识体系 未来网络SND模型架构
- Linux运维学习笔记-网络安全等级保护
网络安全等级保护简介与作用: 验证信息系统是否满足相应安全保护等级的一个过程. 对不同信息系统分等级进行保护.
- Linux网络驱动--snull
snull是<Linux Device Drivers>中的一个网络驱动的例子.这里引用这个例子学习Linux网络驱动. 因为snull的源码,网上已经更新到适合最新内核,而我自己用的还是 ...
- 嵌入式Linux驱动学习之路(二十五)虚拟网卡驱动程序
一.协议栈层次对比 设备无关层到驱动层的体系结构 1).网络协议接口层向网络层协议提供提供统一的数据包收发接口,不论上层协议为ARP还是IP,都通过dev_queue_xmit()函数发送数据,并通过 ...
- Linux 网卡驱动学习(一)(分析一个虚拟硬件的网络驱动样例)
在Linux,网络分为两个层,各自是网络堆栈协议支持层,以及接收和发送网络协议的设备驱动程序层. 网络堆栈是硬件中独立出来的部分.主要用来支持TCP/IP等多种协议,网络设备驱动层是连接网络堆栈协议层 ...
随机推荐
- 解决前端工程师与UI设计协同工作的问题
前端工程师与UI设计协同工作主要环节在于设计图与前端界面是否一致.(还原度) 不得不说,设计图与前端界面实现不一致的问题时有发生.(好吧,我经验有限)所以经常写完的前端页面都需要去修改.(特别是做移动 ...
- JAVA-字符串按指定长度换行
可能有汉字的字符串按指定长度换行. public String getStringByEnter(int length, String string) throws Exception { for ( ...
- Spring事务支持:利用继承简化配置
因为事务代理的实现类是 TransactionProxyFactoryBean . 事务代理Bean必须注入事务管理器. 大部分情况下,每个事务代理的事务属性大同小异,对于这种情况,Spring提供了 ...
- 九度oj 题目1177:查找
题目描述: 读入一组字符串(待操作的),再读入一个int n记录记下来有几条命令,总共有2中命令:1.翻转 从下标为i的字符开始到i+len-1之间的字符串倒序:2.替换 命中如果第一位为1,用命 ...
- 移动端(钉钉微服务)webpack配置需要移除hash来解决应用更新后白屏的问题
钉钉微服务webpack配置调整方案 1: Vue CLI配置修改方法 a. 修改build下webpack.prod.config.js.去掉图中三处hash(.[chunkhash]): b. 修 ...
- 【bzoj2802】[Poi2012]Warehouse Store 贪心+堆
题目描述 有一家专卖一种商品的店,考虑连续的n天.第i天上午会进货Ai件商品,中午的时候会有顾客需要购买Bi件商品,可以选择满足顾客的要求,或是无视掉他.如果要满足顾客的需求,就必须要有足够的库存.问 ...
- 【bzoj2400】Spoj 839 Optimal Marks 网络流最小割
题目描述 定义无向图中的一条边的值为:这条边连接的两个点的值的异或值. 定义一个无向图的值为:这个无向图所有边的值的和. 给你一个有n个结点m条边的无向图.其中的一些点的值是给定的,而其余的点的值由你 ...
- Python tldextract模块准确获取域名和后缀
Python tldextract 模块 - 功能说明 tldextract准确地从URL的域名和子域名分离通用顶级域名或国家顶级域名. 例如,http://www.google.com,你只想取出连 ...
- 排列计数(bzoj 4517)
Description 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i,则称 i 是稳定的.序列恰好有 m 个数是 ...
- Gcd(bzoj 2818)
Description 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对. Input 一个整数N Output 如题 Sample Input 4 Sam ...