<!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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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&nbsp;:</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é&nbsp;:</B> lundi 7 novembre 2005 
  20:21<BR><B>À&nbsp;:</B> Sos-Bounces<BR><B>Objet&nbsp;:</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>&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></BLOCKQUOTE></BODY></HTML>