2012-06-18 2 views
8

Je veux modifier le noyau Linux de sorte que chaque fois que le PID actuel change, c'est-à-dire qu'un nouveau processus soit activé, un code de diagnostic est exécuté (explication détaillée ci-dessous, si curieux). J'ai fait quelques recherches, et il semble que chaque fois que le planificateur choisit un nouveau processus, la fonction context_switch() est appelée, ce qui est logique (c'est juste une analyse superficielle de sched.c/schedule()). Le problème est que le planificateur Linux est fondamentalement noir pour moi en ce moment, donc j'aimerais savoir si cette hypothèse est correcte. Est-il garanti que, chaque fois qu'un nouveau processus est sélectionné pour avoir du temps sur le CPU, la fonction context_switch() est appelée? Ou y a-t-il d'autres endroits dans la source du noyau où l'ordonnancement pourrait être géré dans d'autres situations? (Ou suis-je totalement malentendu tout cela?)Est-ce que kernel/sched.c/context_switch() est garanti pour être invoqué chaque fois qu'un processus est activé?

Pour donner un peu de contexte, je travaille avec le simulateur MARSS x86 en essayant de faire de l'instrumentation et de mesurer certains programmes. Le problème est que mon instrumentation doit savoir à quel processus d'exécution correspondent certains événements de code, afin d'éviter une mauvaise interprétation des données. L'idée est d'utiliser des systèmes intégrés de passage de messages dans MARSS pour passer le PID du nouveau processus sur chaque commutateur de contexte, de sorte qu'il sache toujours quel PID est en cours d'exécution. Si quelqu'un peut penser à un moyen plus simple d'accomplir cela, cela serait également grandement apprécié.

Répondre

4

Oui, vous avez raison.

Le schedule() appellera context_switch() qui est responsable du passage d'une tâche à une autre lorsque le nouveau processus a été sélectionné par schedule().

context_switch() fait essentiellement deux choses. Il appelle switch_mm() et switch_to().

switch_mm() - commutateur sur la cartographie de la mémoire virtuelle pour le nouveau processus

switch_to() - changer l'état du processeur du processus précédent au nouveau processus (sauvegarde/restauration des registres, pile d'informations et d'autres choses spécifiques à l'architecture)

En ce qui concerne votre approche, je suppose que c'est bien. Il est important de garder les choses bien et propres lorsque vous travaillez avec le noyau, et essayez de le garder relativement facile jusqu'à ce que vous acquérez plus de connaissances.

Questions connexes