[SOS] Soft/Hard Task switching...

Romain LABBE labbe.romain at wanadoo.fr
Lun 7 Nov 20:21:09 CET 2005


Salut,
 
Edouard: je creer une nouvelle file pour ce sujet...
 
Je n'utilise pas le segment TSS (je ne sais meme pas comment il marche
en fait). je crois que j'essaye de faire du "soft task switching".
j'en suis au debut, j'essaye de faire un "round robin" sur 2 threads.
 
Voici le principe que j'essaye de mettre en place:
 
-j'ai une structure "thread" définie ainsi en simplifié:
-Stack                   //Pile (SP courant)
-Switch_count        //Nombre de changement de contexte
-Prev                     //Thread precedent
-Next                    //Thread  suivant  
 
-j'ai une liste de thread (circulaire, doublement chainée) et son
compteur associé "thread_list"
 
-j'ai une procedure "create_thread" (C) qui se charge d'allouer le
descripteur (la structure thread) et d'allouer la pile ( kmalloc ;) ).
Cette fonction cree alors sur cette pile un "context" d'initialisation
du thread. (registres, pointeur de la fonction, retour, etc...)
(A ce sujet l'article sr la pile de SOS est tres intéraissant et
explique bien l'agencement (les parametres passés et l'agencement iret
est important) ).
Le thread crée est alors placé en queue de la liste "thread_list"
 
-j'ai une fonction "load_context" (ASM) qui charge le context depuis la
pile du thread courant (en tete de liste_thread)
Cette fonction "pop" les valeurs des registres depuis la pile et
effectue un iret ! Tous se cache dans le iret et l'etat de la pile à ce
moment la. si au moment de l'iret l'adresse qui est sur la pile est
l'adresse d'une fonction on "retournera" à cette fonction (que ce soit
l'appellant ou non ;) ) (sur le principe des interruptions c'est la
fonction create_thread qui "push" le EEFLAG, le CS et le EIP, j'ai mis
un moment à piger perso !
(le EIP est l'adresse de la fonction du thread)
 
-j'ai une fonction "switch_context" (ASM) qui empile le contexte
courant, sauvgarde le SP de la pile courante dans le thread courant,
charge ensuite la pile du prochaine thread et "pop" alors le contexte
(phase identique à load_context). on fait de meme un iret et hop on se
retrouve dans la nouvelle tache.
 
-j'ai une fonction "shedule" qui, si besoin, "pop_head" le thread de la
liste et le "add_tail" puis appelle "switch_context"
Cette fonction est appellé a intervale de temps régulié sur IRQ 0.
 
 
A l'initialisation je creer 2 threads pour le test: Idle et Sys (2
descripteurs + 2 piles + 2 fonctions)
Chacun affiche en boucle son nom et un retour chariot avec le nombre
d'itérations
On active les interruptions et on "load_context" ce qui à pour effet de
charger le contexte depuis la pile de Idle et donc on se retrouve dans
la fonction Idle, cool...ca marche...
 
Ensuite survient une IRQ0, on appelle le switch le contexte de Idle est
bien empilé sur sa pile (vérifié au debubug), on change bien de pile,
vers Sys, on charge bien le conexte de sys et la ca marche aussi on est
dans sys...hip ha...
 
Puis resurvient une IRQ0 et la ca crache, "Erreur de protection
générale", en effet, j'ai matté la pile et elle n'a rien a voir avec ce
qu'elle devrait etre.
durant le iret on pop n'importe quoi en CS, EEFLAG et EIP
(cf: screen ici:
http://www.hexanium.com/hexanium/images/multitask_exception.jpg )
 
Bref, je dois avoir laisser passé quelque chose, je retrovue sur la pile
les adresses de retour de fonctions que je ne devrais pas retouver la,
bref pas facile a debugger.  Enfin en gros le principe est la.
 
La dessus je me demande, si il y'a IRQ 0 on à donc empilement du
contexte, puis scheludage (donc re empilement, changment de pile et
depopage).
Donc en fait on ne retourne jamais du vecteur d'interruption ! Enfin pas
dans mon principe, du coup je dois saturer la pile, ou... y'a encore du
boulot quoi !
 
Je me pose une question bête, est ce que le TSS est obligatoire ou est
ce utile seulement pour le HardTaskSwitch ?
 
Edouard, sur ton site j'ai vu que tu avais implémenté un scheduler, peux
tu en parler ? Expliquer un peu le principe ? Apparament c'est du
HardSwitch ?
Cela  m'intéraisse... y'a peut etre pas que moi d'ailleur...
 
A++
 
Romain
 
 
-------------- section suivante --------------
Une pièce jointe HTML a été enlevée...
URL: http://the-doors.enix.org/pipermail/sos/attachments/20051107/d0a123f3/attachment.html


Plus d'informations sur la liste de diffusion Sos