2011-11-05 45 views
1

内核如何处理从IRQ中调用的schedule()函数?说,task1调用IRQ0(定时器)的调度,task2从INT 80h恢复(我忘记强制任务切换的系统调用的名称)。 IRQ“ACK”信号永远不会被发送,并且IRQ将停止发送。Linux如何处理从IRQ中调度()的调用?

我指的只是x86个人电脑。我正在为我自己的小内核(我试图)编写Linux调度程序/进程系统进行研究,而且我无法理解我缺少的东西。我知道我错过了一些事情,因为Slackware在我的电脑上运行的事实证明了调度程序工作的事实:P

回答

4

简短的回答是,它没有。在普通的Linux系统上,ISR上下文被认为是一个原子上下文,意味着你不应该在任何时候对调度器产生控制。如果某些代码从中断上下文调用schedule(),则很可能会得到一个“BUG:调度时原子”打印。

但是,有可能重新调度中断处理的结束之后的进程,这就是时间中断偶尔为了在进程间划分CPU资源所做的事情。此外,一些打补丁的Linux内核已经将ISR的工作委托给内核线程,在那种情况下,这些特殊的ISR可能会休眠。

+0

调度如何工作呢?我的印象是你必须在0环境切换。否则,像切换内存映射和更改调度程序数据的内容不会被大声说出。据我所知,从用户land/ring3切换到ring0的唯一方法是通过中断或sysenter/exit类型的调用。 – Caleb1994

+0

哦,你也可以通过iret切换戒指。忘了那一个。 – Caleb1994

+0

好的。那么我越看越......越有意义。我相信我自己的想法正在困扰着我......感谢您的帮助! – Caleb1994

0

通常在sys调用服务之后(服务软件中断之后)和系统定时器中断(特殊硬件中断)之后进行调度。通常硬件中断不会强制调度。