[SOS] Problème avec l'appel des handlers d'interruptions

Nicolas Martyanoff khaelin at gmail.com
Sam 30 Sep 12:33:39 CEST 2006


Bonjour,

Bloqué depuis plusieurs jours sur un problèmes des plus déconcertant,
je m'en viens vous demander un coup de main.

J''ai enfin terminé l'article 1, avec une console vga défilante qui me
permet d'afficher le boot process, ça fait drôlement plaisir quand ça
fonctionne. J'ai commencé l'article 2 avec pas mal d'enthousiasme. J'ai
donc implémenté la gestion de la GDT (oui, je l'avoue, j'ai pompé la
quasi totalité de votre code, même si je met un point d'honneur à ne
rien copier/coller, et à tout recopier en modifiant deux trois bidules
histoire de retenir un minimum), des exceptions, des irq, et le
micro-controleur i8259.

Tout content (compile et se lance impec'), j'ajoute un fonction pour
gérer une exception divide by zero, et la provoque. Et là, surprise,
freeze de qemu. Avec bochs, il m'indique l'erreur suivante:

00023337025e[CPU0 ] exception(): 3rd (13) exception with no resolution,
shutdown status is 00h, resetting

Donc une General Protection fault, et aucun handler appelé. j'ai
rajouté un handler pour les double fault (j'ai viré les quelques lignes
d'assembleur de sos qui gère directement la df par pure curiosité), et
pour les general protection fault, en affichant un message (e9 + vga) à
chaque fois, et rien ne s'affiche. Mes handlers ne sont donc jamais
appelés. En lisant la doc intel, j'ai remarqué ceci:

«If a vector references a descriptor beyond the limit of the IDT, a
general-protection exception (#GP) is generated» (Volume 3A 5-12).
Or, d'après cette même doc, divide error + gp = double fault, ce qui
finit en triple fault puisque le handler de double fault semble ne pas
être trouvé, ce qui mène à une autre gp (avec un peu de pot mon
interprétation est bonne).

Mais j'ai beau cherché, pas moyen de trouvé d'où ça peut venir.

Autre interrogation, la macro qui désactive les interruptions:

#define OSB_DISABLE_IRQ(flags) \
   { OSB_SAVE_FLAGS(flags); asm("cli\n"); }

Utilise cli, or votre macro qui restaure les interruptions n'utilise
pas sti pour les restaurer. j'ai essayé de faire ceci:

#define OSB_RESTORE_IRQ(flags) \
   { OSB_RESTORE_FLAGS(flags); asm("sti\n"); } 

Mais cela ne change rien. J'ai également essayé sans, et mêmes
symptômes.

Si quelqu'un pouvait avoir la bonté de me dire quelle bêtise j'ai
faite, ça me permettrait de continuer :)

J'ai uploadé mes sources ici:
http://terresdelarmes.free.fr/osb/osb.tar.gz

Au cas où mes explications seraient insuffisantes pour comprendre ce
qui ne va pas.

J'en profite pour rajouter deux petites questions d'archi:

- SoS traite séparément exceptions et IRQ, or le code est presque
identique (un peu normal, les deux sont des interruptions). Pourquoi ne
pas avoir factorisé cette gestion ? Je n'ai pas encore les idées
claires concernant l'archi d'un OS, attendant d'avoir terminé les
articles SOS pour recommencer en innovant, mais ça me parait un peu
«cradingue» (n'y voyez pas une critique, juste une question :));

- Le système wrappers/handlers pour les interruptions à l'avantage
d'être propre, mais si j'ai bien compris, on perd le code erreur de
certaines exceptions qui est dégagé par les routines assemblers, non ?
En réalité, je ne comprend pas vraiment l'intérêt d'avoir des handlers
configurables, il m'aurait paru plus simple de coder directement une
fonction par interruption, ce qui aurait évité le code asm (qui utilise
des macros gas, ce qui est moyen pour la portabilité (objectif
personnel, avoir un OS, y coder un compilateur/assembleur/linker maison
qui puisse recompiler l'OS en question, oui je sais je suis un
malade :p) et aurait peut-être était plus propre. De plus, ça ne change
que peu de chose, car il faudra de tte manière un handler pour à peu
près toutes les interruptions.

Enfin, voilà le roman du jour, si vous êtes arrivé ici, merci de
m'avoir lu jusqu'au bout !

Amicalement,

-- 
+-----------------------------+
| Nicolas 'galdor' Martyanoff |
|  khaelin at gmail.com          |
|  galdor at jabber.org          |
+-----------------------------+


Plus d'informations sur la liste de diffusion Sos