Linux内核中断路径中不能睡眠,为什么?
这里就行了很深入的讨论,值得一看:http://bbs2.chinaunix.net/viewthread.php?tid=1618430
但是,他们的讨论最后没有得出一个明确的结论。其中,cskyrain在8楼
的思考触及到了一个要点,但是没有深入展开:
7楼:
8楼:
总体上,大家得到的初步结论是:内核在中断路径内不能睡眠,不是技术上做不到,而是没有理由这么做,或者说在中断路径上睡眠不合理。一方面,外部事件导致当前进程时间片被剥夺,不合理;一方面,中断服务程序应该尽快处理完中断,保证IO吞吐率。
-------------------------------分割线----------------------------
通过阅读ULK中文版第三版164页的内容,让我对这个问题有了一个较为清晰的认识:
内核在编译的时候设置了THREAD_SIZE的值为8K的话, 那么每个进程的内核栈的大小就为8K, 此时如果发生中断时,
那么进程的寄存器等值就会保存到它的8K的内核栈中.
但是如果设置了THREAD_SIZE的大小为4K的话, 内核就会使用3种类型的内核栈, 异常栈,
硬件中断请求栈以及软中断请求栈( When using 4K stacks, interrupts get their own stack instead of using
the currently active kernel stack.)
* 异常栈:每个进程一个。
* 硬中断请求栈:每个CPU一个,每个占用一个单独的页框。do_IRQ()函数内部通过调用execute_on_irq_stack负责切换到该栈中来。
* 软中断请求栈:每个CPU一个,每个占用一个单独的页框。
关于切换到中断栈的方法,请看下面的代码:
最后,思考一下标题中的问题:linux内核在中断路径内不能睡眠/调度的原因
Linux是以进程为调度单位的,调度器只看到进程内核栈,而看不到中断栈。在独立中断栈的模式下,如果linux内核在中断路径内发生了调度(从技术上讲,睡眠和调度是一个意思),那么linux将无法找到“回家的路”,未执行完的中断处理代码将再也无法获得执行机会。
分享到:
相关推荐
Linux内核中断机制,值得看看啊。 Linux内核中断机制,值得看看啊。 Linux内核中断机制,值得看看啊。 Linux内核中断机制,值得看看啊。
Linux内核学习路径 Linux内核学习路径 Linux内核学习路径
Linux内核的中断机制分析 Linux内核的中断机制分析
这是 LINUX 内核调度 的基本原理和算法 理解内核调度 可以好好看设备驱动了
Linux内核中断分析,希望对初学者有所帮助!
linux内核中断实例,可能通过模块参数插入指定的中断中
linux内核中断处理.doc
把内核中断的流程说的很清楚,学习Linux的必备资料
LINUX内核调度调试工具,很好用~LINUX内核调度调试工具
LINUX内核调度分析.pdf
Linux内核进程调度与控制 本文档详细说明了Linux内核进程调度与控制
原SGI工程师写的linux内核调度的实现,深入简出,不错。
linux内核的时钟中断详解,介绍内核时钟中断知识
linux内核编译2.6.39linux内核编译2.6.39linux内核编译2.6.39linux内核编译2.6.39linux内核编译2.6.39linux内核编译2.6.39linux内核编译2.6.39linux内核编译2.6.39linux内核编译2.6.39linux内核编译2.6.39linux内核...
Linux内核的中断机制.txt Linux内核的中断机制.txt Linux内核的中断机制.txtLinux内核的中断机制.txt
Linux 2.6内核的中断机制.pdf
本文主要从内核实现的角度分析了Linux 2.4.0内核的设备中断流程。本文是为那些想要了解Linux I/O子系统的读者和Linux驱动程序开发人员而写的。
Linux内核分析之调度算法
简短的LINUX内核的进程调度策略分析,内容包括调度时机、调度方式、调度策略。
如何编译你自己的linux内核.txt如何编译你自己的linux内核.txt如何编译你自己的linux内核.txt如何编译你自己的linux内核.txt如何编译你自己的linux内核.txt如何编译你自己的linux内核.txt如何编译你自己的linux内核....