虽然和网络相关,但是它却不是网络协议栈的一部分,这就是netpoll。
它只是一个出入口的处理框架。所谓的网络,它的终端节点就是主机,数据从主机的网卡发出,经过一个出口处理过程,网卡接收到一个数据包,经过一个入口处理过程,这一出一入的过程处理分为两种方式:
1.中断的方式
出口处理过程-数据排入发送队列,读取特定寄存器值,待网卡状态适合发送式,发送,等待发送后的中断通知,继续。
入口处理过程-数据被网卡收到,网卡中断CPU,CPU进而处理数据接收的过程。
网络协议栈下接的就是这种中断的出入口处理方式。
2.poll的方式
出口处理过程-数据排入发送队列,读取特定寄存器值,待网卡状态适合发送式,发送,不等待发送后的中断通知,继续读取寄存器以及根据队列情况权衡是否适合发送。
入口处理过程-数据被网卡收到,等待poll逻辑在适当的时候去主动poll网卡,若有数据,则将其从特定的网卡缓存读出。
Linux netpoll就是利用的这种方式。这种方式完全不依赖中断。
事实总是比说起来更麻烦。
要讲清楚这个有点混乱的主题,不得不引入第三种出入口处理方式,那就是中断和poll结合的方式,这就是NAPI方式。我把三种方式的图示先给出:
a.中断方式

b.poll方式

c.NAPI方式

理解了这个,剩下的就都理解了。至于为何会有NAPI,在本文中只能简单说一句:在高速高带宽网络中,数据包持续到来,每一个包中断一次CPU的话,CPU有点吃不消,反而耽误了CPU处理这些数据包,如果之前的数据包还没有处理完,最好的办法就是将数据包排入一个队列,然后沉默,不要打扰CPU,等CPU空下来的时候,自己去poll这些队列里面的数据包,这就是NAPI。
       纯中断的方式我们都很熟悉,也是最直接的方式。然而为何要有纯poll的方式呢?使用纯poll的场合在中断完全不起作用的情况下。举一个例子,系统panic之后。此时中断控制器将可能被disable掉,无论如何,此时的机器已经和外界失联了,然而如果此时必须需要一个方式对外界通告自己的死因的话,这种netpoll的方式就派上用场了,因为它是纯手工的,完全不依赖系统的中断机制。另外一种场合比panic好一些,那就是协议栈故障,如果使用中断或者NAPI的方式,由于它上接的就是协议栈,netif_receive_skb中又没有什么HOOK点,此时使用netpoll可以改变数据包的处理路径,通过一个agent可以实现远程debug。
       不要把中断想象的太神秘。它无非也就是一个通知机制,告诉CPU,现在请查询我的状态,该干啥就干啥。事实上,当CPU收到网卡中断的时候,它也不知道该干啥,它只会调用中断处理函数,其内部会去读取一写寄存器的状态,然后才能知道现在该干什么,比如可以发送数据包,比如收到一个数据包等。既然如此,即使在关中断的情形下,如果不依靠中断,CPU择机主动调用一下网卡的中断处理函数,读取一写寄存器的状态,是不是也能知道该干什么呢?答案当然是肯定的了!这就是netpoll的逻辑,它使用两步完成任务:
1.主动调用网卡的中断处理函数,获取当前该发送数据包还是接收到一个数据包;
2.直接hard_xmit数据包或者使用NAPI的接口去poll网卡的数据。
Linux netpoll的总体图示如下:

这个图示中附带了netconsole的原理,没想到他是如此的简单。我记得我曾经写过一个模块,将panic后的信息发到远端,这个是受到了一个xtables-addons模块的启发,起初失败了,但是最后我仔细debug了内核代码后,成功了。在成功的过程中,发现了很多以前不知道的东西。但是现在看看netconsole吧,它什么复杂的东西都不需要,只需要两步:
1.注册一个console,此后内核buffer的信息就会发到这个console;
2.该console下接netpoll的netpoll_send_skb,此后由netpoll逻辑来处理。
即便在panic后,中断已经被关了,甚至中断控制器都关闭的情况下,只要网卡没有进水,数据依然可以收发,它完全不依赖中断和协议栈。这简直太棒了!关于netconsole,我写多少都不如内核的Document来的好:$kernel/Documentation/networking/netconsole.txt.
       netpoll是Linux内核中的一种在协议栈不可用或者中断机制异常的情况下与外界通讯的手段,当然它也是一种绕开协议栈的方法。这个位置足够底层,写出来的东西也肯定比基于Netfilter的更好玩。Netfilter是在协议栈的特殊点捕获数据包的,而netpoll却可以在网卡之上直接捕获数据包,它们甚至连协议栈的最底端都到不了。以后,如果想在内核态直接发包,再也不用PACKET套接字从用户态开始了,构造一个数据包,直接通过netpoll接口发出。问题是,它采用手工触发中断处理函数的方式,效率如何待测试。因此这种机制最好还是限制于调试和少量内核审计信息的发送吧。用它做VPN,我觉得悬...

