<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
<TITLE>Message</TITLE>
<META content="MSHTML 6.00.2900.2769" name=GENERATOR></HEAD>
<BODY>
<DIV><SPAN class=937221919-07112005>
<DIV><SPAN class=812583418-07112005><FONT face=Arial
size=2>Salut,</FONT></SPAN></DIV>
<DIV><SPAN class=812583418-07112005><FONT face=Arial
size=2></FONT></SPAN> </DIV>
<DIV><SPAN class=812583418-07112005><FONT face=Arial size=2>Edouard: je creer
une nouvelle file pour ce sujet...</FONT></SPAN></DIV>
<DIV><SPAN class=812583418-07112005><FONT face=Arial
size=2></FONT></SPAN> </DIV>
<DIV><SPAN class=812583418-07112005><FONT face=Arial size=2>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".</FONT></SPAN></DIV>
<DIV><SPAN class=812583418-07112005><FONT face=Arial size=2>j'en suis au debut,
j'essaye de faire un "round robin" sur 2 threads.</FONT></SPAN></DIV>
<DIV><SPAN class=812583418-07112005><FONT face=Arial
size=2></FONT></SPAN> </DIV>
<DIV><SPAN class=812583418-07112005><FONT face=Arial size=2>Voici le principe
que j'essaye de mettre en place:</FONT></SPAN></DIV>
<DIV><SPAN class=812583418-07112005><FONT face=Arial
size=2></FONT></SPAN> </DIV>
<DIV><SPAN class=812583418-07112005><FONT face=Arial size=2>-j'ai une structure
"thread" définie ainsi en simplifié:</FONT></SPAN></DIV>
<DIV><SPAN class=812583418-07112005><FONT face=Arial
size=2>-Stack //Pile
(SP courant)</FONT></SPAN></DIV>
<DIV><SPAN class=812583418-07112005><FONT face=Arial
size=2>-Switch_count //Nombre de
changement de contexte</FONT></SPAN></DIV>
<DIV><SPAN class=812583418-07112005><FONT face=Arial
size=2>-Prev //Thread
precedent</FONT></SPAN></DIV>
<DIV><SPAN class=812583418-07112005><FONT face=Arial
size=2>-Next //Thread suivant
</FONT></SPAN></DIV>
<DIV><SPAN class=812583418-07112005><FONT face=Arial
size=2></FONT></SPAN> </DIV>
<DIV><SPAN class=812583418-07112005><FONT face=Arial size=2>-j'ai une liste de
thread (circulaire, doublement chainée) et son compteur associé
"thread_list"</FONT></SPAN></DIV>
<DIV><SPAN class=812583418-07112005><FONT face=Arial
size=2></FONT></SPAN> </DIV>
<DIV><SPAN class=812583418-07112005><FONT face=Arial size=2>-j'ai une procedure
"create_thread" (C) qui se charge d'allouer le descripteur (la structure
thread) et d'allouer la pile ( kmalloc ;) ).</FONT></SPAN></DIV>
<DIV><SPAN class=812583418-07112005><FONT face=Arial size=2>Cette fonction cree
alors sur cette pile un "context" d'initialisation du thread. (registres,
pointeur de la fonction, retour, etc...)</FONT></SPAN></DIV>
<DIV><SPAN class=812583418-07112005><FONT face=Arial size=2>(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)
).</FONT></SPAN></DIV>
<DIV><SPAN class=812583418-07112005><FONT face=Arial size=2>Le thread crée est
alors placé en queue de la liste "thread_list"</FONT></SPAN></DIV>
<DIV><SPAN class=812583418-07112005><FONT face=Arial
size=2></FONT></SPAN> </DIV>
<DIV><SPAN class=812583418-07112005><FONT face=Arial size=2>-j'ai une fonction
"load_context" (ASM) qui charge le context depuis la pile du thread courant (en
tete de liste_thread)</FONT></SPAN></DIV>
<DIV><SPAN class=812583418-07112005><FONT face=Arial size=2>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 !</FONT></SPAN></DIV>
<DIV><SPAN class=812583418-07112005><FONT face=Arial size=2>(le EIP est
l'adresse de la fonction du thread)</FONT></SPAN></DIV>
<DIV><SPAN class=812583418-07112005><FONT face=Arial
size=2></FONT></SPAN> </DIV>
<DIV><SPAN class=812583418-07112005><FONT face=Arial size=2>-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.</FONT></SPAN></DIV>
<DIV><SPAN class=812583418-07112005><FONT face=Arial
size=2></FONT></SPAN> </DIV>
<DIV><SPAN class=812583418-07112005><FONT face=Arial size=2>-j'ai une fonction
"shedule" qui, si besoin, "pop_head" le thread de la liste et le "add_tail" puis
appelle "switch_context"</FONT></SPAN></DIV>
<DIV><SPAN class=812583418-07112005><FONT face=Arial size=2>Cette fonction est
appellé a intervale de temps régulié sur IRQ 0.</FONT></SPAN></DIV>
<DIV><SPAN class=812583418-07112005><FONT face=Arial
size=2></FONT></SPAN> </DIV>
<DIV><SPAN class=812583418-07112005><FONT face=Arial
size=2></FONT></SPAN> </DIV>
<DIV><FONT face=Arial><FONT size=2><SPAN class=812583418-07112005>A
l'initialisation je creer 2 threads pour le test: </SPAN><SPAN
class=812583418-07112005>Idle et </SPAN><SPAN class=812583418-07112005>Sys (2
descripteurs + 2 piles + 2 fonctions)</SPAN></FONT></FONT></DIV>
<DIV><SPAN class=812583418-07112005><FONT face=Arial size=2>Chacun affiche en
boucle son nom et un retour chariot avec le nombre
d'itérations</FONT></SPAN></DIV>
<DIV><SPAN class=812583418-07112005><FONT face=Arial size=2>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...</FONT></SPAN></DIV>
<DIV><SPAN class=812583418-07112005><FONT face=Arial
size=2></FONT></SPAN> </DIV>
<DIV><SPAN class=812583418-07112005><FONT face=Arial size=2>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...</FONT></SPAN></DIV>
<DIV><SPAN class=812583418-07112005><FONT face=Arial
size=2></FONT></SPAN> </DIV>
<DIV><SPAN class=812583418-07112005><FONT face=Arial size=2>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.</FONT></SPAN></DIV>
<DIV><SPAN class=812583418-07112005><FONT face=Arial size=2>durant le iret on
pop n'importe quoi en CS, EEFLAG et EIP</FONT></SPAN></DIV>
<DIV><SPAN class=812583418-07112005><FONT face=Arial size=2>(cf:
screen <SPAN class=937221919-07112005>ici: <A
href="http://www.hexanium.com/hexanium/images/multitask_exception.jpg">http://www.hexanium.com/hexanium/images/multitask_exception.jpg</A> </SPAN>)</FONT></SPAN></DIV>
<DIV><SPAN class=812583418-07112005><FONT face=Arial
size=2></FONT></SPAN> </DIV>
<DIV><SPAN class=812583418-07112005><FONT face=Arial size=2>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.</FONT></SPAN></DIV>
<DIV><SPAN class=812583418-07112005><FONT face=Arial
size=2></FONT></SPAN> </DIV>
<DIV><SPAN class=812583418-07112005><FONT face=Arial size=2>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).</FONT></SPAN></DIV>
<DIV><SPAN class=812583418-07112005><FONT face=Arial size=2>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 !</FONT></SPAN></DIV>
<DIV><SPAN class=812583418-07112005><FONT face=Arial
size=2></FONT></SPAN> </DIV>
<DIV><SPAN class=812583418-07112005><FONT face=Arial size=2>Je me pose une
question bête, est ce que le TSS est obligatoire ou est ce utile seulement pour
le HardTaskSwitch ?</FONT></SPAN></DIV>
<DIV><SPAN class=812583418-07112005><FONT face=Arial
size=2></FONT></SPAN> </DIV>
<DIV><SPAN class=812583418-07112005><FONT face=Arial size=2>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 ?</FONT></SPAN></DIV>
<DIV><FONT face=Arial><FONT size=2><SPAN class=812583418-07112005>Cela
m'intéraisse... </SPAN><SPAN class=812583418-07112005>y'a peut etre pas que moi
d'ailleur...</SPAN></FONT></FONT></DIV>
<DIV><SPAN class=812583418-07112005><FONT face=Arial
size=2></FONT></SPAN> </DIV>
<DIV><SPAN class=812583418-07112005><FONT face=Arial
size=2>A++</FONT></SPAN></DIV>
<DIV><SPAN class=812583418-07112005><FONT face=Arial
size=2></FONT></SPAN> </DIV>
<DIV><SPAN class=812583418-07112005><FONT face=Arial
size=2>Romain</FONT></SPAN></DIV>
<DIV><SPAN class=812583418-07112005><FONT face=Arial
size=2></FONT></SPAN> </DIV>
<DIV><SPAN class=812583418-07112005><FONT face=Arial
size=2></FONT></SPAN> </DIV></SPAN></DIV></BODY></HTML>