Bonjour,
Je suis actuellement en train de developper un micro-kernel en x86 et je bute sur un point. En effet, j'essaye de gérer les exceptions ( exemple : division par 0 ) mais je n'arrive pas à passer outre.
Je m'explique, je crée une fonction qui effectue une division par 0 :
Celle ci entraine l'execution du fonction assembleur qui push l'exception sur la stack, puis d'un context save qui sauve tout les parametres et appele ma gestion d'exception :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 int divide_zero_test() { int x = 3; int y = 0; int z = 51; printf("Ca rentre \n"); z = x / y; printf("Ca sort \n"); return z; }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 isr_0: cli push $0 jmp ctxt_save ctxt_save: mov (%esp), %eax pusha pushf push %eax call arch_handler pop %eax popf popa add $4, %esp sti iretMon probleme est que, si je declenche l'interruption par du code asm : asm volatile ("int $0"); cela marche parfaitement mais lors que je declenche l'exception par la fonction divide_per_zero, le message d'erreure apparait comme une boucle infinie.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 void arch_handler(t_uint32 id) { if (id == 0) { printf("Divide error\n"); return; }
Il m'est apparu grace a gdb et la commande disass, que le registre esp pointait ( a la fin de la fonction ctxt_save sur la ligne assembleur effectuant la division et non pas sur l'instruction suivante ! Cela creant donc une exception a l'infinie.
Ma question est donc, comment sortir de cette "boucle" infinie ? Et pourquoi ce code marche lors d'une exception lancée "en dur" et pas lors du declenchement par une fonction C?
En esperant avoir été claire, je vous remercie d'avance pour vos réponses et vous souhaite une bonne soirée
Partager