点击打开链接

一,linux软中断的概念
软中断(softirq)常常表示可延迟函数的所有种类,目前linux上使用的软中断个数是有限的,linux最多注册32个,目前使用了10个,在interrupt.h中定义,中断上下文:表示内核当前正在执行一个中断处理程序或者一个可延迟函数。软中断(即使同一类型的软中断)可以并发运行在多个CPU上,因此软中断是可重入函数必须使用自旋锁保护其数据结构。一个软中断不会去抢占另外一个软中断。

软中断和tasklet的区别
由于软中断必须使用可重入函数,这就导致设计上的复杂度变高,作为设备驱动程序的开发者来说,增加了负担。而如果某种应用并不需要在多个CPU上并行执行,那么软中断其实是没有必要的。因此诞生了弥补以上两个要求的tasklet。它具有以下特性:
a)一种特定类型的tasklet只能运行在一个CPU上,不能并行,只能串行执行。
b)多个不同类型的tasklet可以并行在多个CPU上。
c)软中断是静态分配的,在内核编译好之后,就不能改变。但tasklet就灵活许多,可以在运行时改变(比如添加模块时)。

软中断的实现:
软中断由softirq_action结构体表示

[cpp] view plaincopy
  1. struct softirq_action{
  2. void (*action)(struct sotfirq_action*)
  3. kernel/softirq.c中定义了一个包含有32个该结构体的数组
  4. static struct softirq_action softirq_vec[NR_SOFTIRQS]

1,注册软中断函数 open_softirq

[cpp] view plaincopy
  1. void open_softirq(int nr, void (*action)(struct softirq_action *))
  2. {
  3. /* softirq_vec是个struct softirq_action类型的数组 */
  4. softirq_vec[nr].action = action;
  5. }

2,触发软中断的函数 raise_softirq 参见 kernel/softirq.c文件

[cpp] view plaincopy
  1. void raise_softirq(unsigned int nr)
  2. {
  3. unsigned long flags;
  4. local_irq_save(flags);
  5. raise_softirq_irqoff(nr);
  6. local_irq_restore(flags);
  7. }

3,执行软中断 do_softirq 参见 kernel/softirq.c文件,如果有待处理的软中断,do_softirq()会循环遍历每一个,调用它们的处理程序。

[cpp] view plaincopy
  1. asmlinkage void do_softirq(void)
  2. {
  3. __u32 pending;
  4. unsigned long flags;
  5. /* 判断是否在中断处理中,如果正在中断处理,就直接返回 */
  6. if (in_interrupt())
  7. return;
  8. /* 保存当前寄存器的值 */
  9. local_irq_save(flags);
  10. /* 取得当前已注册软中断的位图 */
  11. pending = local_softirq_pending();
  12. /* 循环处理所有已注册的软中断 */
  13. if (pending)
  14. __do_softirq();
  15. /* 恢复寄存器的值到中断处理前 */
  16. local_irq_restore(flags);
  17. }

4,执行相应的软中断 - 执行自己写的中断处理linux中,执行软中断有专门的内核线程,每个处理器对应一个线程,名称ksoftirqd/n

转载于:https://www.cnblogs.com/zhiliao112/p/4232157.html

[linux内核][linux中断]——软中断机制相关推荐

  1. Linux内核实现中断和中断处理(二)

    第一部分移步传送门召唤!!:http://www.cnblogs.com/lenomirei/p/5562086.html 上回说了Linux内核实现中断会把中断分为两部分进行处理,上回讲了上部分,这 ...

  2. 再思linux内核在中断路径内不能睡眠/调度的原因(2010)【转】

    转自:http://blog.csdn.net/maray/article/details/5770889 Linux内核中断路径中不能睡眠,为什么? 这里就行了很深入的讨论,值得一看:http:// ...

  3. 第三十四期-ARM Linux内核的中断(4)

    作者:罗宇哲,中国科学院软件研究所智能软件研究中心 上一期中我们介绍了ARM Linux内核中外设中断处理的部分流程,这一期我们将继续介绍ARM Linux内核的外设中断处理流程中与中断描述符相关的部 ...

  4. linux内核的中断上下文,Linux操作系统中中断上下文中的互斥

    UP(单CPU系统)上的中断处理 互斥 如果一个中断处理程序的代码访问或者更新了由非中断的代码(通常称为基准代码)使用的同一数据结构,那么就会出现竞争条件. 幸运的是,得到允许的以内核态执行的进程会临 ...

  5. linux内核 sin头文件,Linux内核中中断request_irq详解--中断共享问题解决

    .函数原型如下: 2.4 内核 int request_irq (unsignedintirq,void (*handler)(int,void*,structpt_regs*),unsignedlo ...

  6. [linux内核][LINUX内核编程]学习笔记(一)

    linux内核使用bitmap相关  1,声明一个bitmap数组,可以表示100个bit,数组名字是bitmap [cpp] view plaincopy DECLARE_BITMAP(bitmap ...

  7. linux 内核 linux kernel travel

    linux 内核 kernel_核 travel_旅行 linux kernel travel linux 2.6 1 hellomod.c 001 // hello world driver for ...

  8. 复制linux内核,linux内核写时复制机制源代码解读

    作者简介 写时复制技术(一下简称COW)是linux内核比较重要的一种机制,我们都知道:父进程fork子进程的时候,子进程会和父进程会以只读的方式共享所有私有的可写页,当有一方将要写的时候会发生COW ...

  9. 生效linux内核,Linux内核

    内核 单内核体系设计.但充分借鉴了微内核设计体系的优点,为内核引入模块化机制. 内核组成部分: kernel:内核核心,一般为bzimage,通常在/boot目录下,名称为vmlinuz kernel ...

  10. 哪些系统使用了linux内核,Linux操作系统有哪些

    Linux操作系统有哪些 导语:Linux操作系统诞生于1991 年的10月5 日.Linux存在着许多不同的Linux版本,但它们都使用了Linux内核.Linux可安装在各种计算机硬件设备中,比如 ...

最新文章

  1. QT学习:Qt对Office的基本读写
  2. Kibana停止kibana的方法命令:找到5601端口对应的进程ID 把此进程进行kill即可
  3. 探索 OpenStack 之(10):深入镜像服务Glance
  4. 原生ajax如何执行,原生ajax调用数据实例讲解
  5. BZOJ.1023.[SHOI2008]cactus仙人掌图(DP)
  6. JDK8后的日期时间API
  7. 腾讯视频vip会员_腾讯视频如何查看版本号
  8. delphi services允许跨域访问
  9. java在未来_如何在java中创建一个完整的未来
  10. python的方向_Python Shell下方向键显示「^[[C^[[D」修复方法
  11. dubbo 分布式服务框架 介绍
  12. 刷魔趣系统与安装google相机
  13. CCNA中文版完整教程
  14. 普通二重积分计算的难点、易错点
  15. Hadoop MR 核心原理
  16. 应用程序无响应的原因
  17. 拯救强迫症:Win11去除桌面快捷方式小箭头
  18. html css图标怎么跟文字并排,科技常识:css图标与文字对齐的两种实现方法
  19. python 设置输入法为英文_win10输入法怎么设置为默认英语?win10输入法设置默认英文的方法...
  20. rk键盘快捷键快捷键不一致_使用键盘快捷键立即搜索您的终端历史记录

热门文章

  1. java实时获取android网速_获取Android网速的另一种方法
  2. html里的swal添加倒计时,使用甜蜜警报插件的setInterval函数倒计时
  3. php mysql 防 sql注入_php 防sql注入方法
  4. 处理 react_【学习教程】React 中阻止事件冒泡的问题
  5. ios android安全性分析,Android与iOS的对比分析及Android安全技术的设计与实现
  6. axure 模板_《惢客创业日记》2019.09.03(周二) 用Axure管理项目流程
  7. 字符串去重、统计不同字符种类数问题
  8. 使用Python,OpenCV进行平滑和模糊
  9. 【lidar】3D目标检测PointPillars:论文解读、代码解读、部署实现(1)
  10. Error #15: Initializing libiomp5md.dll, but found libiomp5md.dll already initialized.解决方案