<!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=812174900-08112005><FONT face=Arial color=#0000ff
size=2>Salut,</FONT></SPAN></DIV>
<DIV><SPAN class=812174900-08112005><FONT face=Arial color=#0000ff
size=2></FONT></SPAN> </DIV>
<DIV><SPAN class=812174900-08112005><FONT face=Arial color=#0000ff size=2>je
peux pas m'empecher de venir crier un grand "hip ha" ici, j'ai reussi à faire
marcher mes 2 threads ensemble ! Cooool....</FONT></SPAN></DIV>
<DIV><SPAN class=812174900-08112005><FONT face=Arial color=#0000ff
size=2></FONT></SPAN> </DIV>
<DIV><SPAN class=812174900-08112005><FONT face=Arial color=#0000ff size=2>En
fait j'ai modifier legerement mon code, en fait je ne sais pas pkoi je n'y ai
pas pensé avant.</FONT></SPAN></DIV>
<DIV><SPAN class=812174900-08112005><FONT face=Arial color=#0000ff size=2>Au
lieu que la methode "schedule" appelle directement "switch_context", elle fait
un int 0x40 par exemple. Le vecteur 0x40 à été affecté préalablement à
"switch_context"... et du coup cela resoud le probleme du iret et des "bouts"
qui manquaient. Il y'avait aussi un probleme pour récupérer le pointeur de
pile.</FONT></SPAN></DIV>
<DIV><SPAN class=812174900-08112005><FONT face=Arial color=#0000ff
size=2></FONT></SPAN> </DIV>
<DIV><SPAN class=812174900-08112005><FONT face=Arial color=#0000ff size=2>Hip
ha...</FONT></SPAN></DIV>
<DIV><SPAN class=812174900-08112005><FONT face=Arial color=#0000ff size=2><A
href="http://www.hexanium.com/hexanium/images/multitask_justok.jpg">http://www.hexanium.com/hexanium/images/multitask_justok.jpg</A></FONT></SPAN></DIV>
<DIV><SPAN class=812174900-08112005><FONT face=Arial color=#0000ff
size=2></FONT></SPAN> </DIV>
<DIV><SPAN class=812174900-08112005><FONT face=Arial color=#0000ff
size=2>Question:</FONT></SPAN></DIV>
<DIV><SPAN class=812174900-08112005><FONT face=Arial color=#0000ff
size=2>--------------</FONT></SPAN></DIV>
<DIV><SPAN class=812174900-08112005><FONT face=Arial color=#0000ff size=2>Suis
je obligé d'utiliser le TSS ? enfin en 3 mots comment le situer dans un systeme
?</FONT></SPAN></DIV>
<DIV><SPAN class=812174900-08112005><FONT face=Arial color=#0000ff
size=2></FONT></SPAN> </DIV>
<DIV><SPAN class=812174900-08112005><FONT face=Arial color=#0000ff
size=2>A++</FONT></SPAN></DIV>
<DIV><SPAN class=812174900-08112005><FONT face=Arial color=#0000ff
size=2></FONT></SPAN> </DIV>
<DIV><SPAN class=812174900-08112005><FONT face=Arial color=#0000ff
size=2>Romain</FONT></SPAN></DIV>
<BLOCKQUOTE dir=ltr
style="PADDING-LEFT: 5px; MARGIN-LEFT: 5px; BORDER-LEFT: #0000ff 2px solid; MARGIN-RIGHT: 0px">
<DIV></DIV>
<DIV class=OutlookMessageHeader lang=fr dir=ltr align=left><FONT face=Tahoma
size=2>-----Message d'origine-----<BR><B>De :</B>
sos-bounces@the-doors.enix.org [mailto:sos-bounces@the-doors.enix.org] <B>De
la part de</B> Romain LABBE<BR><B>Envoyé :</B> lundi 7 novembre 2005
20:21<BR><B>À :</B> Sos-Bounces<BR><B>Objet :</B> [SOS] Soft/Hard
Task switching...<BR><BR></FONT></DIV>
<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></BLOCKQUOTE></BODY></HTML>