是否保证在每次切换进程时调用kernel / sched.c / context_switch()?

时间:2012-06-18 00:45:10

标签: c linux process scheduler context-switch

我想改变Linux内核,以便每当当前PID改变时 - 即,接入新进程 - 执行一些诊断代码(下面的详细解释,如果好奇的话)。我做了一些挖掘,似乎每次调度程序选择一个新进程时,都会调用函数context_switch(),这是有意义的(这只是对sched.c/schedule()的粗略分析)。

问题是,Linux调度程序现在对我来说基本上是黑魔法,所以我想知道这个假设是否正确。是否保证每次选择新进程以在CPU上获得一些时间时,都会调用context_switch()函数?或者内核源中是否有其他位置可以在其他情况下处理调度? (或者我完全误解了这一切?)

为了给出一些背景信息,我正在使用MARSS x86模拟器来尝试对某些程序进行一些检测和测量。问题是我的仪器需要知道某些代码事件对应于哪个执行过程,以避免误解数据。我们的想法是使用MARSS中的一些内置消息传递系统在每个上下文切换时传递新进程的PID,因此它始终知道当前正在执行的PID。如果有人能想到一种更简单的方法来实现这一目标,那也将非常感激。

1 个答案:

答案 0 :(得分:4)

是的,你是对的。

schedule()选择新流程时,context_switch()会调用负责从一个任务切换到另一个任务的schedule()

context_switch()基本上做了两件事。它会调用switch_mm()switch_to()

switch_mm() - 切换到新进程的虚拟内存映射

switch_to() - 将处理器状态从上一个进程切换到新进程(保存/恢复寄存器,堆栈信息和其他特定于体系结构的东西)

至于你的方法,我猜这很好。在使用内核时保持良好和干净是很重要的,并且在获得更多知识之前尽量保持相对容易。