转载自:

tiloog的博客——沙漠绿洲——Alan's Blog for technology

http://bbs.ednchina.com/BLOG_ARTICLE_182873.HTM

这个问题实际上是一个老生常谈的问题,答案也很简单,Linux在软中断上下文中是不能睡眠的,原因在于Linux的软中断实现上下文有可能是中断上下文,如果在中断上下文中睡眠,那么会导致Linux无法调度,直接的反应是系统Kernel Panic,并且提示dequeue_task出错。所以,在软中断上下文中,我们不能使用信号量等可能导致睡眠的函数,这一点在编写IO回调函数时需要特别注意。在最近的一个项目中,我们在dm-io的callback函数中去持有semaphore访问竞争资源,导致了系统的kernel panic。其原因就在于dm-io的回调函数在scsi soft irq中执行,scsi soft irq是一个软中断,其会在硬中断发生之后被执行,执行上下文为中断上下文。

中断上下文中无法睡眠的原因大家一定很清楚,原因在于中断上下文不是一个进程上下文,其没有一个专门用来描述CPU寄存器等信息的数据结构,所以无法被调度器调度。如果将中断上下文也设计成进程上下文,那么调度器就可以对其进行调度,如果在开中断的情况下,其自然就可以睡眠了。但是,如果这样设计,那么中断处理的效率将会降低。中断(硬中断、软中断)处理都是些耗时不是很长,对实时性要求很高,执行频度较高的应用,所以,如果采用一个专门的后台daemon对其处理,显然并不合适。

Linux对中断进行了有效的管理,一个中断发生之后,都会通过相应的中断向量表获取该中断的处理函数。在Linux操作系统中都会调用do_IRQ这个函数,在这个函数中都会执行__do_IRQ(),__do_IRQ函数调用该中断的具体执行函数。在执行过程中,该函数通过中断号找到具体的中断描述结构irq_desc,该结构对某一具体硬件中断进行了描述。在irq_desc结构中存在一条链表irqaction,这条链表中的某一项成员都是一个中断处理方法。这条链表很有意思,其实现了中断共享,例如传统的PCI总线就是采用共享中断的方法,该链表中的一个节点就对应了一个PCI设备的中断处理方法。在PCI设备驱动加载时,都需要注册本设备的中断处理函数,通常会调用request_irq这个函数,通过这个函数会构造一个具体的irq action,然后挂接到某个具体irq_desc的action链表下,实现中断处理方法的注册。在__do_IRQ函数中会通过handle_IRQ_event()函数遍历所有的action节点,完成中断处理过程。到目前为止,中断处理函数do_IRQ完成的都是上半部的工作,也就是设备注册的中断服务程序。在中断上半部中,通常都是关中断的,基本都是完成很简单的操作,否则将会导致中断的丢失。耗时时间相对较长,对实时性要求不是最高的应用都会被延迟处理,都会在中断下半部中执行。所以,在中断上半部中都会触发软中断事件,然后执行完毕,退出服务。

__do_IRQ完成之后,返回到do_IRQ函数,在该函数中调用了一个非常重要的函数irq_exit(),在该函数中调用invoke_softirq(),invoke_softirq调用do_softirq()函数,执行软中断的操作。此时,程序的执行环境还是中断上下文,但是与中断上半部不同的是,软中断执行过程中是开中断的,能够被硬中断而中断。所以,如果用户的程序在软中断中睡眠,操作系统该如何调度呢?只有kernel panic了。另外,软中断除了上述执行点之外,还有其他的执行点,在内核中还有一个软中断的daemon处理软中断事务,驱动程序也可以自己触发一个软中断事件,并且在软中断的daemon上下文中执行。但是硬中断触发的事件都不会在这个daemon的上下文中执行,除非修改Linux中的do__IRQ代码。

上述对软中断的执行做了简要分析,我对Linux中的硬中断管理机制做了一些代码分析,这一块代码量不是很大,可移植性非常的好~~建议大家阅读,对我上述的分析和理解存在什么不同意见,欢迎大家讨论。

