[SOS] Traitement d'un "stack overflow"

Cyril Dupuit cyrildupuit at hotmail.com
Mer 31 Mai 21:47:32 CEST 2006


Salut !

>Bin là , juste avec ce que tu dis ("blocage"), Ca me paraît difficile
>de t'aider. Peux-tu en dire plus ? Et notamment mettre en ligne une
>version compilable de ton code qui montre le problème que tu
>rencontres ?

Ce que j'appelle un « blocage » (et non un « bloquage », désolé) sous Qemu, 
c'est que la fenêtre dans laquelle l'émulation tourne est bloquée, elle ne 
répond pas aux événements de la sourie.

Lorsque cette même application tourne sur un vrai PC, il reboot ! Suite à un 
double défaut de page.

>Sinon, si tu regardes le début de notre document, tu verras que nous
>n'utilisons en fait pas cette technique. En effet, nous sommes (pour
>l'instant) restés sur un échec au niveau de cette méthode. Nous avions
>un cas où nous risquions de perdre une interruption (ce qui est grave),
>nous avons donc abandonné cette méthode, et utilisons dans KOS des
>piles de taille fixe en mode noyau.

Le fait que cette méthode perde des interruptions ne me dérange pas du tout. 
Je voulais me servir de cette exception comme indicateur de débordement de 
pile (juste pour faire du débogage).

J'ai donc essayé de voir le résultat d'un débordement de pile sous SOS 
(juste pour voir si vous obteniez le symptôme du reboot).

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

int I = 0;

void Toto(void)
{
        char Tab[60] = "Message a afficher !";
        I = ((I + 1) % 20);
        sos_x86_videomem_printf(I, 0, SOS_X86_VIDEO_FG_YELLOW | 
SOS_X86_VIDEO_BG_BLUE, "Toto  %d %s ", I, Tab);
        Toto();
}
Cette procédure est appelée par le thread de repos :

static void idle_thread(void* unused)
{
  sos_ui32_t idle_twiddle = 0;

  while (1)
    {
      Toto();
    }
}

Le main du noyau a été modifié pour n'exécuter que le code nécessaire au 
crash. C'est à dire que l'appel à sos_process_subsystem_setup() à été 
supprimé.

Par la suite j'ai exécuté le code dans Qému et ... Blocage de Qému.

Afin d'être sûr de mon coup, j'ai lancé le code sur une machine réelle. Et 
là, la machine a rebouté.

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 ?

Merci encore.

Cyril




Plus d'informations sur la liste de diffusion Sos