- 论坛徽章:
- 0
|
原帖由 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作为一组内核线程,当然是可以让中断睡眠的。但我始终任为中断是紧急事务,必须立即处理,我想不出有任何理由推迟中断的处理。 |
|