[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