[SOS] Multi-Tasking - TSS

KAISER Edouard edouard.kaiser at gmail.com
Mer 14 Sep 17:53:09 CEST 2005


Re  :)

> [ Toujours un soucis avec le Reply-To positionné par GMail, cf
> http://linuxfr.org/~pterjan/17376.html pour la solution ]

Bon, je dois pas etre doué, mais je ne vois pas du tout dans les
parametres comment mettre ce champ par defaut comme il indique :/ Si
quelqun sait je suis preneur.
 
> Non, ce n'est pas obligatoire dans une LDT, d'après mes souvenirs. À
> vérifier dans la doc Intel.

Effectivement, je viens de regarder la doc Intel, c'est valable que pour la GDT.

> Dans un premier temps, pour faire un thread noyau, une simple
> fonction de ton noyau suffirait. Ça simplifierait la chose (il faut
> toujours chercher à simplifier au maximum pour trouver la source d'un
> problème, afin de résoudre chaque problème séparement sans essayer de
> s'attaquer à un machin monstrueusement complexe).

En effet, mais bon la mise en place et l'adaptation de vos sources n'a
pas été trés dur et les résultats & valeurs semblent correct.
Cependant je ne peux pas encore verifier tout cela car il faudrait que
j'arrive à changer CS & EIP pour voir si j'ai bien tout mis à la bonne
place, et donc si l'execution donne ce qu'il faudrait...

> Cette séquence me semble étrange. Pourquoi as-tu besoin de changer ds, es,
> fs, gs, alors qu'ils sont présents dans le TSS, et donc censés être modifiés. >automagiquement par le processeur au moment du changement de contexte ?

En effet, c'est moi qui fait une connerie, un simple ljmp $0x30,$0x18 suffit.

> As-tu regardé dans le source de Bochs de quel CS il s'agissait ? Du CS
> courant, du CS du TSS, d'autre chose ?

J'ai regardé, et tout ce trouve dans le fichier cpu/tasking.cc

Extrait de Bochs :
//
// Step 13: Load the new task (dynamic) state from new TSS.
//          Any errors associated with loading and qualification of
//          segment descriptors in this step occur in the new task's
//          context.  State loaded here includes LDTR, CR3,
//          EFLAGS, EIP, general purpose registers, and segment
//          descriptor parts of the segment registers.
//

J'en deduit que le probleme se trouve dans le nouveau TSS a mettre en
place si mon anglais est bon.
Les premiers tests effecutees par bochs sont ceux de la LDT, ils
semblent se passer sans probleme vu que je n'ai aucune erreur dans la
console.
Par contre effectivement, c'est dans le test de CS qu'il m'envoit bouler.

Extrait de Bochs :
 // CS descriptor AR byte must indicate code segment else #TS(CS)
614     if (cs_descriptor.valid==0 || cs_descriptor.segment==0 ||
615         cs_descriptor.u.segment.executable==0) {
616       BX_PANIC(("task_switch: CS not valid executable seg"));
617       exception_no = BX_TS_EXCEPTION;
618       error_code   = raw_cs_selector & 0xfffc;
619       goto post_exception;
620       }
621     // if non-conforming then DPL must equal selector RPL else #TS(CS)
622     else if (cs_descriptor.u.segment.c_ed==0 &&
623         cs_descriptor.dpl!=cs_selector.rpl) {
624       BX_INFO(("task_switch: non-conforming: CS.dpl!=CS.RPL"));
625       exception_no = BX_TS_EXCEPTION;
626       error_code   = raw_cs_selector & 0xfffc;
627       goto post_exception;
628       }
629     // if conforming then DPL must be <= selector RPL else #TS(CS)
630     else if (cs_descriptor.u.segment.c_ed &&
631         cs_descriptor.dpl>cs_selector.rpl) {
632       BX_INFO(("task_switch: conforming: CS.dpl>RPL"));
633       exception_no = BX_TS_EXCEPTION;
634       error_code   = raw_cs_selector & 0xfffc;
635       goto post_exception;
636       }
637     // Code segment is present in memory, else #NP(new code segment)
638     else if (cs_descriptor.p==0) {
639       BX_PANIC(("task_switch: CS.p==0"));
640       exception_no = BX_NP_EXCEPTION;
641       error_code   = raw_cs_selector & 0xfffc;
642       goto post_exception;
643       }
644     // All checks pass, fill in shadow cache
645     BX_CPU_THIS_PTR sregs[BX_SEG_REG_CS].cache    = cs_descriptor;
646     }
647   else {
648     // If new cs selector is null #TS(CS)
649     BX_PANIC(("task_switch: CS NULL"));
650     exception_no = BX_TS_EXCEPTION;
651     error_code   = raw_cs_selector & 0xfffc;
652     goto post_exception;
653     }

Bingo, je me tape le tape Bochs panic, ligne 649...
Mais je ne comprends pas lol
Si je comprends bien, c'est la valeur du nouveau CS dans le TSS qui
est a null, or j'ai pourtant initialise ce TSS !!

> Envoie _toujours_ le code ;-) Ou plutôt, place un tarball propre quelque
> part, et donne un lien sur la liste. Parce que là, juste avec tes
> informations (même si elles sont très détaillées), on ne peut guère que
> tenter de faire marcher /dev/bouledecristal, dont les résultats sont
> généralement pas exceptionnels.

Prochain message j'essaye de vous mettre a disposition le code de la
manière la plus simple possible et juste ce dont vous avez besoins
pour pas trop se prendre la tete.
Merci !
-- 
KAISER Edouard.
Wiki-Blog : http://kaiser.edouard.free.fr/
BesOS : http://besos.mtp.epsi.fr/


Plus d'informations sur la liste de diffusion Sos