忘记密码   免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 文库 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
楼主: cskyrain

中断处理程序为什么不能阻塞休眠???以前真没认真思考过! [复制链接]

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
发表于 2009-11-29 21:08 |显示全部楼层
原帖由 cskyrain 于 2009-11-24 20:36 发表
一直认为中断处理函数不能休眠的是天经地义的,可从没认真思考过问什么不能休眠,阻塞。最近看了一下ulk中对这个的解释,感觉还是有点不太明白,
“The price to pay for allowing nested kernel control path ...

如需要阻塞,我们一般采取中断降级的办法。
具体做法是把任务丢到一个任务队列,尽快恢复现场,中断返回,不要耽误下一次中断。

论坛徽章:
0
发表于 2009-11-30 09:18 |显示全部楼层
可重入性问题?

论坛徽章:
0
发表于 2010-01-19 16:18 |显示全部楼层
中断处理器程序执行时是在关中断的情况下,其执行时间都是尽可能的短以避免中断丢失,不能休眠当然也有这方面的原因。

论坛徽章:
0
发表于 2010-09-29 16:15 |显示全部楼层
这帖子值得继续讨论。

首先要参考http://linux.chinaunix.net/bbs/thread-902033-1-38.html 中4楼的发言。个人以为分析到位了。

再次,参考 http://lwn.net/Articles/302043/, 引入threaded_irq后,中断的下半部是可以休眠的了。

论坛徽章:
0
发表于 2011-05-05 10:50 |显示全部楼层
7楼说的不错!

论坛徽章:
0
发表于 2011-05-05 10:52 |显示全部楼层
8楼说的很好!

论坛徽章:
0
发表于 2011-05-05 13:00 |显示全部楼层
一直认为中断处理函数不能休眠的是天经地义的,可从没认真思考过问什么不能休眠,阻塞。最近看了一下ulk中对 ...
cskyrain 发表于 2009-11-24 20:36



    中斷的時候不確定是在哪個進程, 此時休眠的話, 處理完以后可能就導致這個進程永遠被掛起而不會再回來了.

论坛徽章:
0
发表于 2012-11-24 22:01 |显示全部楼层
cskyrain 发表于 2009-11-25 12:14
呵呵,又翻了翻书,思考了一下,由于时间问题,没心情再从头读ulk,只是跳着查了一下,难免会漏下很多东西, ...


在ULK的4.6.1.4Multiple Kernel Mode Stacks中写到:
If the size of the thread_union structure is 8KB, the Kernel Mode stack of the current process is used for every type of kernel control path: exceptions, interrupts, and deferrable functions. Conversely, if the size of the thread_union structure is 4KB, the kernel makes uses of three types of Kernel Mode stacks:
...
...
Thus, hard IRQ stacks and soft IRQ stacks are very similar to the exception stacks described in the section "Identifying a Process" in Chapter 3; the only difference is that the thread_info structure coupled with each stack is associated with a CPU rather a process.
所以说根据这些描述推断 cskyrain 阐述的 “第二中情况 中断不是用单独的中断栈, 而是使用当前进程的内核栈 ” 是对的~ ^_^ 不知是不是这样?(我刚开始研究内核没两个月)

论坛徽章:
0
发表于 2013-06-23 00:21 |显示全部楼层
感觉说的都挺有道理,我说一下自己的理解:
看了很多帖子说是设计问题,而不是不能实现。这样设计好处很多,可以及时响应中断,不用处理很多复杂情况之类的。很多rt-os允许中断block的。
1 如果用进程的内核栈的话,中断其实可以被block,但是这种情况下,何时从新进入这个中断就是个问题了,只有这个中断的进程依附的进程被调度的时候才能进入。而这时间就不好确定了
2.如果中断使用自己的堆栈的话,那要block以后,应该不能再调入了吧。因为调度是相对于进程而言。
希望能搞明白到底是怎么回事。

论坛徽章:
0
发表于 2014-07-29 21:44 |显示全部楼层
本帖最后由 xupt_liangning 于 2014-07-29 21:45 编辑

我个人的理解,中断使用的是进程的中断栈,而异常和进程的内核态都使用的是进程的异常栈。。而进程切换的标志就是切换到了进程的异常栈,所以说,进程的在内核态或者异常处理程序中可以睡眠(可以切换到别的进程),因为它可以恢复。。而进程如果处在中断处理程序中,如果发生了进程切换,那么等下一次切换回来的时候,就只能回到异常栈,回不到中断栈了,所以上次的中断(包括所有嵌套的中断)就丢了。。。     我的qq:119353825  可以联系我讨论哦
您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:wangnan@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP