16.2.1 Linux内核网络协议层的层间传递手段——软中断

学习提速专享!AI工具全家桶免费用 限时购周边加赠Coding Plan Lite,解锁20+主流AI工具,写代码、查资料快人一步! 阅读详情

16.2.1  Linux内核网络协议层的层间传递手段——软中断

网络协议栈是分层实现的,如何实现高效的网络数据是协议栈设计的核心问题之一。

1Linux内核中软中断的机制

Linux内核中是采用软中断的方式实现的,软中断机制的实现原理如图16.9所示。

 

16.9  软中断架构示意图

软中断机制的构成核心元素包括软中断状态、软中断向量表和软中断守护内核线程。

q      软中断状态:即是否有触发的软中断未处理。

q      软中断向量表:包含两个成员变量,一个是处理此软中断的回调函数,另一个是处理时所需的参数。

q      软中断守护内核线程:内核建立一个内核线程ksoftirqd来轮询软中断状态,调用软中断向量表中的软中断回调函数处理中断。

Linux内核中的软中断的工作框架模拟了实际的硬中断处理过程。当某一软中断事件发生后,首先调用raise_softirq()函数设置对应的中断标记位,触发中断事务。然后会检测中断状态寄存器的状态,如果ksoftirqd通过查询发现某一软中断事务发生之后,那么通过软中断向量表调用软中断服务程序action

软中断的过程与硬中断是十分类似的,二者的唯一不同之处是从中断向量到中断服务程序的映射过程。在CPU的硬件中断发生之后,CPU的具体的服务程序通过中断向量值进行映射,这个过程是硬件自动完成的。但是软中断的中断映射不是自动完成的,需要中断服务守护线程去实现这一过程,这也就是软件模拟的中断。

2Linux内核中软中断的使用方法

Linux系统中最多可以同时注册32个软中断,目前系统使用了6个软中断,它们是定时器处理、SCSI处理、网络收发处理以及tasklet机制,这里的tasklet机制就是用来实现下半部的,描述软中断的核心数据结构为中断向量表,其定义如下:

 

struct softirq_action

{

    void (*action)(struct softirq_action *);

    void *data; 

};

 

q      action为软中断服务程序。

q      data为服务程序输入参数。

软中断守护程序是软中断机制实现的核心,它的实现过程比较简单。通过查询软中断的状态来判断是否发生事件,当发生事件就会映射软中断向量表,调用执行注册的action()函数就可以了。从这一点分析可以看出,软中断的服务程序是daemon。在Linux中软中断daemon线程函数为do_softirq()

触发软中断事务通过raise_softirq()来实现,该函数就是在中断关闭的情况下设置软中断状态位,然后判断如果不再中断上下文,那么直接唤醒守护daemon

常用的软中断函数列表如下:

q      open_softirq():它注册一个软中断,将软中断的服务程序注册到系统的软中断向        量表。

q      raise_softirq():设置软中断状态映射表,触发软中断事务响应。

Linux软中断的处理框架也采用了上半部和下半部的处理方式。软中断的上半部处理紧急的、需要立即处理的、关键性的处理动作,例如网卡驱动的接收动作,当有中断到达的时候,先查询网卡的中断寄存器,判断为何种方式的中断,清空中断寄存器后,复制数据,然后设置软中断的状态,触发软中断。软中断的下半部进行数据处理,而下半部则相对来说并不是非常紧急的,通常还是比较耗时的,因此由系统自行安排运行时机,不在中断服务上下文中执行。

11.4.1 SOCK_PACKET类型 11.4.1  SOCK_PACKET类型建立套接字的时候选择SOCK_PACKET类型,内核将不对网络数据进行处理而直接交给用户,数据直接从网卡的协议栈交给用户。建立一个SOCK_PACKET类型的套接字使用如下方式: socket (AF_INET, SOCK_PACKET,htons(0x0003)); 其中AF_INET=2表示因特网协议族,SOCK_PACKET=10 阅读详情

相关推荐

11.4.8 使用SOCK_PACKET编写ARP请求程序的例子

