Wird kernel / sched.c / context_switch () garantiert jedes Mal aufgerufen, wenn ein Prozess eingeschaltet wird?

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 - ein Diagnosecode ausgeführt wird (detaillierte Erklärung unten, falls Sie neugierig sind). 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 Sinn macht (dies ist nur eine flüchtige Analyse von sched.c/schedule() ).

Das Problem ist, dass der Linux-Scheduler für mich im Grunde schwarze Magie ist, 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 total?)

Um etwas Kontext zu geben, arbeite ich mit dem MARSS x86-Simulator, der versucht, bestimmte Instrumente zu instrumentieren und zu messen. 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 jemand sich einen einfacheren Weg vorstellen kann, wird dies auch sehr geschätzt.

    
Reiik 18.06.2012, 00:45
quelle

1 Antwort

4

Ja, Sie haben Recht.

Das schedule() ruft context_switch() auf, das 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() auf.

switch_mm() - Wechseln Sie zur virtuellen Speicherzuordnung für den neuen Prozess

switch_to() - wechselt den Prozessorstatus vom vorherigen Prozess in den neuen Prozess (Speichern / Wiederherstellen von Registern, Stack-Informationen und anderen architekturspezifischen Dingen)

Was Ihren Ansatz anbelangt, denke ich, dass es in Ordnung ist. Es ist wichtig, die Dinge bei der Arbeit mit dem Kernel sauber und sauber zu halten und es relativ einfach zu halten, bis Sie mehr Wissen haben.

    
Milan 18.06.2012, 09:43
quelle