我想改变Linux内核,以便每当当前PID改变时 - 即,接入新进程 - 执行一些诊断代码(下面的详细解释,如果好奇的话)。我做了一些挖掘,似乎每次调度程序选择一个新进程时,都会调用函数context_switch()
,这是有意义的(这只是对sched.c/schedule()
的粗略分析)。
问题是,Linux调度程序现在对我来说基本上是黑魔法,所以我想知道这个假设是否正确。是否保证每次选择新进程以在CPU上获得一些时间时,都会调用context_switch()函数?或者内核源中是否有其他位置可以在其他情况下处理调度? (或者我完全误解了这一切?)
为了给出一些背景信息,我正在使用MARSS x86模拟器来尝试对某些程序进行一些检测和测量。问题是我的仪器需要知道某些代码事件对应于哪个执行过程,以避免误解数据。我们的想法是使用MARSS中的一些内置消息传递系统在每个上下文切换时传递新进程的PID,因此它始终知道当前正在执行的PID。如果有人能想到一种更简单的方法来实现这一目标,那也将非常感激。
答案 0 :(得分:4)
是的,你是对的。
当schedule()
选择新流程时,context_switch()
会调用负责从一个任务切换到另一个任务的schedule()
。
context_switch()
基本上做了两件事。它会调用switch_mm()
和switch_to()
。
switch_mm()
- 切换到新进程的虚拟内存映射
switch_to()
- 将处理器状态从上一个进程切换到新进程(保存/恢复寄存器,堆栈信息和其他特定于体系结构的东西)
至于你的方法,我猜这很好。在使用内核时保持良好和干净是很重要的,并且在获得更多知识之前尽量保持相对容易。