11.4.8  使用SOCK_PACKET编写ARP请求程序的例子本节利用SOCK_PACKET套接字进行ARP请求的程序设计,并给出代码的例子。1.ARP协议数据和结构包含以太网头部数据的ARP协议数据结构如图11.16所示。图11.16  ARP协议的数据示意图ARP的数据结构在头文件中定义,代码如下: struct arphdr{    __be1

Linux/UNIX典藏大系 1639

linux协议栈之链路上的数据传输-----从网卡驱动说起(一)

出处:http://ericxiao.cublog.cn/------------------------------------------二:从网卡驱动说起。         以intel 100M 网卡驱动为例简要概述数据包的接收与发送流程。代码见(drivers/net/e100.c)网卡是属于PCI设备,它的注册跟一般的PCI设备注册没什么两样。static in

Roy的专栏 1075

linux数据链路抓数据乱序,数据链路需要解决的问题.ppt

数据链路需要解决的问题数据链路需要解决的问题数据链路需要解决的问题 1)为网络提供的服务 2)成帧 3)差错控制 4)流量控制 数据链路需要解决的问题 1)为网络提供的服务 2)成帧 3)差错控制 4)流量控制 将源端网络的数据传输给宿端网络 物理 数据链路 网络 传输 应用 比特流 物理 数据链路 网络 保证数据流的顺序 传输 应用 源 宿 为网络提供服务...

weixin_31847389的博客 189

linux管理传输通道,linux内核-网络数据包传送通道解析.doc

linux内核-网络数据包传送通道解析网络栈自下而上的数据包传输通道具体如下:(1):硬件监听物理传输介质,进行数据的接收,当完全接收一个数据包后,产生中断(这个过程完全由网络设备硬件负责)。(2):中断产生后,系统调用驱动程序注册的中断处理程序进行数据接收,一般在接收例程中,完成数据从硬件缓冲区到内核缓冲区的复制,将其封装为内核特定结构(sk_buff结构),最后调用链路提供的借口函数neti...

weixin_36371924的博客 244

Linux:带你理解数据链路

