La table des interrupts est gérée dans libs/bootlib/interrupt_base.hpp
et libs/bootlib/interrupt_base.cpp
. On fournit une fonction Interrupt::setup_handler()
qui remplit la structure InterruptDescriptor
spécifique à l'architecture x86-64
.
Un minimum de code assembleur est nécessaire pour sauvegarder le contexte utilisateur. Vu le grand nombre d'interrupts (et donc de handler wrappers), ce code est généré automatiquement par kernel/auto_src/handlers.py
. Il se charge de pousser les registres sur la pile et d'appeler le handler correspondant, puis de restaurer les registres (en pratique, la plupart du temps, cela passe par le scheduler
).
Un handler wrapper par défaut (et un handler par défaut) est mis en place pour les interrupts non gérés.
Les fichiers kernel/src/pic.hpp
et kernel/src/pic.cpp
interagissent avec la PIC, la puce qui s'occupe des interrupts hardware. La communication est effectuée par les ports I/O du processeur.
Les interrupts claviers, produits par le PIC, signalent qu'il faut aller lire la touche dans un port I/O spécifique. Un état (KbdState
) maintient en mémoire l'ensemble des touches enfoncées, ce qui permet en particulier de gérer les modificateurs Alt
, Shift
... Ceux-ci sont représentés par des bits au-delà du 8ème, Keyboard
renvoie ainsi des entiers 16
bits qui sont ensuite gérés par le window_manager
.
Un modificateur particulier Ext
est utilisé pour les touches pour lesquelles le clavier envoie 2 keycodes, comme Mod4
ou les flèches.
Pour le mappage des touches vers les symboles selon le layout qwerty/azerty, on utilise une structure qui stocke une chaîne de caractères (une pour chaque keycode, caractère null lorsque le caractère n'est pas géré). Une deuxième chaîne est utilisée pour Shift
, une troisième pour AltGr
en azerty.
Nous avons implémentés des messages d'erreur pour chaque exception.
Deux d'entre elles nécessitent un traitement particulier : Page Fault (PF) et Double Fault (DF) utilise une stack alternative, spécifiée à setup_handler()
, pour pouvoir gérer un éventuel stack overflow.