2012-06-18 11 views
8

Ich möchte den Linux-Kernel so ändern, dass jedes Mal, wenn sich die aktuelle PID ändert - d. H. Ein neuer Prozess eingeschaltet wird - irgendein Diagnosecode ausgeführt wird (detaillierte Erklärung unten, falls neugierig). Ich habe etwas gegraben, und es scheint, dass jedes Mal, wenn der Scheduler einen neuen Prozess auswählt, die Funktion context_switch() aufgerufen wird, was sinnvoll ist (dies ist nur eine flüchtige Analyse von sched.c/schedule()).Wird Kernel/sched.c/context_switch() garantiert jedes Mal aufgerufen, wenn ein Prozess eingeschaltet wird?

Das Problem ist, der Linux-Scheduler ist im Grunde schwarze Magie, also würde ich gerne wissen, ob diese Annahme richtig ist. Ist es garantiert, dass jedes Mal, wenn ein neuer Prozess ausgewählt wird, um etwas Zeit auf der CPU zu bekommen, die Funktion context_switch() aufgerufen wird? Oder gibt es andere Stellen in der Kernel-Quelle, in denen die Terminplanung in anderen Situationen gehandhabt werden könnte? (Oder irre ich das alles?)

Um etwas Kontext zu geben, arbeite ich mit dem MARSS x86 Simulator, der versucht, einige Instrumente und Messungen bestimmter Programme zu machen. Das Problem ist, dass meine Instrumentierung wissen muss, welchem ​​Ausführungsprozess bestimmte Code-Ereignisse entsprechen, um eine Fehlinterpretation der Daten zu vermeiden. Die Idee besteht darin, einige eingebaute Nachrichtenübergabesysteme in MARSS zu verwenden, um die PID des neuen Prozesses bei jedem Kontextwechsel zu übergeben, so dass es immer weiß, welche PID gerade ausgeführt wird. Wenn sich jemand einen einfacheren Weg vorstellen könnte, würde dies auch sehr geschätzt werden.

Antwort

4

Ja, Sie haben Recht.

Die schedule() ruft context_switch() auf, die für den Wechsel von einer Aufgabe zu einer anderen verantwortlich ist, wenn der neue Prozess von schedule() ausgewählt wurde.

context_switch() macht grundsätzlich zwei Dinge. Es ruft switch_mm() und switch_to().

switch_mm() - Schalter auf die virtuelle Speicherzuordnung für den neuen Prozess

switch_to() - den Zustand des Prozessors aus dem vorherigen Prozess zu dem neuen Verfahren (Save/Register wiederherstellen, Informationen und andere Architektur bestimmte Dinge stapeln)

Für Ihren Ansatz, ich denke, es ist in Ordnung. Es ist wichtig, die Dinge beim Arbeiten mit dem Kernel sauber und sauber zu halten und es relativ einfach zu halten, bis Sie mehr Wissen haben.