数据链路链路认识MAC地址认识以太网以太网帧协议格式ARP协议ARP协议的作用ARP协议的工作流程ARP数据报的格式认识MTUMTU对于传输协议的影响其他典型协议及技术:DNSicmpNAT / NAPT代理服务典型面试题 链路 负责相邻设备之的数据传输 相邻设备:连接起来的两个设备就是相邻设备。 认识MAC地址 一个路由器有可能连接了很多设备,也就是说一个设备有很多的相邻设备,那么问题来了,如何识别指定的相邻设备? 相邻设备的识别通过物理网卡的硬件地址进行识别 物理地址 - MAC地址(uin

AngelDg的博客 915

linux阻断设备接收,阻断P2P通信

阻断P2P通信可以使用专业厂家生产的P2P硬件控制设备,来阻断P2P通信或者控制每个用户P2P的流量,但昂贵的设备价格可能是无法接受的。下面介绍两种廉价的解决方案。利用Cisco路由器的NBAR功能NBAR(Network-Based Application Recognition)网络应用识别是一种动态的、能在四到七识别应用的技术,配合PDLM(Packet Description Langu...

weixin_30070339的博客 356

多队列网卡

主要介绍多队列网卡

qq_29750559的博客 1984

AI架构图自动验收:用CI流水线让模型生成可靠系统图

架构图是系统设计的重要交付物,但随着AI生成工具的普及,如何保证其准确性成为工程实践中的新挑战。传统持续集成(CI)通过自动化检查保障代码质量,这一思想同样适用于架构图验证:将AI生成的图转换为结构化描述后,通过规则引擎检查节点依赖、分归属、循环引用等问题,并将反馈返回模型迭代修正,最终实现“生成—校验—修复”的闭环。这种流程不仅能拦截模型幻觉带来的错误,还能让微服务、网关等关键组件不缺失,为架构评审提供客观依据。本文以archify为例,解析AI架构图自动化检查的设计思路与实现细节。

weixin_33985507的博客 478

【转】linux socket()调用与arp报文发送

 Linux提供最常用的网络通信应用程序开发接口--Berkerley套接字(Socket).它既适用于同一主机上进程通信(IPC),又适用于不同主机上的进程通信。套接字的设置通过socket调用完成:int socket(int family,int type,int protocol);其中family指通信域或协议族,Linux系统支持的网络协议族有PF_UNIX,PF_IPX,PF_P

cffy625的专栏 1811

Linux网络——链路协议

目录以太网协议协议格式 以太网协议 协议格式 图片 48 位源端 / 对端 Mac 地址:

波风水门的博客 498

linux 内核与应用的接口

linux 内核与应用的接口1,可以采用ioctrl接口2,在内核用testr_kobj=kobject_create_and_add("test", NULL);在sys目录创建testr目录, 用sysfs_create_group(testr_kobj, &attr_group);在/sys/test目录创建file1,file2,file3文件组   应用通过打开文件"/sys

zhenwenxian的专栏 2057

18.3.6 SHTTPD响应方法的实现

18.3.6  SHTTPD响应方法的实现服务器SHTTPD可以识别的方法为GET、PUT、POST、DELETE和HEAD等,但仅实现了GET方法。在请求方法分析中已经可以获得客户端请求的方法,在响应中,只要匹配其方法就可以了。(1)方法的总函数为Method_Do(),实现如下: void Method_Do(struct worker_ctl *wctl){    D

Linux/UNIX典藏大系 2107

18.3.7 SHTTPD支持CGI的实现

18.3.7  SHTTPD支持CGI的实现CGI支持的实现主要包含CGI命令获取、CGI参数获取、管道进程连接、主进程从CGI进程读取数据和发送数据、CGI进程执行并发送结果给主进程。(1)实现CGI的过程,先初始化变量,这已经是比较通用的方法。 #define CGISTR "/cgi-bin/"              /*CGI目录的字符串*/#define ARG

Linux/UNIX典藏大系 1950

18.4 SHTTPD的编译、调试和测试

18.4  SHTTPD的编译、调试和测试本节在之前代码的基础上建立源代码文件、建立Makefile、对文件进行编译,然后对SHTTPD服务器进行测试。

Linux/UNIX典藏大系 1737

11.1.5 socketpair()函数

11.1.5  socketpair()函数socketpair()函数建立一对匿名的已经连接的套接字,其特性由协议族d、类型type、协议protocol决定,建立的两个套接字描述符会放在sv[0]和sv[1]中。socketpair()函数的原型如下,第1个参数d,表示协议族,只能为AF_LOCAL或者AF_UNIX;第2个参数type,表示类型,只能为0。第3个参数protocol,

Linux/UNIX典藏大系 1677

11.1.4 传递文件描述符

11.1.传递文件描述符在进程之经常遇到需要在各进程之传递文件描述符的情况,例如有一种设备它在加电期只能打开一次,如果关闭后再次打开就会发生错误。这时就需要有一个调度程序,它调度多个相同设备,当有客户端需要此类型的设备时会向它发送一个请求,服务器会把某个设备的描述符给客户端。但是,由于不同进程之的文件描述符所表示的对象是不同的,这需要一种特殊的机制来实现上述的要求。Linux

Linux/UNIX典藏大系 1598

18.2 SHTTPD的模块分析和设计

18.2  SHTTPD的模块分析和设计要实现SHTTPD服务器,需要对服务器的架构和模块进行仔细地分析,例如客户、服务器模式的选型,CGI的实现方法、命令行脚本的解析等。本节对18.1节中的需求进行仔细的分析,提供一种解决的方法。

Linux/UNIX典藏大系 1398

18.3.12 SHTTPD主函数的实现

18.3.12  SHTTPD主函数的实现服务器SHTTPD的主函数代码如下,主要功能为挂接SIGINT信号、初始化参数配置、服务器套接字初始操作,然后执行工作调度任务。 int main(int argc, char *argv[]){    signal(SIGINT, sig_int);        /*挂接信号SIGINT*/    Para_Init(argc,

Linux/UNIX典藏大系 1365
上一篇: 16.1.5 网络协议数据结构inet_protosw
下一篇: 16.2.2 网络收发处理软中断的实现机制
Linuxdianc
博客等级 码龄17年 57粉丝 496原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值