软中断上下文能够睡眠吗?相关推荐

  1. 上下文保存 中断_Linux内核中断顶半部和底半部的理解

    @[toc] 中断上半部.下半部的概念   设备的中断会打断内核进程中的正常调度和运行,系统对更高吞吐率的追求势必要求中断服务程序尽量短小精悍.但是,这个良好的愿望往往与现实并不吻合.在大多数真实的系 ...

  2. 进程上下文与中断上下文

    最近学习驱动程序中总是发现在某些资料或书籍中提到进程上下文和中断上下文,但是又都没有讲解什么是上下文:因此笔者查阅资料补充了一下所谓的Linux上下文知识.(注:以下知识度娘而来) 上下文(conte ...

  3. 进程上下文、中断上下文及原子上下文

    谈论进程上下文 .中断上下文 . 原子上下文之前,有必要讨论下两个概念: a -- 上下文 上下文是从英文context翻译过来,指的是一种环境.相对于进程而言,就是进程执行时的环境: 具体来说就是各 ...

  4. linux驱动线程睡眠,linux驱动中断不能睡眠的原因

    自己的理解: 查了很多资料,比较多的是说中断没有上下文,调度出去之后不能正确返回,个人觉得这不是根本原因或者本身说法就不对.中断上下文借用进程上下文,被切换出去还是可以回来的.中断一般用于任务需要紧急 ...

  5. Linux软中断、tasklet和工作队列

    Linux内核中的软中断.tasklet和工作队列详解 引言 软中断.tasklet和工作队列并不是Linux内核中一直存在的机制,而是由更早版本的内核中的"下半部"(bottom ...

  6. 嵌入式之linux用户空间与内核空间,进程上下文与中断上下文

    文章目录 前言 用户空间与内核空间 内核态与用户态 进程上下文和中断上下文 上下文 原子 进程上下文 中断上下文 进程上下文VS中断上下文 原子上下文 前言 之前在学习嵌入式linux系统的时候,一直 ...

  7. Linux内核中的软中断、tasklet和工作队列详解

    本文基于Linux2.6.32内核版本. 引言 软中断.tasklet和工作队列并不是Linux内核中一直存在的机制,而是由更早版本的内核中的"下半部"(bottom half)演 ...

  8. Linux内核中的软中断、tasklet和工作队列具体解释

    [TOC] 本文基于Linux2.6.32内核版本号. 引言 软中断.tasklet和工作队列并非Linux内核中一直存在的机制,而是由更早版本号的内核中的"下半部"(bottom ...

  9. 进程上下文和中断上下文

    1.进程上下文 进程上下文实际上是进程执行活动全过程的静态描述.我们把已执行过的进程指令和数据在相关寄存器与堆栈中的内容称为上文,把正在执行的指令和数据在寄存器和堆栈中的内容称为正文,把待执行的指令和 ...

  10. 面向睡眠阶段分类的自适应时空图卷积神经网络

    ©PaperWeekly 原创 · 作者|宁晓军 学校|北京交通大学硕士生 研究方向|时间序列分析与挖掘:图神经网络 本文介绍一篇北京交通大学网络科学与智能系统研究所贾子钰博士等人,于 IJCAI 2 ...

最新文章

  1. java 苹果vcf解析_VCF文件格式解析
  2. Elasticsearch 常见的 8 种错误及最佳实践
  3. linux系统让一个命令在后台运行,Linux——Linux后台运行命令详述
  4. ospf序列号等问题
  5. DataWorks 2021-08 产品月刊(含用户体验季刊!)
  6. 垃圾收集器Serial 、Parallel、CMS、G1
  7. ArcGIS Engine 10开发环境的一些常见问题(转载)
  8. array_reverse_PHP array_reverse()函数与示例
  9. 玩转oracle 11g(46):图解oracle数据库
  10. 西点军校邀马云谈领导力:要为年轻人和未来做决策_演讲
  11. 程序员口头禅_今年系统管理员的口头禅:更聪明地工作,而不是更努力
  12. 澎思科技获IDG资本数千万元Pre-A轮融资,推出AI安防全场景软硬件解决方案
  13. Perl语言入门(第六版)pdf
  14. 服务器修改ip socket,socket不能选择本地IP连接的解决方法
  15. Excel中度分秒格式(dd°mm′ss″)与十进制度(°)格式互转,角度与弧度互转
  16. sht30温湿度传感器中文手册_DHT11温湿度传感器编程思路以及代码的实现
  17. 【网络通信 -- 直播】SRS 实战记录 -- 开源流媒体服务器对比与 SRS 直播效果测试
  18. php怎么启动服务,如何打开php服务
  19. C# 身份证读卡器开发
  20. oracle查询倒叙,ORACLE 索引结构--倒叙索引:

热门文章

  1. js高级学习笔记(b站尚硅谷)-1-数据类型
  2. yum 源端软件包扩展
  3. win10如何打开摄像头_win10系统,蓝牙关闭,如何打开?
  4. neo4j python可视化_Python使用py2neo操作图数据库neo4j的方法详解
  5. 商城app源码_多商户商城源码系统有什么优势呢?
  6. python逻辑运算优先级_测试误区《二》 python逻辑运算和关系运算优先级
  7. java 怎么调用clojure_从java调用Clojure时Clojure状态的范围
  8. android自定义文本框,android自定义文本框,后面带清空按钮
  9. node.js mysql 自动重连_nodejs中mysql断线重连
  10. 不小心将.gitignore中标记忽略类型的文件提交到了远端仓库,怎么办?