当前位置: 首页 > news >正文

Linux网络设备驱动基本原理,Linux网络设备驱动基本原理和框架.pdf

网络设备驱动基本原理和框架

一、 协 议栈层次对比

二、 网络子系统

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;// 分配空间的结束

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 生成可执行BPEL代码所需必要信息分析和归纳
  • 海信电视linux安装软件,海信电视无法安装软件怎么办,两种最新方法完美解决!...
  • 打造我们心中永恒的m500
  • 基于linux嵌入式开发实现曲线图,基于Linux嵌入式操作系统实现掌上娱乐系统的设计...
  • 数据库设计
  • LINUX下如何格式化namenode,HDFS【2.5.1】系列3:解密命令行 ./bin/hdfs namenode -format
  • linux基础培训下载,huimaiLinux系统基础培训.ppt
  • 超轻量级MVC框架的设计和实现 (1)
  • linux nginx discuz安装失败,discuz! and Nginx
  • 夜梦吕布,未知所指
  • 大连理工大学c语言第三次上机作业答案,第一次上机作业参考答案
  • 利用Oracle构建BI信息板
  • 九九乘法表 冒泡排序 c语言,冒泡排序--打印三角形--九九乘法表
  • c语言输出字符串改asck,stm8s的c语言编程例程.doc
  • 超轻量级MVC框架的设计和实现 (2)
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • 30天自制操作系统-2
  • C++类中的特殊成员函数
  • ES2017异步函数现已正式可用
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • JavaScript 一些 DOM 的知识点
  • Javascript编码规范
  • Just for fun——迅速写完快速排序
  • KMP算法及优化
  • mac修复ab及siege安装
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • PHP的类修饰符与访问修饰符
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 当SetTimeout遇到了字符串
  • 理清楚Vue的结构
  • 浅谈web中前端模板引擎的使用
  • 嵌入式文件系统
  • 三分钟教你同步 Visual Studio Code 设置
  • raise 与 raise ... from 的区别
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • 昨天1024程序员节,我故意写了个死循环~
  • (~_~)
  • (1)svelte 教程:hello world
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (k8s)kubernetes集群基于Containerd部署
  • (八)c52学习之旅-中断实验
  • (二)linux使用docker容器运行mysql
  • (六)软件测试分工
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (七)glDrawArry绘制
  • (转)jdk与jre的区别
  • .NET : 在VS2008中计算代码度量值
  • .Net Core 微服务之Consul(三)-KV存储分布式锁
  • .net framework4与其client profile版本的区别
  • .Net OpenCVSharp生成灰度图和二值图
  • .net refrector
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅
  • .NET 实现 NTFS 文件系统的硬链接 mklink /J(Junction)
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器