[SOS] Traitement d'un "stack overflow"

anthoine.bourgeois anthoine.bourgeois at wanadoo.fr
Mer 14 Juin 09:39:48 CEST 2006


Salut,

> Oui, effectivement, j'avais remarqué ces erreurs. Elles sont toutes liées à 
> la récursivité de la fonction Toto().

Je t'envois un petit patch avec ce que j'ai fais sur
ta version dbf-sos9.5. J'ai rajouter un yield dans ta
fonction toto maintenant j'ai toujours un stack poisoning.
Je crois que les problème d'écrasement des données viennent
de là. Si tu mets pas de yield alors ton thread prend
toujours le processeur puisque les threads noyau ne sont pas
préemptible. Mais il se faisait intérrompre par l'irq0: le
timer. Donc soit il est assez rapide et il écrase tout sur
son passage jusqu'à tombé sur une page non mapper dans ce
cas il fait une double/triple faute, ou soit il se fait
intérrompre avant pas le timer et les vérifications de
la structure sos_thread sont fausses et on a une fatal
error.

Avec le yield, la détection du débordement se faisant
au changement de thread, donc a chaque appel récurssif a
toto, le débordement est détecté avant écrasement des données
arrête l'exécution.

> >Pour la double faute, 2 choses:
> >- le selecteur de segment dans le task desc doit être le
> >selecteur du tss et non des donnés du noyau.
J'ai oublié la deuxième choses, le tss doit être entièrement
initialisé pour un task gate.

> Je ne veux me servir de la tss de double fault que comme indication de 
> dépassement de pile. Je ne cherche pas à faire tourner le noyau avec.
> C'est pour ça que je ne comprends pas pourquoi je dois utiliser le sélecteur 
> de tss à la place du segment noyau dans les descripteurs de threads.

Pourtant tu es obligé de faire tourner le noyau avec à partir
du moment ou tu appeles ta task gate. C'est elle qui charge
ta tss.
La task gate prend le selecteur de segment qu'elle contient
et s'attend a ce que selecteur pointe sur un descripeur de
tss. Cette tss est alors chargé par le processeur
automatiquement. C'est du hardware task switching. Donc
le noyau tournera avec ta tss après ta double faute.

Bonne journée
Anthoine
-------------- section suivante --------------
Une pièce jointe non texte a été nettoyée...
Nom: /home/abourgeois/patch-stack-overflow.diff
Type: application/octet-stream
Taille: 4170 octets
Desc: non disponible
Url: http://the-doors.enix.org/pipermail/sos/attachments/20060614/0e76e845/patch-stack-overflow.obj


Plus d'informations sur la liste de diffusion Sos