-
Notifications
You must be signed in to change notification settings - Fork 4
Changement de contexte
Le changement de contexte est un point critique dans le fonctionnement d'un système d'exploitation multitâche. Ce n'est pas une partie du code de TacOS qui va être amené à changer souvent, et au final il ne tiens que sur une centaine de lignes de code. Cela reste cependant une partie complexe qu'il peut être bon de comprendre.
Le changement de contexte est un mecanisme clé dans l'execution et l'ordonnancement des tâches. Il permet d'une part, à partir de l'état d'exécution d'un processus (c'est à dire des valeurs de ses registres), restaurer son execution, tout en sauvegardant l'état d'exécution du processus courant. C'est entre ces deux étapes (sauvegarde, et restauration), qu l'on effectue l'ordonnancement.
Il doit permettre également de changer le niveau de privileges. En effet, l'ordonnanceur étant exécuté avec les privilèges du noyau (ring 0), le changement de contexte doit permettre aussi de repasser en privilege utilisateur (ring 3) que de rester en mode kernel si le processus à rétablir a été arrêté pendant un appel système.
- Solution Hardware proposée par Intel
Les architectures x86 disposent d'une solution permettant d'effectuer des changements de contexte de manière hardware (comprendre ici que c'est le processeur qui s'occupe lui même de la sauvegarde et de la restauration des états moyennant quelques instructions). Ce mécanisme s'appuis sur l'utilisation d'une structure appelée la "TSS". Pour chacun des processus, il faut fournir une TSS qui contiendra l'état du processus et servira à sa restauration.
Dans la pratique, cette méthode a pour impact de limiter physiquement le nombre maximum de processus exécutables, et s'avère laborieuse à mettre en place. En outre, cette solution est évidemment difficilement portable, car d'autre architectures ne disposent pas forcement de ce mécanisme.
- Solution logicielle
Cette solution est celle qui a été adopté la majorité des systèmes d'exploitation modernes. Il s'agit ici de sauvegarder et restaurer l'état d'exécution des processus de manière logicielle, et d'utiliser l'instruction IRET pour procéder au changement de privilège. Cette solution implique toujours l'utilisation de la TSS, mais une seule TSS par processeur est désormais nécessaire.
C'est la solution que nous avons choisi, et que nous allons expliquer par la suite.
Le principe du changement de contexte logiciel est de détourner fonctionnement des interruptions afin récupérer les informations à sauvegarder, et de modifier la suite de l'exécution.
Lors d'une interruption, plusieurs registres sont empilés par l'interruption elle même, et le reste est empilé par le wrapper d'interruption. On se retrouve donc avec une pile qui ressemble à cela: (insérer schéma)
Il est alors possible d'obtenir la « interruption frame » qui correspond aux registres empilés. Cette frame va notamment permettre de sauvegarder dans la structure du processus l'état des différents registres.
L'ordonnanceur sera ainsi être appelé depuis une interruption (ou une interruption simulée en empilant les registres manuellement).
Les registres pushés par l'interruption sont popés puis les registres sauvegardés dans la structure de processus du nouveau processus sont pushés à la place. Une fois ceci réalisé, il suffit de revenir de l'interruption avec un iret
, après avoir repopé tous les registres empilés.