免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 思一克

关于LINUX在中断(硬软)中不能睡眠的真正原因 [复制链接]

论坛徽章:
0
发表于 2007-06-27 22:36 |显示全部楼层
原帖由 rwen2012 于 2007-6-27 22:04 发表于 20楼  
http://hi.baidu.com/rwen2012/blo ... 28f1b4c9eaf4d0.html


简单看了一下前面的回复, 不能认同.

问题的焦点大家都集中在异步异常(中断)没有自己的上下文?

中断抢占了当前任务后, 可以通过current获得当前的task结构, 将当前任务的寄存器信息压入栈中, 替换成自己的eip和esp. 你完全可以理解为当前任务调用了handler()函数. 当然, 如果中断使用了自己的栈, 就会有问题!!

如果handler()函数调用了
schedule_timeout_interruptible(1000)
这样当前任务就被加入到定时器中,  定时器软中断到了1000ms就会把handler抢占的任务唤醒.

当然上述代码要正常工作, 要修改内核一些地方, 如schedule()里面的很多检查, 中断中的很多标志位和锁, entry.s中的很多判断.

只是想说明, 中断不能sleep, 不是因为没有上下文!

论坛徽章:
0
发表于 2007-06-27 23:05 |显示全部楼层
原帖由 xiaozhaoz 于 2007-6-27 22:36 发表于 21楼  


简单看了一下前面的回复, 不能认同.

问题的焦点大家都集中在异步异常(中断)没有自己的上下文?

中断抢占了当前任务后, 可以通过current获得当前的task结构, 将当前任务的寄存器信息压入栈中, 替换成自己的eip和esp. 你完全可以理解为当前任务调用了handler()函数. 当然, 如果中断使用了自己的栈, 就会有问题!!

如果handler()函数调用了
schedule_timeout_interruptible(1000)
这样当前任务就被加入到定时器中,  定时器软中断到了1000ms就会把handler抢占的任务唤醒.

当然上述代码要正常工作, 要修改内核一些地方, 如schedule()里面的很多检查, 中断中的很多标志位和锁, entry.s中的很多判断.

只是想说明, 中断不能sleep, 不是因为没有上下文!



的确不光是上下文的问题,比如说还有调度的问题。

假设按你说的方式中断睡眠后,被打断线程也跟着睡眠显然会导致很多不可预知的问题。

中断产生是随机的,假设某次中断一个内核线程,而且按照你说的方案,这个线程的task结构就会被借用,线程就会去睡眠。被打断线程的优先级如果太低,那么它很难有机会再执行,某些情况下可能造成系统hang。如果临时提高被打断线程的优先级,那么又需要设计新的唤醒机制来保证阻塞同一锁上的高优先级的线程被先唤醒。同时,要实现临时提高被打断线程的优先级,又需要再锁的获取流程增加改变优先级的算法。


总之,没有考虑的问题还很多。

论坛徽章:
0
发表于 2007-06-27 23:13 |显示全部楼层
原帖由 Solaris12 于 2007-6-27 23:05 发表于 22楼  



的确不光是上下文的问题,比如说还有调度的问题。

假设按你说的方式中断睡眠后,被打断线程也跟着睡眠显然会导致很多不可预知的问题。

中断产生是随机的,假设某次中断一个内核线程,而且按照你说的 ...


所见略同.

19楼描述的就是这个问题.

而realtime Patch解决的也是这个问题.

PS. 最近在做一个多内核的项目, 包括solaris, 请问你们讨论solaris内核一般在哪里? OpenSolaris的mail list感觉不太热闹.

论坛徽章:
0
发表于 2007-06-28 00:12 |显示全部楼层
1. 毫无疑问, 在关中断的时候不能sleep, 这点大家都知道, 因为时钟中断无法触发. 但不是所有情况下, 在关中断时sleep都会导致系统死掉, 在SMP的情况下, 可能系统不会死掉.

2.  中断的handler能否sleep?
     这其实和"中断没有自己的上下文"无关. CPU没有关中断, 中断有自己的上下文, 中断的上下文就是抢占的任务A的上下文.
     和栈溢出也没有关系, 现在的中断都是可以嵌套的, 如果中断sleep只会让后面的中断抢占其他任务, 根本不存在栈溢出问题, 不过现在内核的4K中断单独栈会有问题. 这会导致栈被破坏.

假设中断sleep了, 在调度的时候, 内核将中断的CS:eip和SS:esp保存在被抢占任务A的thread_info中, 当任务A被重新唤醒的时候, 任务A从中断的CS:eip开始执行, 这也能正常执行下去, 中断执行完后, 从ret_from_intr中返回. 可以恢复任务A的抢占前的场景.


看着脑子里嗡嗡作响啊,共鸣啊

