<!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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Pile 
(SP courant)</FONT></SPAN></DIV>
<DIV><SPAN class=812583418-07112005><FONT face=Arial 
size=2>-Switch_count&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Nombre de 
changement de contexte</FONT></SPAN></DIV>
<DIV><SPAN class=812583418-07112005><FONT face=Arial 
size=2>-Prev&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Thread 
precedent</FONT></SPAN></DIV>
<DIV><SPAN class=812583418-07112005><FONT face=Arial 
size=2>-Next&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Thread&nbsp;&nbsp;suivant&nbsp; 
</FONT></SPAN></DIV>
<DIV><SPAN class=812583418-07112005><FONT face=Arial 
size=2></FONT></SPAN>&nbsp;</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>&nbsp;</DIV>
<DIV><SPAN class=812583418-07112005><FONT face=Arial size=2>-j'ai une procedure 
"create_thread" (C)&nbsp;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>&nbsp;</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"&nbsp;à 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>&nbsp;</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>&nbsp;</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>&nbsp;</DIV>
<DIV><SPAN class=812583418-07112005><FONT face=Arial 
size=2></FONT></SPAN>&nbsp;</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>&nbsp;</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>&nbsp;</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&nbsp;<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>&nbsp;</SPAN>)</FONT></SPAN></DIV>
<DIV><SPAN class=812583418-07112005><FONT face=Arial 
size=2></FONT></SPAN>&nbsp;</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.&nbsp; 
Enfin en gros le principe est la.</FONT></SPAN></DIV>
<DIV><SPAN class=812583418-07112005><FONT face=Arial 
size=2></FONT></SPAN>&nbsp;</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>&nbsp;</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>&nbsp;</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&nbsp; 
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>&nbsp;</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>&nbsp;</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>&nbsp;</DIV>
<DIV><SPAN class=812583418-07112005><FONT face=Arial 
size=2></FONT></SPAN>&nbsp;</DIV></SPAN></DIV></BODY></HTML>