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

Linux 内核中软中断机制

   软中断实现的原理图:

                        

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

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

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

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


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


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

             

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

在Linux系统中最多可以同时注册32个软中断,目前系统使用了6个软中断,它们是 定时器处理、SCSI处理、网络收发处理以及tasklet机制。其中这里的tasklet机制就是用来实现下半部分的。

描述软中断的核心数据结构为中断向量表:

struct softirq_action{

           void (*action)(struct softirq_action *);   //中断服务程序

           void *data;                        //服务程序输入参数

}

         软中断守护程序是软中断机制的核心。通过查询软中断的状态来判断是否发生事件,如果发生就会映射到相应的软中断向量表,调用执行注册的action()。在Linux中 软中断daemon线程函数为do_softirg()。

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

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

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

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


Linux软中断的处理框架也采用上半部和下半部的处理方式。

软中断的上半部分处理紧急的,需要立即处理的,关键性的处理动作,例如网络驱动的接收动作,当有中断到达的时候,先查询网络的中断寄存器,判断为何种方式的中断,清空中断中断寄存器后,复制数据,然后设置软中断状态的状态,触发软中断。

软中断的下半部分进行数据处理,而下半部则相对涞水并不是非常紧急的,通常还是比较耗时的,因此由系统自行安排运行机制,不在中断服务上下文中执行。



相关文章:

  • DAS、NAS、SAN...
  • Linux bridge 网桥模块内部数据包转发流程
  • C++ 标准库中的allocator是多余的
  • 数据结构与算法[LeetCode]—Linked List Cycle 确定单链表是否有环,并找出第一个环结点
  • 啊,目标!
  • 数据结构与算法[LeetCode]—数组中出现次数异与其他数的一个数
  • Linux 的DNS 的配置...
  • 我与网管师职业认证的钦定缘分
  • linux下显示网卡设备及驱动信息intel shell脚本
  • 数据结构与算法[LeetCode]—两个有序数组合并及找中点问题
  • 无法在web服务器上启动调试, Server Application Error......错误解决方法
  • 数据结构与算法[LeetCode]——sqrt(x)
  • RedHat 9 Linux SendMail 的配置
  • KMP算法深度解析
  • VS2005中Nebula3数据类型的调试信息显示
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • co.js - 让异步代码同步化
  • k个最大的数及变种小结
  • MYSQL 的 IF 函数
  • mysql常用命令汇总
  • php ci框架整合银盛支付
  • python_bomb----数据类型总结
  • TCP拥塞控制
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 解析带emoji和链接的聊天系统消息
  • 开源地图数据可视化库——mapnik
  • 前端自动化解决方案
  • 驱动程序原理
  • 深入浅出Node.js
  • ​io --- 处理流的核心工具​
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (06)金属布线——为半导体注入生命的连接
  • (145)光线追踪距离场柔和阴影
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (c语言)strcpy函数用法
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (二)正点原子I.MX6ULL u-boot移植
  • (附源码)ssm码农论坛 毕业设计 231126
  • (理论篇)httpmoudle和httphandler一览
  • (南京观海微电子)——I3C协议介绍
  • (十)c52学习之旅-定时器实验
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • .mysql secret在哪_MYSQL基本操作(上)
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布
  • .NET 使用 XPath 来读写 XML 文件
  • .net 托管代码与非托管代码
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • .pyc文件是什么?
  • @RequestParam详解
  • [20150321]索引空块的问题.txt
  • [2021 蓝帽杯] One Pointer PHP
  • [ACTF2020 新生赛]Upload 1
  • [AIGC] MySQL存储引擎详解