Linux内核的netpoll框架与netconsole相关推荐

  1. Linux内核之misc框架

    Linux内核为每种设备都抽象出了框架,开发人员只需往框架中填充信息即可进行设备的注册.下面来讲解一下Linux内核的misc框架. misc又叫杂散类设备,在早期的内核中,向ADC.WATCHDOG ...

  2. Linux内核的misc框架

    Linux内核为每种设备都抽象出了框架,开发人员只需往框架中填充信息即可进行设备的注册.下面来讲解一下Linux内核的misc框架. misc又叫杂散类设备,在早期的内核中,向ADC.WATCHDOG ...

  3. Linux内核 LCD 驱动程序框架

    Linux 内核 LCD 驱动程序框架 1. framebuffer 简介 1.1 什么是 framebuffer 1.2 framebuffer的作用 2. framebuffer 驱动的框架 3. ...

  4. 树莓派Linux内核编译、文件系统、Linux内核驱动基础框架、驱动测试步骤、总线地址

    树莓派高阶开发课程 1. ubuntu18.04版本安装          让程序猿搭建环境太搞笑了,轻松easy! ========================================= ...

  5. 走进Linux内核之Netfilter框架

    走进Linux内核之Netfilter框架 - 掘金笔者此前对Linux内核相关模块稍有研究,实现内核级通信加密.视频流加密等.话不多说直接上才艺,现在带你走进Linux内核之Netfilter框架. ...

  6. Linux内核进阶----整体框架及子系统概览

    目录 1.概述 2.核心抽象及设计选型 2.1. 对进程和内核的抽象 2.2. 对进程地址空间的抽象 2.3. 支持可重入可抢占的内核 2.4. 放松管控与努力回收 2.5. 单块结构内核+动态加载模 ...

  7. linux内核网络驱动框架(linux驱动开发篇)

    网络驱动的核心: 1.就是初始化 net_device 结构体中的各个成员变量, 2.然后将初始化完成以后的 net_device 注册到 Linux 内核中 1.网络设备(用net_device结构 ...

  8. linux内核usb驱动框架,基于S3C2440平台的linux2.6.22内核版本的USB驱动框架分析

    基于S3C2440平台的linux2.6.22内核版本的USB驱动框架分析 发布时间:2014-07-18 16:47:31来源:红联作者:linux08071151 driver/usb/host/ ...

  9. i.MX6ULL驱动开发 | 31 - Linux内核网络设备驱动框架

    一.Linux网络设备驱动整体架构 网络设备是完成用户数据包在网络媒介上发送和接收的设备,它将上层协议传递下来的数据包,以特定的媒介访问控制方式进行发送,并将接收到的数据包传递给上层协议. Linux ...

  10. 树莓派开发6-配置树莓派的Linux内核

    文章目录 配置树莓派的Linux内核 树莓派Linux内核编译 文件系统 Linux内核驱动基础框架 驱动测试步骤 树莓派学习笔记,本文图片文字皆为转述 配置树莓派的Linux内核 驱动两种加载方式: ...

最新文章

  1. Codeforces Round #253 (Div. 1) A. Borya and Hanabi 暴力
  2. vue-router基本使用
  3. 【剑指Offer面试题】 九度OJ1510:替换空格
  4. 成功解决ModuleNotFoundError: No module named 'dataset'
  5. AI领域最最最稀缺的人才——AI架构师
  6. Config配置文件的加解密
  7. CNN的卷积运算为何使用互相关而不是卷积
  8. workerman php访问,workerman 配置域名访问 (本地)
  9. python文件合法模式组合_以下选项中,不是Python文件二进制打开模式的合法组合是...
  10. 前端面试常考的手写代码不是背出来的!
  11. 导致溢出_邯郸一司机,溢出的“5毫克”导致A2被降级,老司机自吞“苦酒”
  12. c# WebApi之解决跨域问题:Cors
  13. FleaPHP 开发基础 - 第一部分
  14. office 兼容包下载地址
  15. typescript 中文手册
  16. 使用FlashPaper在线转换.doc为.swf
  17. 北京中医药大学计算机应用基础作业,北京中医药大学计算机应用基础第五次.doc...
  18. 水生火热的互联网金融
  19. ps教程:用PS和FLASH8做眨眼教材
  20. rclone 访问web界面

热门文章

  1. CSS3 Gradient 渐变
  2. 每秒处理10万高并发订单的乐视集团支付系统架构分享
  3. MATLAB plot画线的颜色设定
  4. PostgreSQL 全文检索 - 词频统计
  5. js || 和 的高级运用
  6. Lucene查询结果高亮
  7. [翻译] Canvas 不用写代码的动画
  8. Producer-Consumer question : OO 生产者-消费者:面向对象
  9. Cannot detect Web Project version. Please specify version of Web Project through Maven project ...报错
  10. IT兄弟连 JavaWeb教程 Servlet 状态管理 会话跟踪