论坛徽章:
0
发表于 2007-06-28 08:39 |显示全部楼层
LINUX 2。6 内核中断(软中断)自己使用自己的堆栈。
LINUX调度的单位是进程,中断中睡眠后因没有CONTEXT回不来。

还有2楼说的我同意,在中断中不让调度主要是设计问题。所以就LINUX具体看。

如果一定要改动系统,设计的中断可以调度,是可以办到的。

论坛徽章:
0
发表于 2007-06-28 09:10 |显示全部楼层
原帖由 xiaozhaoz 于 2007-6-27 23:13 发表于 23楼  

所见略同.

19楼描述的就是这个问题.

而realtime Patch解决的也是这个问题.

PS. 最近在做一个多内核的项目, 包括solaris, 请问你们讨论solaris内核一般在哪里? OpenSolaris的mail list感觉不太热闹.






我常去以下两个alias,偶尔也会发言,虽然英语不大好

这两个列表的流量相对比较大,上次休假几天,就有上千封邮件。
你敢兴趣可以发邮件订阅,或者用下面的web界面访问:

Code

http://www.opensolaris.org/jive/forum.jspa?forumID=12

networking

http://www.opensolaris.org/jive/forum.jspa?forumID=3

论坛徽章:
0
发表于 2007-06-28 10:37 |显示全部楼层
原帖由 xiaozhaoz 于 2007-6-27 22:00 发表于 19楼  


里面很多说法不是很同意, 个人认为中断处理handler不能sleep原因应该不是上面那些.

我们都是从理论讲下面这些问题, 因为linux在很多地方做了保护, 所以直接sleep或者schedule()会导致内核异常.

首先分 ...

>>这其实和"中断没有自己的上下文"无关. CPU没有关中断, 中断有自己的上下文, 中断的上下文就是抢占的任务A的上下文.

“中断没有自己的上下文”,呵呵,我没有说这句话哈。lz很多立论在这句话上,估计是看贴的时候看错了。

>>假设中断sleep了, 在调度的时候, 内核将中断的CS:eip和SS:esp保存在被抢占任务A的thread_info中, 当任务A被重新唤醒的时候, 任务A从中断的CS:eip开始执行, 这也能正常执行下去, 中断执行完后, 从ret_from_intr中返回. 可以恢复任务A的抢占前的场景.

这里在中断sleep了,由谁来唤醒呢?关键还是没有一个中断描述符来作为内核调度的单位。
前面也说到了,这是个设计问题,不是能不能实现的问题。
如果说把中断的handler作为一组内核线程,当然是可以让中断睡眠的。但我始终任为中断是紧急事务,必须立即处理,我想不出有任何理由推迟中断的处理。

论坛徽章:
0
发表于 2007-06-28 10:42 |显示全部楼层
原帖由 Solaris12 于 2007-6-27 20:25 发表于 17楼  


Cool!

你说的很准确。的确是你说的情况。

举例来说, 写网卡驱动程序,我们通常把中断服务函数说成ISR。

但在Solaris里,每个级低优先级中断都有个IST,中断服务线程。


我说的ISR是驱动程序的 ...

看来Solaris中的IST有点类似用内核线程来实现中断的handler,这种情况下应该是可以睡眠的。
Solaris的实现果然和linux有很多不同,要多多请教了。

论坛徽章:
0
发表于 2007-06-28 10:56 |显示全部楼层
原帖由 xiaozhaoz 于 2007-6-27 22:36 发表于 21楼  


简单看了一下前面的回复, 不能认同.

问题的焦点大家都集中在异步异常(中断)没有自己的上下文?

中断抢占了当前任务后, 可以通过current获得当前的task结构, 将当前任务的寄存器信息压入栈中, 替换成自 ...

此外,我想lz对上下文一词还有点误解。
上下文(context)表示当前cpu的状态,包括各种标志及寄存器的值。这里中断是运行在自己的上下文而不是进程的上下文。如果是运行在进程上下文的话,中断处理就不需要在开始就保存上下文,在离开的时候又恢复。
当然,有一些先进的处理器(例如安腾),它为中断处理程序提供了一套专门的寄存器供中断处理程序使用,这个时候很多上下文是不需要保存的(但并非说就不保存上下文,只是某些不用保存)

论坛徽章:
0
发表于 2007-06-28 10:58 |显示全部楼层
原帖由 xiaozhaoz 于 2007-6-27 23:13 发表于 23楼  


所见略同.

19楼描述的就是这个问题.

而realtime Patch解决的也是这个问题.

PS. 最近在做一个多内核的项目, 包括solaris, 请问你们讨论solaris内核一般在哪里? OpenSolaris的mail list感觉不太热闹.

OpenSolaris?阁下是intel的?或是SUN北京分舵的?
如果不是,国内也有公司开始做OpenSolaris了?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP