Linux如何处理来自IRQ内的schedule()调用?

时间:2011-11-05 18:43:17

标签: linux x86 multitasking scheduler

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

我指的是x86个人电脑。我正在为我自己的(尝试)编写的小内核研究Linux调度程序/进程系统,而我无法理解我所缺少的内容。我知道我遗漏了一些东西,因为Slackware在我的计算机上运行这一事实证明了调度程序的工作原理:P

2 个答案:

答案 0 :(得分:4)

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

但是,可以在中断处理的 end 之后重新安排进程,这就是为了在进程之间划分CPU资源而偶尔进行的时间中断。此外,一些已修补的Linux内核已将ISR的工作委托给内核线程,在这种情况下,这些特殊的ISR可能会睡眠。

答案 1 :(得分:0)

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