从()内核的函数实际工作?
我试图理解Linux内核中的进度过程是如何工作的。 我的问题不是关于调度算法。 它关于函数schedule()
和switch_to()
工作的。
我会尽力解释。 我看到了:
当进程用完时间片时,标志need_resched
由scheduler_tick()
设置。 内核检查标志,看到它已设置,并调用schedule()
(与问题1相关)切换到新进程。 该标志是应该尽快调用调度的消息,因为另一个进程值得运行。 在返回到用户空间或从中断返回时,将检查need_resched
标志。 如果已设置,则内核在继续之前调用调度程序。
研究内核源代码(linux-2.6.10 - “Linux内核开发第二版”所基于的版本),我还看到一些代码可以自动调用schedule()
函数,让另一个进程有权跑。 我看到函数switch_to()
是实际执行上下文切换的函数。 我研究了一些与架构相关的代码,试图了解switch_to()
实际上在做什么。
这种行为引发了一些问题,我无法找到答案:
当switch_to()
完成时,当前正在运行的进程是什么? 调用schedule()
的过程? 或者下一个过程,即被选中运行的过程?
当schedule()
被中断调用时,选择的进程在中断处理完成时(在某种RTE之后)开始运行? 或之前?
如果schedule()
函数不能从中断中调用,flag- need_resched
是什么时候设置的?
当定时器中断处理程序正在工作时,正在使用什么堆栈?
我不知道我是否可以说清楚。 如果我不能,我希望我能在回答(或问题)后做到这一点。 我已经看了几个试图理解这个过程的来源。 我有这本书“Linux Kernel Development,sec ed”,我也在使用它。 我知道一些关于MIP和H8300架构,如果这有助于解释。
switch_to()
,内核堆栈切换到next
命名的任务。 更改地址空间等在context_switch()
处理。 schedule()
不能在原子上下文中调用,包括来自中断(参见schedule_debug()
的检查)。 如果需要重新调度,则设置TIF_NEED_RESCHED任务标志,在中断返回路径中检查该标志。 为了更详细一点,这里有一个实际的例子:
schedule()
时短暂启用中断。 schedule()
如果需要的话直接调用schedule()
)以及检查未决信号,然后返回retint_check
另一轮,直到没有更重要的标志设置为止。 至于switch_to()
; switch_to()
(在x86-32上)的作用是:
current_task
的值。 此时, current
现在指向新的任务。 switch_to()
的旧代码 current
指向新任务,并且我们处于新任务的堆栈中,但其他各种CPU状态尚未更新。 __switch_to()
处理切换诸如FPU,段描述符,调试寄存器等的状态。 __switch_to()
返回时,将switch_to()
手动推入堆栈的返回地址返回,将执行放回到新任务中switch_to()
之前的位置。 切换任务现在已完全恢复执行。 x86-64非常相似,但由于ABI不同,必须稍微进行更多的状态保存/恢复。
链接地址: http://www.djcxy.com/p/84887.html