一、概述    

Linux网络设备驱动程序遵循通用的接口,设计时采用的是面向对象的方法,一个设备就是一个对象(net_device结构)。一个网络设备最基本的方法有初始化、发送和接收等。

Linux网络设备驱动程序的体系结构可以分为四层:网络协议接口层、网络设备接口层、设备驱动功能层和网络设备与媒介层,如图1所示。网络设备驱动程序最主要的工作是完成设备驱动功能层。在Linux中,所有网络设备都抽象为一个接口,这个接口提供了对所有网络设备的操作集合。由数据结构struct net_device来表示网络设备在内核中的运行情况,即网络设备接口。它既包括纯软件网络设备接口,如环路(loopback),也包括硬件网络设备接口,如以太网卡。由以dev_base为头指针的设备链来集体管理所有网络设备,该设备链中的每个元素代表一个网络设备接口。数据结构net_device中有很多供系统访问和协议层调用的设备方法,包括初始化,打开和关闭网络设备的open和stop函数,处理数据包发送的hard_start_xmit函数,以及中断处理函数等。

图1 网络设备驱动体系结构

二、数据包发送流程

当网络子系统上层有数据包要发送时,通过调用网络设备驱动中的实现的ndo_start_xmit函数,将要发送的数据包封装在套接字缓冲区skb参数中。在驱动程序的发送数据包函数的具体实现中,它将首先在skb数据包所在主存中的数据块和网络设备内存之间建立一个DMA通道,然后启动该DMA通道将数据包由主存传输到设备内存,之后由网络设备硬件通过网络接口或者天线将数据包发送出去。数据包发送成功后会向处理器发出一个硬件中断,在中断处理程序里做一些善后处理工作,如图2所示。

图2 网络设备驱动程序数据包发送流程

三、数据包接收流程

数据包的接收是一个异步的过程,正因为这样,出于系统性能的考虑,绝大部分网络设备都支持数据接收中断,因此在驱动程序中是通过中断处理程序来接收数据包的。由于系统主存与网络设备之间已经建立好DMA通道,所有当有数据包到达网络设备时,数据包会被自动传输到系统主存,此时将产生一个中断信号,从而进入驱动程序的中断处理函数,在中断处理函数里驱动首先会分配一个套接字缓冲区skb来容纳收到的数据包,然后将skb传递到网络子系统的上层代码中,具体传递的过程是驱动程序通过调用netif_rx(skb)函数实现的,上层代码负责释放该skb所占用的内存,如图3所示。

图3 网络设备驱动数据包接收流程

转载于:https://www.cnblogs.com/lknlfy/archive/2012/11/29/2794819.html

Linux网络设备驱动概述相关推荐

  1. Linux网络设备驱动结构概述

    2019独角兽企业重金招聘Python工程师标准>>> 网络设备驱动相比字符型设备的驱动要复杂一些,除了总体上驱动的框架有一些相似外,有很多地方都是不同,但网络设备驱动有一个很大的特 ...

  2. Linux网络设备驱动-以太网驱动分析

    1.概述 网络上数据包的发送和接收由网络设备完成.网络设备与字符设备.块设备不同,其并不对应于/dev目录下的文件,也不能使用常规的操作方法操作网络设备.现在比较通用的做法是通过套接字访问网络设备.网 ...

  3. STM32MP157驱动开发——Linux 网络设备驱动

    STM32MP157驱动开发--Linux 网络设备驱动 一.简介 STM32MP1 GMAC 接口简介 YT8511C 详解 二.驱动开发 1.网络外设的设备树 2.设备驱动 三.测试 网速测试 参 ...

  4. linux pci 网卡驱动,linux网络设备驱动_pci网卡

    <linux网络设备驱动_pci网卡>由会员分享,可在线阅读,更多相关<linux网络设备驱动_pci网卡(12页珍藏版)>请在技术文库上搜索. 1. LinuxLinux 网 ...

  5. 编写Linux网络设备驱动(上)

    编写Linux网络设备驱动(上) <编写Linux网络设备驱动(上)> 来自:刘建文 | 学术半·IT歌·文 作者:刘建文 关键字:Linux 驱动程序 永久链接地址:http://art ...

  6. 《Linux设备驱动开发详解》——第16章 Linux网络设备驱动一

    Linux系统对网络设备驱动定义了4各层次:网络协议接口层,网络设备接口层,提供实际功能的设备驱动功能层,网络设备与媒介层 16.1 Linux网络设备驱动的结构 (1)网络协议接口层:提供统一的数据 ...

  7. linux网络设备驱动结构体,Linux网络设备驱动之设备驱动的注册与注销(二)

    网络设备驱动的注册与注销由 register_netdev( ) 和 unregister_netdev( ) 函数完成,这两个函数的原型为: int register_netdev(struct n ...

  8. Linux 网络设备驱动开发(一) —— linux内核网络分层结构

    Linux内核对网络驱动程序使用统一的接口,并且对于网络设备采用面向对象的思想设计. Linux内核采用分层结构处理网络数据包.分层结构与网络协议的结构匹配,既能简化数据包处理流程,又便于扩展和维护. ...

  9. Linux设备驱动01:Linux设备驱动概述

    目录 1. 设备驱动的作用 2. 有无操作系统时的设备驱动 2.1 无操作系统 2.1.1 硬件.驱动和应用程序的关系 2.1.2 单任务软件典型架构 2.2 有操作系统 2.2.1 硬件.驱动.操作 ...

最新文章

  1. python爬虫,爬取猫眼电影2(xpath和bs4)
  2. 一张A4纸的牛B变化(你能吗?)
  3. 统计学习方法第十八章作业:PLSA 概率潜在语义分析算法 代码实现
  4. javascript array sort()
  5. java学习(149):字符输入流
  6. 【CVPR2019】Workshops 研讨会列表及链接
  7. Linux-ubuntu学习(第一天)
  8. gridreport如何设置打印3次_pdfFactory如何设置限制打印和浏览文档权限
  9. hadoop中的9000端口代表什么_启动hadoop后,fs.defaultFS中配置的9000端口没有出现在监听中?...
  10. pdf增强锐化软件_安卓软件—CamScanner 扫描全能王
  11. 2021-2025年中国电子束加速器行业市场供需与战略研究报告
  12. ArcGIS Maritime Server 开发教程(二)ArcGIS 海图软件系列
  13. linux抓包工具:tcpdump 工具用法
  14. 使用mongoose-paginate-v2查询缓慢问题
  15. 漫画:什么是堆排序?
  16. iOS Unable to install “XXX“(编译成功,但跑到真机上弹出这个提示框)
  17. 关于 Linux 中 signal 函数信号处理的讨论
  18. service常驻后台
  19. matlab伽玛分布如何表示,matlab绘制gamma曲线
  20. android 外接USB扫码器应用闪退解决方法

热门文章

  1. python复杂代码示例_6 个例子教你重构 Python 代码
  2. 自定义模块的查找方式
  3. for (var key in Obj)遍历JS对象/数组
  4. CSS三大特性的利用注意事项
  5. 面试开发可以用python_Python开发工程师面试题(五)
  6. html文件实践总结,html,css学习实践总结
  7. python中注释的作用_Python函数添加注释的好处
  8. 从零学ELK系列(十一):SpringBoot项目接入ELK超级版(超详细图文教程)
  9. 上车,在北京地铁10号线偶遇一下
  10. 清华大学发布10大机器翻译学习必读论文清单 | 资源