[SOS] Traitement d'un "stack overflow"

Thomas Petazzoni thomas.petazzoni at enix.org
Mer 31 Mai 21:54:28 CEST 2006


Salut,

Le Wed, 31 May 2006 21:47:32 +0200,
"Cyril Dupuit" <cyrildupuit at hotmail.com> a écrit :

> J'ai donc créé un appel récursif dont le code est situé ci-dessous :

Ce serait plus simple si tu envoyais un patch pour une version donnée
de SOS.

> Ce que je ne comprends pas, c'est que normalement, j'aurai dû tomber
> dans l'exception de double défaut de page. Et en fait, la machine a
> rebouté. C'est étrange.
> 
> Pourquoi je n'arrive pas tomber dans cette exception ?

Parce que tu as fait un "triple fault". Le problème, c'est que dans
l'IDT de SOS, l'exception "Double Fault" utilise une "trap gate" ou une
"int gate", donc il n'y a pas changement de pile lors de la levée de
l'exception.

Du coup, il se passe la chose suivante:
 - tu bouffes toute la pile
 => Bing, page fault
 - le handler de page fault ne peut pas s'exécuter, car il faut de la
   pile pour ça
 => Bing, double fault
 - le handler de double fault ne peut pas s'exécuter, car il faut de la
   pile pour ça
 => Bing, triple fault, reboot.

La solution est d'utiliser une Task Gate pour l'exception "double
fault", et d'avoir un TSS qui correspond dans la GDT. Une "task gate"
permet d'avoir un changement de pile avant de passer dans le handler de
l'exception, et donc de gérer correctement le double fault.

Ceci est expliqué dans la partie 2) de
http://kos.enix.org/~d2/snapshots/kos_current/doc/kstack-html/

Bonne soirée,

Thomas
-- 
PETAZZONI Thomas - thomas.petazzoni at enix.org 
http://{thomas,sos,kos}.enix.org - Jabber: thomas.petazzoni at jabber.dk
http://{agenda,livret}dulibre.org - http://www.toulibre.org
Fingerprint : 0BE1 4CF3 CEA4 AC9D CC6E  1624 F653 CB30 98D3 F7A7
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
Url : http://the-doors.enix.org/pipermail/sos/attachments/20060531/d587a141/signature.pgp


Plus d'informations sur la liste de diffusion Sos