linux内核数据包转发流程(二):中断
【版权声明:转载请保留出处:blog.csdn.net/gentleliu。邮箱:shallnew*163.com】
内核在处理2层数据包之前,必须先处理中断系统。设立中断系统,才有可能每秒处理成千的帧。
当收到一个帧时,驱动程序会代表内核指示设备产生一个硬件中断,内核将中断其它的活动,然后调用一个驱动程序所注冊的处理函数,以满足设备的须要。当事件是接收到一个帧时,处理函数就会把该帧排入队列某处,然后通知内核。
使用轮询技术会轻易浪费掉非常多系统资源,由于内核会持续去读取检查是否有有帧的到来。
但使用中断会在每接收到一帧时都强制产生中断。会让cpu处理中断浪费很多时间。在高流量负载下。中断代码会持续抢占正在处理的代码。到某一时刻,输入队列会满,导致旧的帧没办法处理,新的帧又无法排入队列。出现receive-livelock。
中断长处就是帧的接受及其处理之间延时非常短。缺点就是在高负载下无法良好执行。
当cpu接收一个中断通知信息时,会调用与该中断事件关联的处理函数,这样的关联性有编号表示。在该处理函数运行期间,内核处于中断上下文(interrupt context)中,服务于该中断事件的cpu会被关闭中断功能,即此时不能服务其他中断事件。也不能运行其他进程,cpu全然属于该中断处理函数,不能被抢占。简而言之,中断处理函数是非抢占的,且非可再进入的(reentrant)。这能够减少竞争情况的可能性,可是这对性能有潜在的严重影响。
因此,中断处理函数所做工作应该尽快完毕。 中断事件能够先对cpu抢占。这是由于假设操作系统让硬件等太久。可能会遗失数据,还有一方面。假设内核或用户空间进程必须被延迟或被抢占。则没有数据会遗失。所以,如今中断处理函数分为上半部和下半部。一般(1)任务对时间敏感或(2)和任务相关或(3)须要保证不被其它中断打断放在上半部运行。能够推迟不太紧急的任务放在下半部运行。
下半部分为主要分为软中断,tasklet。工作队列。
下半部的基础架构为:1、把下半部分类成适当类型。2、注冊下半部类型及其处理函数间的关联关系。3、为下半部函数调度。以准备运行。4、通知内核有已调度的BH存在。
内核(linux-2.6.32)下半部类型有:(定义在include/linux/interrupt.h)
enum
{
HI_SOFTIRQ=0,
TIMER_SOFTIRQ,
NET_TX_SOFTIRQ,
NET_RX_SOFTIRQ,
BLOCK_SOFTIRQ,
BLOCK_IOPOLL_SOFTIRQ,
TASKLET_SOFTIRQ,
SCHED_SOFTIRQ,
HRTIMER_SOFTIRQ,
RCU_SOFTIRQ, /* Preferable RCU should always be the last softirq */ NR_SOFTIRQS
};
软IRQ通常会在相关联的子系统内注冊。
内核初始化期间,softirq_init会注冊TASKLET_SOFTIRQ以及HI_SOFTIRQ相关联的处理函数。
void __init softirq_init(void)
{
...... open_softirq(TASKLET_SOFTIRQ, tasklet_action);
open_softirq(HI_SOFTIRQ, tasklet_hi_action);
}
网络子系统分两种soft IRQ。NET_TX_SOFTIRQ和NET_RX_SOFTIRQ。分别处理发送数据包和接收数据包。这两个soft IRQ在net_dev_init函数(net/core/dev.c)中注冊:
open_softirq(NET_TX_SOFTIRQ, net_tx_action);
open_softirq(NET_RX_SOFTIRQ, net_rx_action);
收发数据包的软中断处理函数被注冊为net_rx_action和net_tx_action。
当中open_softirq实现为:
void open_softirq(int nr, void (*action)(struct softirq_action *))
{
softirq_vec[nr].action = action;
}
linux内核数据包转发流程(二):中断的更多相关文章
- linux内核数据包转发流程(三)网卡帧接收分析
[版权声明:转载请保留出处:blog.csdn.net/gentleliu.邮箱:shallnew*163.com] 每一个cpu都有队列来处理接收到的帧,都有其数据结构来处理入口和出口流量,因此,不 ...
- linux内核数据包转发流程(一):网络设备驱动
[版权声明:转载请保留出处:blog.csdn.net/gentleliu.邮箱:shallnew*163.com] 网卡驱动为每一个新的接口在一个全局的网络设备列表里插入一个数据结构.每一个接口由一 ...
- Linux内核数据包的发送传输
本文主要讲解了Linux内核数据包的传输流程,使用的内核的版本是2.6.32.27 为了方便理解,本文采用整体流程图加伪代码的方式从内核高层面上梳理了二层数据包发送传输的流程,希望可以对大家有所帮助. ...
- [Docker]Docker与Linux ip_forward数据包转发
背景 今天在一台新虚拟机上需要临时启动一个consul服务,安装Docker后使用docker启动,但是在执行启动命令后发现docker有一个警告: WARNING: IPv4 forwarding ...
- Linux内核二层数据包接收流程
本文主要讲解了Linux内核二层数据包接收流程,使用的内核的版本是2.6.32.27 为了方便理解,本文采用整体流程图加伪代码的方式从内核高层面上梳理了二层数据包接收的流程,希望可以对大家有所帮助.阅 ...
- LINUX下的远端主机登入 校园网络注册 网络数据包转发和捕获
第一部分:LINUX 下的远端主机登入和校园网注册 校园网内目的主机远程管理登入程序 本程序为校园网内远程登入,管理功能,该程序分服务器端和客户端两部分:服务器端为remote_server_udp. ...
- Linux内核网络数据包处理流程
Linux内核网络数据包处理流程 from kernel-4.9: 0. Linux内核网络数据包处理流程 - 网络硬件 网卡工作在物理层和数据链路层,主要由PHY/MAC芯片.Tx/Rx FIFO. ...
- linux 内核网络数据包接收流程
转:https://segmentfault.com/a/1190000008836467 本文将介绍在Linux系统中,数据包是如何一步一步从网卡传到进程手中的. 如果英文没有问题,强烈建议阅读后面 ...
- Linux内核网络报文简单流程
转:http://blog.csdn.net/adamska0104/article/details/45397177 Linux内核网络报文简单流程2014-08-12 10:05:09 分类: L ...
随机推荐
- USB协通讯议--深入理解【转】
转自:http://blog.csdn.net/myarrow/article/details/8484113 0. 基本概念 一个[传输](控制.批量.中断.等时):由多个[事务]组成: 一个[事务 ...
- 数据库优化之mysql【转】
1. 优化流程图 mysql优化(主要增加数据库的select查询,让查询速度更快) 2. 优化mysql的方面 主要从以下四个方面去优化mysql ①存储层:如何选择一个数据库引擎,选择合适的字段列 ...
- spring mvc file upload
文件上传 1.需要导入两个jar包 2.在SpringMVC配置文件中加入 1 2 3 4 <!-- upload settings --> <bean id="multi ...
- 错误的理解引起的bug async await 执行顺序
今天有幸好碰到一个bug,让我知道了之前我对await async 的理解有点偏差. 错误的理解 之前我一直以为 await 后面的表达式,如果是直接返回一个具体的值就不会等待,而是继续执行asyn ...
- hadoop-2.7.2-HA安装笔记
配置方案如图 NN DN ZK ZKFC JN RM NM(任务管理器) HMaster Region Server Node1 1 1 1 1 1 Node2 1 1 1 1 1 1 1 Nod ...
- java 多重继承
接口不仅仅只是一种更纯粹形式的抽象类,它的目标比这更高,因为接口是根本没有任何具体实现的--也就是说,没有任何与接口相关的存储,因此也就无法阻止多个接口的组合, 在导出类中,不强制要求必须有一个抽象的 ...
- 《流畅的python》这本确实老辣
最近在慢慢看几页, 第一章的示例代码,实现一副扑克牌. 确实老辣~ 不是高手,没有这感觉,我慢慢学吧. import collections from random import choice Car ...
- 开始使用KVM和QEMU
一. 简介 Quick Emulator(QEMU) 是QEMU/KVM虚拟化套件中的主要组成部分. 它提供了硬件的虚拟化和处理器的仿真. QEMU不用运行在内核,它是运行在用户空间的. QEMU支持 ...
- oracle 中 dblink 的简单使用
oracle 中 dblink 的简单使用 dblink的作用 当用户要跨本地数据库,访问另外一个数据库表中的数据时,本地数据库中必须创建了远程数据库的dblink,通过dblink本地数据库可以像访 ...
- Java 中的 protected 访问修饰符你真的了解吗?
protected Java 中的 protected 访问修饰符 总结 在同一个包中,类中 protected 或 default 修饰的属性或方法可以在类外被其对象 (实例) 外部访问,也可以被子 ...